Spring Security hasRole () не работает
я сталкиваюсь с проблемой при использовании Spring Security & & Thymeleaf, особенно при попытке использовать hasRole выражение. Пользователь "admin" имеет роль "ADMIN", но hasRole('ADMIN')
решает false в любом случае я пытаюсь это
мой 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 -->
результаты:
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
я включил использовать-выражения в моей безопасности.xml-файл
<security:http auto-config="true" use-expressions="true">
а также включил SpringSecurityDialect в мой config
<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>
все необходимые зависимости в моем 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>
роль.java
@Entity
@Table(name = "roles")
public class Role implements Serializable {
@Id
@Enumerated(EnumType.STRING)
private RoleType name;
//... getters, setters
}
RoleType
public enum RoleType {
ADMIN
}
и User
набор Role
s
почему hasRole()
не работает?
я ценю вашу помощь, спасибо
решение
th:if="${#strings.contains(#authentication.principal.authorities,'ADMIN')}"
7 ответов
у меня была такая же проблема с обновлением Spring Security 3.от x до 4.х. Изменение hasRole()
до hasAuthority()
сделал трюк для меня.
http://docs.spring.io/spring-security/site/docs/current/reference/htmlsingle/#el-common-built-in
мне пришлось сделать что-то подобное, когда мне нужно было проверить роль пользователя. Я сделал ниже
<div th:if="${ #authorization.expression('isAuthenticated()') and #strings.contains(#authentication.principal.authorities,'ADMIN')}">
<a th:href="@{/somelink}">ADMIN LINK</a>
</div>
надеюсь, это кому-то поможет.
у меня недавно была такая же проблема. Что вам нужно сделать, это:
-
в вашем html добавьте следующие утверждения:
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org" xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity4">
(вы можете изменить между springsecurity4 или springsecurity3 в зависимости от того, что вы используете).
-
убедитесь, что вы добавили этот ресурс в свои библиотеки. Я использую gradle, но вы можете сделать то же самое с Maven.
compile 'org.thymeleaf.extras:thymeleaf-extras-springsecurity4:2.1.2.RELEASE'
-
В вашей SpringWebConfiguration класс или xml убедитесь, что вы добавляете диалект для Thymeleaf SpringSecurity: Я использую класс java для конфигурации.
@Bean public SpringTemplateEngine templateEngine() { SpringTemplateEngine templateEngine = new SpringTemplateEngine(); templateEngine.setTemplateResolver(templateResolver()); templateEngine.addDialect(new SpringSecurityDialect()); return templateEngine; }
но вы также можете определить, как говорит alexsource: Spring security и Thymeleaf не работает
Я надеюсь, что это работает для вас! Привет!
вам не хватает концепции:
- если вы используете
hasRole('ADMIN')
в своемADMIN Enum
должно бытьROLE_ADMIN
вместоADMIN
. - если вы используете
hasAuthority('ADMIN')
вашADMIN Enum
должно бытьADMIN
.
весной безопасности, hasRole()
это то же самое, что hasAuthority()
, а hasRole()
карте функции Authority
без ROLE_
префикс.
вы можете найти принятый ответ в этом посте:разница между ролью и GrantedAuthority весной Безопасность
обратитесь к официальной документации. 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>
можете ли вы просто попробовать, как показано ниже, без ${
... }
.
<div sec:authorize="hasRole('ADMIN')">IS ADMIN</div>
Я считаю, что вы не префикс ролей с ROLE_
. Если это так, добавьте префикс, как показано ниже
<div sec:authorize="hasRole('ROLE_ADMIN')">IS ADMIN</div>
я попал в тот же вопрос, его из-за spring-security
4.0
. Из-за каких-то причин thymeleaf-extras-springsecurity4
не совместим с spring-security
4.0 и thymeleaf
2.x
.
Поэтому я понизилspring-security
версии 3.2.9.RELEASE
и он начал работать.
Если вы все еще хотите использовать spring-security 4.0
, тогда, возможно, вы можете попробовать поднять thymeleaf-extras-springsecurity4
to 3.0.0.RELEASE
и thymeleaf
verison к 3.0
или если вы используете приложение spring boot, то ситуация становится более сложной, а затем единственный вариант слева было бы либо понизить spring-security
или обновите версию spring boot до 1.4.x (который все еще находится в бета-версии)
в вашем конкретном сценарии внесение приведенных ниже изменений pom должно заставить hasRole работать
<!--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>