wake-up-neo.com

Spring Security hasRole () funktioniert nicht

Bei der Verwendung von Spring Security && Thymeleaf ist ein Problem aufgetreten, insbesondere beim Versuch, den Ausdruck hasRole zu verwenden. Der Benutzer 'admin' hat die Rolle 'ADMIN', aber hasRole('ADMIN') wird trotzdem auf false aufgelöst, wenn ich es versuche

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

ergebnisse in:

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

Ich habe use-expressions in meiner security.xml-Datei aktiviert

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

Außerdem habe ich den SpringSecurityDialect in meine Konfiguration aufgenommen

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

Alle notwendigen Abhängigkeiten in meiner pom.xml-Datei

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

Rolle.Java

@Entity
@Table(name = "roles")

    public class Role implements Serializable {

        @Id
        @Enumerated(EnumType.STRING)
        private RoleType name;
        //... getters, setters
    }

Rollentyp

public enum RoleType {

    ADMIN 
}

Und User hat eine Menge von Roles

Warum funktioniert hasRole() nicht?

Ich bedanke mich für Ihre Hilfe, danke

Problemumgehung

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

28
Xipo

Verwenden Sie stattdessen hasAuthority im HTML-Tag hasRole.

sec:authorize="hasAuthority('ADMIN')"
69
Dmitry Stolbov

Ich hatte das gleiche Problem beim Upgrade von Spring Security 3.x auf 4.x. Die Änderung von hasRole() in hasAuthority() hat den Trick für mich gemacht.

http://docs.spring.io/spring-security/site/docs/current/reference/htmlsingle/#el-common-built-in

12
Jeffrey B.

Ich musste etwas Ähnliches tun, wo ich die Benutzerrolle überprüfen musste. Ich habe unten getan

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

Hoffe es hilft jemandem.

6
rohtakdev

Sie vermissen ein Konzept:

  • Wenn Sie hasRole('ADMIN') verwenden, muss in Ihrem ADMIN EnumROLE_ADMIN anstelle von ADMIN angegeben werden.
  • Wenn Sie hasAuthority('ADMIN') verwenden, muss Ihr ADMIN EnumADMIN sein.

In der Frühlingssicherheit ist hasRole() dasselbe wie hasAuthority(), aber die Funktionskarte hasRole() mit Authority ohne ROLE_-Präfix.

Die akzeptierte Antwort finden Sie in diesem Beitrag: Unterschied zwischen Rolle und GrantedAuthority in Spring Security

5
Huy Quang

Ich hatte kürzlich das gleiche Problem ... Was Sie tun müssen, ist:

  1. Fügen Sie in Ihrer HTML-Datei folgende Anweisungen hinzu:

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

(Sie können zwischen springsecurity4 und springsecurity3 wechseln, je nachdem, was Sie verwenden.).

  1. Stellen Sie sicher, dass Sie diese Ressource zu Ihren Bibliotheken hinzugefügt haben. Ich benutze gradle, aber Sie können das gleiche mit Maven machen.

    compile 'org.thymeleaf.extras:thymeleaf-extras-springsecurity4:2.1.2.RELEASE'
    
  2. Stellen Sie in Ihrer SpringWebConfiguration-Klasse oder XML sicher, dass Sie den Dialekt für thymeleaf SpringSecurity: Hinzufügen. Ich verwende eine Java-Klasse für die Konfiguration.

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

Sie können aber auch definieren, wie Alexsource sagt: Spring Security und Thymeleaf funktionieren nicht

Ich hoffe, das funktioniert für Sie! Grüße!

4
sirandy

Lesen Sie die offizielle Dokumentation. 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>

Kannst du es einfach wie unten ohne den ${ ... } versuchen.

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

Ich glaube, Sie haben den Rollen nicht ROLE_ vorangestellt. In diesem Fall müssen Sie auch das Präfix hinzufügen (siehe unten)

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

Ich bin in das gleiche Problem geraten, wegen spring-security4.0. Aus irgendeinem Grund ist thymeleaf-extras-springsecurity4 nicht mit spring-security 4.0 und thymeleaf2.x kompatibel. Also habe ich spring-security-Versionen auf 3.2.9.RELEASE heruntergestuft und es begann zu arbeiten . Wenn Sie dennoch Spring-Security 4.0 verwenden möchten, können Sie versuchen, thymeleaf-extras-springsecurity4 in 3.0.0.RELEASE und thymeleaf verison auf 3.0

Oder wenn Sie die Spring Boot-App verwenden, wird die Situation schwieriger. Dann besteht die einzige Option darin, entweder den spring-security herunterzurüsten oder die Version des Spring Boot auf 1.4.x (die sich noch in BETA befindet) zu aktualisieren.

In Ihrem speziellen Szenario sollten die unten aufgeführten Änderungen am Pom dazu führen, dass hasRole funktioniert

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