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'')}"
He tenido el mismo problema al actualizar de Spring Security 3.xa 4.x. Cambiar hasRole()
a hasAuthority()
hizo el truco por mí.
http://docs.spring.io/spring-security/site/docs/current/reference/htmlsingle/#el-common-built-in
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:
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).
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''
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'')
, suADMIN Enum
debe serROLE_ADMIN
lugar deADMIN
. - Si usa
hasAuthority(''ADMIN'')
, suADMIN Enum
debe serADMIN
.
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.