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 Role
s
Warum funktioniert hasRole()
nicht?
Ich bedanke mich für Ihre Hilfe, danke
th:if="${#strings.contains(#authentication.principal.authorities,'ADMIN')}"
Verwenden Sie stattdessen hasAuthority
im HTML-Tag hasRole
.
sec:authorize="hasAuthority('ADMIN')"
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
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.
Sie vermissen ein Konzept:
hasRole('ADMIN')
verwenden, muss in Ihrem ADMIN Enum
ROLE_ADMIN
anstelle von ADMIN
angegeben werden.hasAuthority('ADMIN')
verwenden, muss Ihr ADMIN Enum
ADMIN
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
Ich hatte kürzlich das gleiche Problem ... Was Sie tun müssen, ist:
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.).
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'
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!
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>
Ich bin in das gleiche Problem geraten, wegen spring-security
4.0
. Aus irgendeinem Grund ist thymeleaf-extras-springsecurity4
nicht mit spring-security
4.0 und thymeleaf
2.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>