2016-04-29 6 views

Antwort

0

ich einen Weg herausgefunden.

SPEL ist in der Lage, Principal zu erhalten, daher ist es die Lösung, alle Autoritäten in den principal.authorizes zu überprüfen und nach der Autorität zu suchen, deren Name mit "ROLE_ADMIN" beginnt. Der Ausschnitt aus dem Code ist als unten:

@PreAuthorize ("?. # Principal.authorities [authority.startsWith ('ROLE_ADMIN')] size()> 0") public Object apiName (Hauptperson) {...}

Der Ausdruck "# principal.authorities.? [Authority.startsWith ('ROLE_ADMIN')]" gibt ein Array mit allen Autorisierungsnamen zurück, die mit "ROLE_ADMIN" beginnen. Wenn die Array-Größe größer als 0 ist, hat der Benutzer die Berechtigung, die Methode aufzurufen.

Prost!

0

Ich denke, es wäre besser, Springs hierarchical roles zu verwenden. Auf diese Weise können Sie konfigurieren, dass alle ROLE_ADMIN_L1 ... auch ROLE_ADMIN sind.

Beispiel aus der Dokumentation

<bean id="roleVoter" class="org.springframework.security.access.vote.RoleHierarchyVoter"> 
    <constructor-arg ref="roleHierarchy" /> 
</bean> 
<bean id="roleHierarchy" 
     class="org.springframework.security.access.hierarchicalroles.RoleHierarchyImpl"> 
    <property name="hierarchy"> 
     <value> 
      ROLE_ADMIN > ROLE_STAFF 
      ROLE_STAFF > ROLE_USER 
      ROLE_USER > ROLE_GUEST 
     </value> 
    </property> 
</bean> 

ROLE_ADMIN ⇒ ROLE_STAFF ⇒ ROLE_USER ⇒ ROLE_GUEST

So würden Sie so etwas wie dies benötigen:

<property name="hierarchy"> 
    <value> 
     ROLE_ADMIN_L1 > ROLE_ADMIN 
     ROLE_ADMIN_L2 > ROLE_ADMIN 
     ROLE_ADMIN_L3 > ROLE_ADMIN 
    </value> 
</property> 

und verwenden @PreAuthroize("hasRole('ADMIN')")

+0

Das ist nicht was ich will. ROLE_ADMIN hat globale Autorität. ROLE_ADMIN_XXX hat verschiedene Teilmengen der APIs, die ROLE_ADMIN aufrufen kann. Ich bin auf der Suche nach der einfachen Lösung auf @ PreAuthroize ("hasAnyAuthority ('')) Annotation, anstatt eine Anzahl von ROLE_ADMIN_XXX in der Annotation –

+0

AFAIK, was Sie wollen, ist nicht möglich mit den integrierten Tools von Spring, die Sie sehen können die Implementierung für 'hasAnyAuthority' [hier] [https://github.com/spring-projects/spring-security/blob/ce20cfcb9803a6175f6befc9008cadcc4e3b6d72/core/src/main/java/org/springframework/security/access/expression/SecurityExpressionRoot. Java], es enthält eine einfache enthält auf einer Reihe von Rollen. –