Подтвердить что ты не робот

Spring Безопасность hasRole() не работает

У меня возникла проблема при использовании Spring Security && & Thymeleaf, особенно при попытке использовать выражение hasRole. Пользователь "admin" имеет роль "ADMIN", но hasRole('ADMIN') разрешает ложь в любом случае, я пытаюсь его

Мой 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

Я включил использование выражений в файле security.xml

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

А также включил SpringSecurityDialect в моей конфигурации

<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>

Role.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

Почему hasRole() не работает?

Я ценю вашу помощь, спасибо

Обход

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

4b9b3361

Ответ 1

Попробуйте использовать hasAuthority вместо hasRole внутри HTML-тега.

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

Ответ 3

Мне нужно было сделать что-то подобное, где мне нужно было проверить роль пользователя. Я сделал ниже

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

Надеюсь, что это поможет кому-то.

Ответ 4

Недавно у меня была такая же проблема. Что вам нужно сделать:

  • В 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 в зависимости от того, что вы используете).

  1. Убедитесь, что вы добавили этот ресурс в свои библиотеки. Я использую gradle, но вы можете сделать то же самое с Maven.

    compile 'org.thymeleaf.extras:thymeleaf-extras-springsecurity4:2.1.2.RELEASE'
    
  2. В вашем классе SpringWebConfiguration или xml убедитесь, что вы добавляете диалект для тимелеафа SpringSecurity: Я использую класс java для конфигурации.

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

Но вы также можете определить, как alexsource говорит: Spring безопасность и Thymeleaf не работают

Я надеюсь, что это сработает для вас! Привет!

Ответ 5

Вам не хватает понятия:

  • Если вы используете hasRole('ADMIN'), в ADMIN Enum должен быть ROLE_ADMIN вместо ADMIN.
  • Если вы используете hasAuthority('ADMIN'), ваш ADMIN Enum должен быть ADMIN.

В spring безопасности hasRole() совпадает с hasAuthority(), но hasRole() карта функций с Authority без префикса ROLE_.

Вы можете найти принятый ответ в этом сообщении: Разница между ролью и GrantedAuthority в spring безопасности

Ответ 6

Обратитесь к официальной документации. 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>

Ответ 7

Я попал в ту же проблему, из-за 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 до 3.0.0.RELEASE и thymeleaf verison до 3.0

Или, если вы используете загрузочное приложение spring, тогда ситуация становится более сложной, тогда единственной опцией остается либо понизить версию spring-security, либо обновить загрузочную версию spring до 1.4.x(что все еще в BETA)

В вашем конкретном сценарии внесение изменений ниже 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>