2012-07-13 12 views

Respuesta

73

Hay una expresión especial de seguridad en la seguridad de la primavera:

hasAnyRole (lista de roles) - true si el usuario ha concedido cualquiera de las funciones especificadas (dado como una lista separada por comas de cuerdas).

nunca he utilizado, pero creo que es exactamente lo que busca.

Ejemplo de uso:

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

Aquí está una link to the reference documentation donde se describen las expresiones de seguridad de resorte estándar. Además, aquí hay un discussion donde describí cómo crear una expresión personalizada si la necesita.

+0

Se trabajó :-) \t \t \t (Usuario/Admin) \t Sin embargo, cualquier forma de comprobar hasAllRoles (role1, role2)? –

+0

Acerca de su última pregunta: "¿Hay alguna manera de verificar hasAllRoles (role1, role2)?" - No creo que sea posible. Pero puedes crear tu expresión personalizada (di un enlace), y en el código comprueba lo que quieras. – dimas

+4

En su segunda pregunta, debería poder usar 'hasRole' con el operador 'and' como hasRole ('ADMIN') y hasRole ('DEVELOPER') para lograr esta funcionalidad. – bh5k

1

Usando hasAnyRole en la página JSP puede causar excepción para el procesamiento de la página JSP en la prestación de los papeles con comillas simples con el método como el siguiente, sobre todo cuando la página se combina con JQuery:

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

Aunque es una solución obsoleta a favor del método de acceso, creo que la solución proporcionada here también es útil. Utilizando el método ifAllGranted en lugar de método de acceso:

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

Además, la nota para incluir la siguiente etiqueta en su página JSP:

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

¿Cómo afectaría jQuery, que se ejecuta en el lado del cliente, la representación de jsp, que sucede en el lado del servidor? –

1

i utilizado hasAnyRole('ROLE_ADMIN','ROLE_USER') pero yo estaba recibiendo la creación de frijol por debajo de error

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

luego probé

access="hasRole('ROLE_ADMIN') or hasRole('ROLE_USER')" y es trabajo Estoy bien para mí.

ya que uno de mis usuarios es administrador y también usuario.

para ello es necesario añadir use-expressions="true" auto-config="true" seguida por etiqueta http

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

@ respuesta de Dimas no es lógicamente consistente con su pregunta; ifAllGranted no se puede reemplazar directamente con hasAnyRole.

Desde el Spring Security 3—>4 migration guide:

antigua:

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

Nueva (SPEL):

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

Sustitución ifAllGranted directamente con hasAnyRole hará que la primavera para evaluar el estado de uso de un OR en lugar de un AND. Es decir, hasAnyRole volverá true si el principal autenticado contiene al menos un de las funciones especificadas, mientras que la primavera del (ahora en desuso a partir de la primavera de Seguridad 4) Método ifAllGranted única devuelto true si el principal autenticado contenía todo de las funciones especificadas .

TL; DR: Para replicar el comportamiento de ifAllGranted usando nuevo lenguaje de expresión de autenticación de la primavera de Seguridad Taglib, el patrón hasRole('ROLE_1') and hasRole('ROLE_2') necesita ser utilizado.

+0

Muchas gracias. También funciona para los privilegios de manera similar.

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

Cuestiones relacionadas