2012-07-13 1 views

risposta

73

V'è una speciale espressione di sicurezza in materia di sicurezza primavera:

hasAnyRole (elenco dei ruoli) - true se l'utente è stato concesso una delle i ruoli specificati (dato come un elenco separato da virgole di stringhe).

Non l'ho mai usato, ma penso che sia esattamente quello che stai cercando.

Esempio utilizzo:

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

Ecco un link to the reference documentation in cui sono descritte le espressioni di sicurezza a molla standard. Inoltre, ecco uno discussion in cui ho descritto come creare un'espressione personalizzata se ne hai bisogno.

+0

ha funzionato :-) \t \t \t (Utente/Amministratore) \t Ma un modo per verificare la presenza di hasAllRoles (role1, role2)? –

+0

Informazioni sull'ultima domanda: "Ma un modo per verificare hasAllRoles (role1, role2)?" - Non penso che sia possibile. Ma puoi creta la tua espressione personalizzata (ho dato un link), e nel codice controlla quello che vuoi. – dimas

+4

Sulla seconda domanda dovresti essere in grado di utilizzare "hasRole" con l'operatore "e" come hasRole ("ADMIN") e hasRole ("DEVELOPER") per ottenere questa funzionalità. – bh5k

1

Uso hasAnyRole a pagina JSP può provocare eccezione per l'elaborazione della pagina JSP nel fornire i ruoli con apici il metodo come segue, soprattutto quando la pagina viene combinato con JQuery:

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

Benchè sia una soluzione deprecata a favore del metodo di accesso, penso che la soluzione fornita here sia anche utile. Usando il metodo ifAllGranted invece di metodo di accesso:

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

Inoltre, nota per includere il seguente tag nella pagina JSP:

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

In che modo jQuery, che esegue il lato client, influisce sul rendering di jsp, che avviene sul lato server? –

1

ho usato hasAnyRole('ROLE_ADMIN','ROLE_USER') ma mi è stato sempre la creazione di fagioli sotto l'errore

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/*] 

quindi ho provato

access="hasRole('ROLE_ADMIN') or hasRole('ROLE_USER')" ed è lavoro mi sta bene.

come uno dei miei utenti è amministratore e utente.

per questo è necessario aggiungere use-expressions="true" auto-config="true" seguito dal tag http

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

@ risposta di Dimas non è logicamente coerente con la tua domanda; ifAllGranted non può essere sostituito direttamente con hasAnyRole.

Dal Spring Security 3—>4 migration guide:

Vecchio:

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

Nuovo (SPEL):

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

Sostituzione ifAllGranted direttamente con hasAnyRole causerà primavera per valutare la dichiarazione utilizzando un OR invece di uno AND. Cioè, hasAnyRole restituirà true se il principale autenticato contiene almeno uno dei ruoli specificati, considerando molla di (ora obsoleta come Sorgente Security 4) Metodo ifAllGranted solo restituito true se il principale autenticato conteneva tutti i ruoli specificati .

TL; DR: Per replicare il comportamento di ifAllGranted utilizzando la nuova autenticazione Expression Language di Primavera di sicurezza Taglib, il modello hasRole('ROLE_1') and hasRole('ROLE_2') deve essere utilizzato.

+0

Grazie mille. Funziona anche per i privilegi in modo simile.

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