2009-12-17 8 views
6

Ich möchte Spring Security verwenden, um Benutzer, Gruppen und Berechtigungen zu verwalten.Gruppe und acl auf Spring Security

Ich möchte ACL verwenden, um meine Domänenobjekte zu sichern, aber ich kann keine Möglichkeit finden, eine Gruppe einer ACL zuzuweisen. Beispiel: Ich habe Benutzer und Gruppen. Jede Gruppe kann die folgenden Sicherheiten haben: - Foren verwalten (kann eine Rolle sein wie ROLE_FORUM_MANAGER) - bearbeiten Sie ein bestimmtes Forum (acl auf dem speziellen Forum).

Darüber hinaus werden Gruppen von Benutzern definiert, die die Rolle ROLE_PERMISSION_MANAGER haben. ABER alle von diesem Benutzer definierten Gruppen können nur von diesem Benutzer bearbeitet und verwaltet werden. So Gruppe sind an einen Benutzer angeschlossen. Stellen Sie sich vor, dass der Benutzer eine Google-Gruppe erstellt: Dieser Benutzer kann nur Berechtigungsgruppen für die Gruppe verwalten, die er erstellt hat. Und so kann er eine Gruppe erstellen, um ein bestimmtes Forum seiner eigenen Google-Gruppe zu verwalten.

Wie kann ich es tun?

Ich las die Feder Sicherheits docs und die folgenden Anleitungen (also bitte auf diese Links senden Sie mir nicht wichtig): http://grzegorzborkowski.blogspot.com/2008/10/spring-security-acl-very-basic-tutorial.html http://blog.denksoft.com/?page_id=20

Antwort

14

Überprüfen Sie Spring Security 3.0, möglicherweise können Sie die Verwendung von ACL mithilfe der Spring Expression Language vermeiden.

Zum Beispiel für ein Forum bearbeiten, würden Sie eine Methode, wie diese gesichert haben:

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

Sie würden dann die hasPermission Methode in einer Berechtigungsauswertungsprogramm benutzerdefinierte implementieren, wie:

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 
    } 
} 

Schließlich verdrahten Sie es zusammen in der Anwendungskonfiguration:

<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

Ja, ich habe es schon mal gesehen, aber da es sich bei Spring Security 3 nicht um eine offizielle Version handelt, würde ich es nicht verwenden, aber ich denke, ich werde ein wenig warten, bis ich es benutze. –

+0

Um dies mit Methodenargumenten wie "#forum" zu tun, müssen Sie Debug-Informationen in Ihren Produktions-JARs haben ... wahrscheinlich keine gute Idee. – HDave

+0

In der Bean-Verkabelung sollte das letzte Element 'ForumPermissionEvaluator' sein und nicht 'GroupPermissionEvaluator'? Noch eine Frage: Wenn Sie mehr als einen PermissionEvaluator haben möchten, wie wäre das dann verdrahtet, da es nur einen AusdruckHandler gibt? –

1

Ich habe etwas ähnliches ‚manuell‘: also ich meinen eigenen Code hatte Ermitteln Sie, welche Instanzen von einem bestimmten Benutzer bearbeitet/gelöscht werden können, und verlassen Sie sich nur auf die Spring-Sicherheit, um sicherzustellen, dass sie die richtige Rolle für den Zugriff auf die Funktionalität und für die Bereitstellung von Rollen-/Authentifizierungsinformationen für den aktuellen Benutzer haben.

In meinem Code habe ich also den aktuellen Principal (unsere eigene Benutzerklasse) bestimmt und basierend darauf habe ich entschieden, welche Rechte dieser Benutzer für eine bestimmte Instanz hatte.

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

Aber ich verstehe nicht, wie Sie sich bewerben ein acl zu einer Gruppe in deinem Fall? –

+0

Ich benutze nicht wirklich ein ACL, aber Gruppe und Benutzer sind beide Entitäten und haben eine (bidirektionale) Beziehung (verwaltet von Hibernate). Um zu bestimmen, ob der Benutzer spezielle Aktionen für eine Gruppe ausführen kann, prüfe ich, ob der aktuelle Prinzipal ein Moderator dieser Gruppe ist (d. H. Die Gruppe ist in der 'moderates'-Sammlung des Benutzers enthalten). Also die Liste der Moderatoren jeder Gruppe ist im Grunde die "ACL" für diese Gruppe und das ist in der Datenbank verwaltet, nicht in der Frühjahr Sicherheitskonfiguration. –

2

Ich würde nur Ihre Gruppen wie Rollen verwenden. Ich habe festgestellt, dass die Spring-ACL-Implementierung ziemlich unhandlich und größtenteils unbrauchbar ist. Ordnen Sie Benutzer einfach "Gruppen" zu (Rollen in allen Aktualitäten) und überprüfen Sie sie wie normale rollenbasierte Berechtigungen.

+0

So kann ich dynamisch eine Autorität wie "GROUP_15" erstellen und danach dem Forum 75 die acl mit GrantedAuthoritySid ("GROUP_15") hinzufügen. Wenn ich das tun kann, ist es gut für mich. Aber ich muss alle Rollen und Berechtigungen dynamisch erstellen. –

+0

Sie könnten das tun, aber nicht mit den Spring Annotations, zumindest aus der Box. Die "ROLE", die Sie in der Annotation verwenden, ist fest codiert und nicht dynamisch. Ich würde vorschlagen, Ihren eigenen MethodInterceptor zu schreiben und von ihrem zu gehen - es ist eine einfache Schnittstelle und nimmt nicht viel Code. – Gandalf