2010-11-01 8 views
0

J'ai une telle exigence. Il y a un objet métier principal, l'utilisateur a et l'utilisateur b, et l'administrateur. L'utilisateur a ou b peut créer/mettre à jour/supprimer son propre objet métier. Et l'utilisateur a ne peut pas modifier l'objet métier de l'utilisateur b. L'administrateur peut tout faire. Et l'objet métier a un statut, dans certains états, même l'utilisateur propriétaire ne peut pas le modifier. Je veux assurer ceci par la sécurité de ressort. Mais il semble pouvoir le réaliser juste par la sécurité basée par rôle. Je pense que je dois utiliser l'électeur de printemps, mais je ne sais pas comment configurer. Est-ce que quelqu'un peut fournir du code ou me donner des suggestions?Comment utiliser spring security3.0.3 pour sécuriser une telle logique métier?

Merci d'avance.

Répondre

0

Spring Security 3 prend en charge l'annotation @PreAuthorize qui vous permet d'exprimer la logique d'autorisation Spring Expression Language, comme ceci:

public class BusinessService { 
    @PreAuthorize("hasRole('ADMINISTRATOR') or " + 
     "(#o.status != 'someStatus' and hasRole('USER') and #o.ownerName == principal.name)") 
    public void updateBusinessObject(BusinessObject o) { 
     ... 
    } 
} 

Et vous avez besoin <security:global-method-security pre-post-annotations="enabled"/> d'appliquer les aspects de la sécurité.

Si l'expression est trop complexe à représenter dans Spring Expression Language, vous pouvez déplacer une partie de la logique vers le code Java en ajoutant des variables personnalisées dans EvaluationContext (en personnalisant MethodSecurityExpressionHandler).

Notez, cependant, que vous devez compiler votre code en mode débogage afin d'utiliser les arguments de méthode dans l'expression.

Voir aussi:

+0

Merci, ce serait great.But je cette @PreAuthorize ("hasRole ('ROLE_ADMIN') ou (# task.status <3 et hasRole ('ROLE_USER')) "). Cela n'a pas fonctionné. Je me connecte en tant que propriétaire de la tâche, le statut de la tâche == 3, mais je peux encore améliorer cette tâche – Tom

+0

@Tom: Assurez-vous que l'aspect de sécurité est correctement appliqué. – axtavt

+0

@Tom: Notez également que, puisque cette approche utilise Spring AOP, elle ne fonctionne que pour les appels provenant de l'extérieur de votre classe. – axtavt