tutorial mvc example ejemplo java spring spring-mvc spring-security

java - mvc - Cómo usar<seg: autorizar acceso="hasRole(''ROLES)"> para verificar múltiples Roles?



spring security tutorial (4)

Quiero mostrar contenido de forma condicional basado en Roles usando Spring Security JSP taglibs. Pero en Spring Security 3.1.x solo se busca una función.

Puedo usar pero ifAllGranted está en desuso.

¿Alguna ayuda?


El uso de hasAnyRole en la página JSP puede causar una excepción al procesar la página JSP al proporcionar las funciones con comillas simples para el método, como la siguiente, principalmente 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. Usando el método ifAllGranted en lugar del método de acceso:

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

Además, tenga en cuenta que debe incluir la siguiente etiqueta en su página JSP:

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


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

hasAnyRole (lista de roles) : verdadero si se le ha otorgado al usuario alguno de los roles especificados (dado como una lista de cadenas separadas por comas).

Nunca lo he usado, pero creo que es exactamente lo que estás buscando.

Ejemplo de uso:

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

Aquí hay un enlace a la documentación de referencia donde se describen las expresiones de seguridad de primavera estándar. Además, aquí hay una discussion donde describí cómo crear una expresión personalizada si la necesita.


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

De la guía de migración Spring Security 3-> 4 :

Antiguo:

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

Nuevo (SPeL):

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

Si se reemplaza ifAllGranted directamente con hasAnyRole , el resorte evaluará la declaración con un OR lugar de un AND . Es decir, hasAnyRole devolverá true si el principal autenticado contiene al menos uno de los roles especificados, mientras que el método de Spring (ahora obsoleto desde Spring Security 4) ifAllGranted solo devolvió true si el principal autenticado contenía todos los roles especificados.

TL; DR : Para replicar el comportamiento de ifAllGranted utilizando el nuevo Lenguaje de Expresión de autenticación de Spring Security Taglib, se ifAllGranted usar el hasRole(''ROLE_1'') and hasRole(''ROLE_2'') .


utilicé hasAnyRole(''ROLE_ADMIN'',''ROLE_USER'') pero estaba obteniendo la creación de hasAnyRole(''ROLE_ADMIN'',''ROLE_USER'') por debajo del 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/*]

entonces probé

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

como uno de mis usuarios es administrador así como usuario.

para esto necesitas agregar use-expressions="true" auto-config="true" seguido de la etiqueta http

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