sec java spring spring-mvc spring-security thymeleaf

java - Spring Security hasRole() no funciona



sec authorize (7)

Consulte la documentación oficial. http://www.thymeleaf.org/doc/articles/springsecurity.html

<div sec:authorize="hasRole(''ROLE_ADMIN'')"> This content is only shown to administrators. </div> <div sec:authorize="hasRole(''ROLE_USER'')"> This content is only shown to users. </div>

¿Puedes simplemente intentarlo como sigue sin el ${ ... } .

<div sec:authorize="hasRole(''ADMIN'')">IS ADMIN</div>

Creo que no has prefijado los roles con ROLE_ . Si es así, asegúrate de agregar el prefijo así como abajo

<div sec:authorize="hasRole(''ROLE_ADMIN'')">IS ADMIN</div>

Tengo un problema al usar Spring Security && Thymeleaf, específicamente al intentar usar la expresión hasRole . El usuario ''admin'' tiene un rol ''ADMIN'' pero hasRole(''ADMIN'') resuelve en falso de todos modos, lo intento

Mi html:

1.<div sec:authentication="name"></div> <!-- works fine --> 2.<div sec:authentication="principal.authorities"></div> <!-- works fine --> 3.<div sec:authorize="isAuthenticated()" >true</div> <!-- works fine --> 4.<span th:text="${#authorization.expression(''isAuthenticated()'')}"></span> <!-- works fine --> 5.<div th:text="${#vars.role_admin}"></div> <!--Works fine --> 6.<div sec:authorize="${hasRole(''ADMIN'')}" > IS ADMIN </div> <!-- Doesnt work --> 7.<div sec:authorize="${hasRole(#vars.role_admin)}" > IS ADMIN </div> <!-- Doesnt work --> 8.<div th:text="${#authorization.expression(''hasRole(''''ADMIN'''')'')} "></div> <!-- Doesnt work --> 9.<div th:text="${#authorization.expression(''hasRole(#vars.role_admin)'')}"></div> <!-- Doesnt work -->

resultados en:

1.admin 2.[ADMIN] 3.true 4.true 5.ADMIN 6."prints nothing because hasRole(''ADMIN'') resolves to false" 7."prints nothing because hasRole(#vars.role_admin) resolves to false" 8.false 9.false

He habilitado expresiones de uso en mi archivo security.xml

<security:http auto-config="true" use-expressions="true">

Y también incluyó el SpringSecurityDialect en mi configuración

<bean id="templateEngine" class="org.thymeleaf.spring4.SpringTemplateEngine"> <property name="templateResolver" ref="templateResolver" /> <property name="additionalDialects"> <set> <bean class="org.thymeleaf.extras.springsecurity4.dialect.SpringSecurityDialect" /> </set> </property> </bean>

Todas las dependencias necesarias en mi archivo pom.xml.

<!--Spring security--> <dependency> <groupId>org.springframework.security</groupId> <artifactId>spring-security-core</artifactId> <version>4.0.1.RELEASE</version> </dependency> <dependency> <groupId>org.springframework.security</groupId> <artifactId>spring-security-web</artifactId> <version>4.0.1.RELEASE</version> </dependency> <dependency> <groupId>org.springframework.security</groupId> <artifactId>spring-security-config</artifactId> <version>4.0.1.RELEASE</version> </dependency> <!--Thymeleaf Spring Security--> <dependency> <groupId>org.thymeleaf.extras</groupId> <artifactId>thymeleaf-extras-springsecurity4</artifactId> <version>2.1.2.RELEASE</version> <scope>compile</scope> </dependency>

Role.java

