2013-11-28 11 views
6

Ich möchte wissen, ob seine möglichen Rollen auf einer ausgewählten Kategorie auf Basis einzustellen. In unserer App gibt es Kategorien, die Artikel enthalten. Jetzt haben wir eine Rollenhierarchie wie folgt: ROLE_ADMIN > ROLE_EDITOR > ROLE_USER. Das Problem ist, dass ein Benutzer verschiedene Rollen auf der aktuell ausgewählte Kategorie basiert haben könnte:Wie ändert man Spring Security Rollen nach Kontext?

user1 - cat1 - ROLE_USER 

user1 - cat2 - ROLE_EDITOR 

Die Kategorien sind nicht statisch. Neue können hinzugefügt und ältere gelöscht werden. Ist es möglich, dies mit Spring Security zu erreichen?

+1

Können Sie bitte erläutern, wie Sie die "Kategorien" verwenden? –

+0

Eine Kategorie ist eine Entität, die eine Sammlung von Artikelentitäten enthält. Es wird ausgewählt, wenn ein Benutzer durch die App navigiert. – Stefan

Antwort

6

Aus Ihrer Beschreibung, es klingt wie das RBAC-Modell, das Spring Security gibt Ihnen nicht genug. Ihnen stehen 2 Optionen zur Verfügung. Entweder:

  1. anpassen Sie Spring Security von Ihrem eigenen Zugang Decision Manager implementieren (siehe here für weitere Details) oder
  2. Sie bewegen, um attributbasierte Zugriffskontrolle (aka ABAC wie erläutert von NIST here). Die Verwendung von ABAC im Frühjahr ist die Verwendung einer Java-Implementierung von XACML, der eXtensible Access Control Markup Language. XACML bietet Ihnen ein externalisiertes, auf Richtlinien und Attributen basierendes Autorisierungsframework. Dies bedeutet, dass Sie Maßnahmen wie einen Benutzer mit der Rolle definieren = Manager Aktion tun = Ansicht in der Kategorie = foo. Sie können so viele Regeln haben, wie Sie möchten, und sie entsprechend kombinieren/faktorisieren.

Es gibt mehrere Open-Source und Herstellerimplementierungen von XACML für Java:

  • SunXACML
  • HerasAF
  • IBM
  • Axiomatics (Disclaimer: der Verkäufer für die ich arbeite)

Wenn Sie mehr Informationen über XACML wollen, würde ich rec ommend Sie überprüfen ihre wikipedia Seite sowie unsere YouTube channel die herstellerneutrale Tutorien.

XACML könnte für Ihren Anwendungsfall zu viel erweisen, aber es ist noch bei der Erörterung wert.

+0

Danke für die Anerkennung. –

0

Ich weiß nicht, wie Sie Ihre „Kategorien“ Arbeit, aber Sie können eine „Rolle“ zu UserDetails Objekt festgelegt.

Das Objekt UserDetails hat Collection<? extends GrantedAuthority> getAuthorities(); Methode und "ROLE" ist der Wert GrantedAuthority.getAuthority().

So können Sie mehr „Rolle“ s auf einzelne Sitzung festgelegt.

Und Sie können Ihre UserDetails Objekt steuern, indem UserDetailsService zu implementieren.

-1

Dieser Anwendungsfall kann die Standardrolle basierte Zugriffskontrolle (RBAC) Funktionalität durchgeführt werden unter Verwendung, da die Benutzerberechtigungen in Abhängigkeit von bestimmten Daten dem Benutzer zugeordnet ist dynamisch zur Laufzeit ändern. Diese

ist eigentlich der Anwendungsfall für die Access Control Lists (ACLs), wo für entworfen.

Spring Security hat die Unterstützung für ACLs durch die Feder-acl Glas hinzugefügt wird.Dies ist ein Zitat aus dem Federsicherheitshandbuch Acl Abschnitt:

Komplexe Anwendungen wird oft die Notwendigkeit finden, um Zugriffsberechtigungen zu definieren nicht einfach auf einer Web-Anforderung oder Methodenaufruf Ebene. Stattdessen müssen Sicherheitsentscheidungen sowohl who (Authentifizierung), wo (MethodInvocation) und was (SomeDomainObject) umfassen. Mit anderen Worten, Autorisierung Entscheidungen müssen auch den tatsächlichen Domänenobjektinstanz Betreff eines Methodenaufrufs berücksichtigen.

Siehe spring security manual Abschnitt 16.1 für die Details, wie Spring Security ACLs arbeiten. Dies ist eine tutorial zur Verwendung von Spring Security ACLs.

Aber Spring ACLs implizieren 4 zusätzliche Datenbanktabellen usw. Wenn es sich also um einen einzigen Fall in Ihrer Anwendung handelt, ist es wahrscheinlich besser, einen benutzerdefinierten Entscheidungsmanager mit einigen harcodierten Regeln zu erstellen.

Aber wenn dieser Anwendungsfall in Ihrer Anwendung häufig ist, sollten Sie erwägen, zu ACLs anstelle von RBAC zu wechseln, hoffe, dies hilft.

0

Ich glaube, ich bin zu spät hier wenig, aber das ist, was für mich gearbeitet:

Wenn eine neue Kategorie ausgewählt ist, können Sie ein neues Authentifizierungs Objekt mit neuen Rollen in der Sitzung festgelegt (Das vorherige Authentifizierung Objekt erhält ungültig gemacht). So etwas wie dieses:

@RequestMapping(value = "/cat1") 
String cat1(HttpServletRequest request) { 
    reloadRolesForAuthenticatedUser("cat1") 
    .... 
} 

private void reloadRolesForAuthenticatedUser(String cat) { 
    Authentication auth = SecurityContextHolder.getContext().getAuthentication() 
    List<String> newRoles = getRoles(auth.getPrincipal().getUsername(), cat) 
    List<GrantedAuthority> authorities = getAuthorities(newRoles) 
    Authentication newAuth = new UsernamePasswordAuthenticationToken(auth.getPrincipal(),auth.getCredentials(),authorities) 
    SecurityContextHolder.getContext().setAuthentication(newAuth) 
} 


private List<GrantedAuthority> getAuthorities(List<String> roles) { 
    List<GrantedAuthority> auths = new ArrayList<GrantedAuthority>() 
    if (!roles.isEmpty()) { 
     for (String r : roles) { 
      auths.add(new SimpleGrantedAuthority(r)) 
     } 
    } 
    return auths 
} 
Verwandte Themen