2012-07-13 2 views

Antwort

73

Es gibt einen speziellen Sicherheitsausdruck im Frühjahr Sicherheit:

hasAnyRole (Liste der Rollen) - true, wenn der Benutzer als kommagetrennte Liste all die angegebenen Rollen (gegeben erteilt wurde von Strings).

Ich habe es nie benutzt, aber ich denke, es ist genau das, wonach Sie suchen.

Beispiel Nutzung:

<security:authorize access="hasAnyRole('ADMIN', 'DEVELOPER')"> 
    ... 
</security:authorize> 

Hier ist ein link to the reference documentation, wo die Standard-Federsicherheits Ausdrücke beschrieben werden. Auch hier ist ein discussion, wo ich beschrieben, wie Sie benutzerdefinierte Ausdruck erstellen, wenn Sie es brauchen.

+0

Es funktionierte :-) \t \t \t (User/Admin) \t Aber eine Möglichkeit, zu überprüfen, hasAllRoles (Rolle1, Rolle2)? –

+0

Über Ihre letzte Frage: "Aber jede Möglichkeit, nach hasAllRoles (role1, role2) zu überprüfen?" - Ich denke nicht, dass es möglich ist. Aber Sie können Ihren benutzerdefinierten Ausdruck erstellen (ich gab einen Link) und im Code überprüfen, was Sie wollen. – dimas

+4

Bei Ihrer zweiten Frage sollten Sie 'hasRole' mit dem Operator 'and' wie hasRole ('ADMIN') und hasRole ('DEVELOPER') verwenden können, um diese Funktionalität zu erreichen. – bh5k

1

Mit hasAnyRole auf JSP-Seite kann für die Bearbeitung der JSP-Seite Ausnahme verursachen, wenn die Rollen mit einfachen Anführungszeichen an die Methode, wie die folgenden Bereitstellung, meist, wenn die Seite mit JQuery kombiniert wird:

<security:authorize access="hasAnyRole('ROLE_USER')"> ... 
</security:authorize> 

Obwohl es eine veraltete Lösung zugunsten der Zugriffsmethode, denke ich, dass die gelieferte Lösung here auch nützlich ist. ifAllGranted Verfahren anstelle von Zugriffsmethode:

<security:authorize ifAllGranted="ROLE_USER"> ... 
</security:authorize> 

Beachten Sie auch, den folgenden Tag auf Ihrer JSP-Seite enthalten:

<%@taglib prefix="sec" uri="http://www.springframework.org/security/tags" %> 
+4

Wie würde jQuery, die Client-Seite, Auswirkungen auf JSP-Rendering, die Server-Seite passiert? –

1

i hasAnyRole('ROLE_ADMIN','ROLE_USER') verwendet, aber ich war immer Bohne Schöpfung unter Fehler

Error creating bean with name  'org.springframework.security.web.access.intercept.FilterSecurityInterceptor#0': Cannot create inner bean '(inner bean)' of type [org.springframework.security.web.access.expression.ExpressionBasedFilterInvocationSecurityMetadataSource] while setting bean property 'securityMetadataSource'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name '(inner bean)#2': Instantiation of bean failed; nested exception is org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [org.springframework.security.web.access.expression.ExpressionBasedFilterInvocationSecurityMetadataSource]: Constructor threw exception; nested exception is java.lang.IllegalArgumentException: Expected a single expression attribute for [/user/*] 

dann versuchte ich

access="hasRole('ROLE_ADMIN') or hasRole('ROLE_USER')" und es ist Arbeit für mich gut.

als einer meiner Benutzer ist Admin sowie Benutzer.

hierfür benötigen Sie use-expressions="true" auto-config="true" von http-Tag

<http use-expressions="true" auto-config="true" >.....</http> 
4

@ dimas Antwort mit Ihrer Frage nicht logisch konsistent gefolgt hinzuzufügen ist; ifAllGranted kann nicht direkt durch hasAnyRole ersetzt werden.

Vom Spring Security 3—>4 migration guide:

Alt:

<sec:authorize ifAllGranted="ROLE_ADMIN,ROLE_USER"> 
    <p>Must have ROLE_ADMIN and ROLE_USER</p> 
</sec:authorize> 

Neu (Spel):

<sec:authorize access="hasRole('ROLE_ADMIN') and hasRole('ROLE_USER')"> 
    <p>Must have ROLE_ADMIN and ROLE_USER</p> 
</sec:authorize> 

Ersetzen ifAllGranted direkt mit hasAnyRole wird Feder führt die Anweisung mit einem OR statt bewerten von ein AND. Das heißt, wird hasAnyRoletrue zurück, wenn der authentifizierte Haupt mindestens eine der angegebenen Rollen enthält, während Spring ifAllGranted Verfahren (jetzt als Spring Security 4 veraltet) nur true zurückgegeben, wenn der authentifizierte Haupt enthielt alle der angegebenen Rollen .

TL; DR: Um das Verhalten von ifAllGranted mit Spring Security Taglib des neuen Authentifizierungs Expression Language replizieren, die hasRole('ROLE_1') and hasRole('ROLE_2') Muster verwendet werden muss.

+0

Vielen Dank. Genauso funktioniert es für Privilegien.

This text is only visible to an user who has the 'CREATE_GROUP' and 'CHANGE_PASSWORD_PRIVILEGE' privileges together.