2009-12-17 9 views
6

Je souhaite utiliser Spring Security pour gérer les utilisateurs, les groupes et les autorisations. Je veux utiliser ACL pour sécuriser mes objets de domaine mais je ne trouve pas un moyen d'assigner un groupe à un acl. Par exemple: J'ai des utilisateurs et des groupes. Chaque groupe peut avoir les titres suivants: - gérer des forums (peut être un rôle comme ROLE_FORUM_MANAGER) - éditer un forum spécifique (acl sur le forum spécifique).Group and acl on Spring Security

En outre, les groupes sont définis par les utilisateurs qui ont le rôle ROLE_PERMISSION_MANAGER. MAIS tous les groupes définis par cet utilisateur ne peuvent être édités et gérés que par cet utilisateur. Donc le groupe est attaché à un utilisateur. Exactement, imaginez que l'utilisateur crée un groupe google: cet utilisateur peut gérer des groupes de droits uniquement pour le groupe qu'il a créé. Et ainsi, il peut créer un groupe pour gérer un forum spécifique de son propre groupe google.

Comment puis-je le faire?

J'ai lu la documentation de sécurité du printemps et les tutoriels suivants (alors s'il vous plaît ne me renvoie pas à ces liens): http://grzegorzborkowski.blogspot.com/2008/10/spring-security-acl-very-basic-tutorial.html http://blog.denksoft.com/?page_id=20

Répondre

14

Vérifiez Spring Security 3.0, vous pourriez être en mesure d'éviter l'utilisation du langage ACL en utilisant le langage d'expression Spring.

Par exemple, pour l'édition d'un forum, vous auriez une méthode sécurisée comme ceci:

@PreAuthorize("hasRole('ROLE_FORUM_MANAGER') and hasPermission(#forum,'update')) 
public void updateForum(Forum forum) { 
    //some implementation 
} 

Vous pouvez ensuite mettre en œuvre la méthode de hasPermission dans un évaluateur d'autorisation personnalisé, comme:

public class ForumPermissionEvaluator implements PermissionEvaluator { 

    public boolean hasPermission(Authentication authentication, 
      Object domainObject, Object permission) { 
     //implement 
    } 

    public boolean hasPermission(Authentication authentication, 
      Serializable targetId, String targetType, Object permission) { 
     //implement 
    } 
} 

Enfin, câbler ensemble dans la configuration de l'application:

<beans:bean id="expressionHandler" 
    class="org.springframework.security.access.expression.method.DefaultMethodSecurityExpressionHandler"> 
    <beans:property name="permissionEvaluator" ref="permissionEvaluator"/> 
</beans:bean> 

<beans:bean id="permissionEvaluator" 
    class="com.centrix.core.security.GroupPermissionEvaluator" /> 
+0

oui Je l'ai déjà vu, mais comme la sécurité de printemps 3 n'est pas une version officielle, je ne l'utiliserais pas, mais je pense que j'attendrai un peu pour l'utiliser. –

+0

Pour ce faire, en utilisant des arguments de méthodes tels que "#forum" vous devez avoir des informations de débogage à gauche dans vos fichiers JAR de production .... probablement pas une bonne idée. – HDave

+0

Dans le cas de la connexion au bean, le dernier élément devrait-il être 'ForumPermissionEvaluator' plutôt que' GroupPermissionEvaluator'? Une autre question: si vous vouliez avoir plus d'un PermissionEvaluator, comment cela serait-il branché, puisqu'il n'y a qu'un seul expressionHandler? –

1

Je l'ai fait quelque chose de similaire « manuellement »: à savoir que j'avais mon propre code déterminer quelles instances pourraient être éditées/supprimées par un utilisateur spécifique et se fier uniquement à la sécurité de Spring pour s'assurer qu'elles avaient le bon rôle pour accéder à la fonctionnalité et pour fournir des informations de rôle/d'authentification pour l'utilisateur actuel. Donc, dans mon code, j'ai déterminé le principal courant (notre propre classe User) et sur cette base j'ai décidé quels droits cet utilisateur avait sur une instance spécifique.

public static User getCurrentUser() { 
    User user = null; 
    Authentication auth = SecurityContextHolder.getContext().getAuthentication(); 
    if (auth != null) { 
     Object principal = auth.getPrincipal(); 
     if (principal instanceof User) { 
      user = (User)principal; 
     } 
    } 
    return user; 
} 
+0

Mais je ne comprends pas comment vous appliquez un acl à un groupe dans votre cas? –

+0

Je n'utilise pas vraiment un acl, mais le groupe et l'utilisateur sont les deux entités et ont une relation (bidirectionnelle) (gérée par hibernate). Pour déterminer si l'utilisateur peut effectuer des actions spéciales sur un groupe, je vérifie si le principal actuel est un modérateur de ce groupe (c'est-à-dire que le groupe est contenu dans la collection 'moderates' de l'utilisateur). Donc la liste des modérateurs de chaque groupe est fondamentalement la 'ACL' pour ce groupe et qui est gérée dans la base de données, pas dans la configuration de sécurité de printemps. –

2

Je voudrais juste utiliser vos groupes comme des rôles. J'ai trouvé l'implémentation de Spring ACL très compliquée et pour la plupart inutilisable. Affectez juste des utilisateurs à des "groupes" (Rôles dans toute l'actualité) et vérifiez-les comme vous le feriez avec une autorisation basée sur un rôle normal.

+0

Donc je peux créer dynamiquement une autorité comme "GROUP_15" et après, ajouter au forum 75 l'acl avec GrantedAuthoritySid ("GROUP_15"). Si je peux faire ça, c'est bon pour moi. Mais j'ai besoin de créer tous les rôles et toutes les permissions de manière dynamique. –

+0

Vous pourriez le faire, mais pas avec les annotations de printemps, au moins hors de la boîte. Le "ROLE" que vous utilisez dans l'annotation est codé en dur et non dynamique. Je suggère d'écrire votre propre MethodInterceptor et d'aller de leur - c'est une interface simple et ne prend pas beaucoup de code. – Gandalf