@Entity @Table(name = "roles") public class Role implements Serializable { @Id @Enumerated(EnumType.STRING) private RoleType name; //... getters, setters }

Tipo de rol

public enum RoleType { ADMIN }

Y el User tiene un conjunto de Role s

¿Por qué hasRole() no funciona?

Agradezco tu ayuda gracias

Solución

th:if="${#strings.contains(#authentication.principal.authorities,''ADMIN'')}"



Intente usar hasAuthority lugar de hasRole dentro de la etiqueta HTML.

sec:authorize="hasAuthority(''ADMIN'')"


Me metí en el mismo problema, es debido spring-security de spring-security 4.0 . Debido a alguna razón, thymeleaf-extras-springsecurity4 no es compatible con spring-security 4.0 y thymeleaf 2.x Así que 3.2.9.RELEASE spring-security versiones de spring-security a 3.2.9.RELEASE y comenzó a funcionar. Si aún desea usar Spring-security 4.0 , entonces puede intentar elevar thymeleaf-extras-springsecurity4 a 3.0.0.RELEASE y thymeleaf a 3.0

O bien, si está utilizando la aplicación Spring Boot, la situación se vuelve más complicada, entonces la única opción que queda sería rebajar la spring-security o actualizar la versión de Spring Boot a 1.4.x (que aún está en BETA)

En su escenario específico, hacer los siguientes cambios de pom debería hacer que hasRole funcione

<!--Spring security--> <dependency> <groupId>org.springframework.security</groupId> <artifactId>spring-security-core</artifactId> <version>3.2.9.RELEASE</version> </dependency> <dependency> <groupId>org.springframework.security</groupId> <artifactId>spring-security-web</artifactId> <version>3.2.9.RELEASE</version> </dependency> <dependency> <groupId>org.springframework.security</groupId> <artifactId>spring-security-config</artifactId> <version>3.2.9.RELEASE</version> </dependency> <!--Thymeleaf Spring Security--> <dependency> <groupId>org.thymeleaf.extras</groupId> <artifactId>thymeleaf-extras-springsecurity4</artifactId> <version>2.1.2.RELEASE</version> <scope>compile</scope> </dependency>


Recientemente he tenido el mismo problema. Lo que necesitas hacer es:

  1. En su html agregue estas declaraciones:

    <html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org" xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity4">

(Puede cambiar entre springsecurity4 o springsecurity3 dependiendo de lo que esté usando).

  1. Asegúrese de haber agregado este recurso a sus bibliotecas. Estoy usando gradle pero puedes hacer lo mismo con Maven.

    compile ''org.thymeleaf.extras:thymeleaf-extras-springsecurity4:2.1.2.RELEASE''

  2. En su clase SpringWebConfiguration o xml, asegúrese de que está agregando el dialecto para thymeleaf SpringSecurity: Estoy usando una clase java para la configuración.

    @Bean public SpringTemplateEngine templateEngine() { SpringTemplateEngine templateEngine = new SpringTemplateEngine(); templateEngine.setTemplateResolver(templateResolver()); templateEngine.addDialect(new SpringSecurityDialect()); return templateEngine; }

Pero también puedes definirlo como dice alexsource: Spring Security y Thymeleaf no funcionan

¡Espero que esto funcione para ti! ¡Saludos!


Te estás perdiendo un concepto:

  • Si usa hasRole(''ADMIN'') , su ADMIN Enum debe ser ROLE_ADMIN lugar de ADMIN .
  • Si usa hasAuthority(''ADMIN'') , su ADMIN Enum debe ser ADMIN .

En seguridad de primavera, hasRole() es el mismo que hasAuthority() , pero el mapa de funciones hasRole() con Authority sin el prefijo ROLE_ .

Puede encontrar la respuesta aceptada en esta publicación: Diferencia entre Role y GrantedAuthority en Spring Security


Tenía que hacer algo similar donde necesitaba verificar el rol del usuario. Lo hice abajo

<div th:if="${ #authorization.expression(''isAuthenticated()'') and #strings.contains(#authentication.principal.authorities,''ADMIN'')}"> <a th:href="@{/somelink}">ADMIN LINK</a> </div>

Espero que ayude a alguien.