Thymeleaf 3.0 Spring Boot +安全集成不起作用

时间:2016-12-29 22:55:34

标签: java spring-boot spring-security thymeleaf

我很难让Thymeleaf在我的基于Spring Boot 1.4.3的项目中使用Spring Security。

标签,例如。

<div sec:authorize="hasAuthority('ADMIN')">

根本就没有被解析。

如果我尝试像这样手动添加SpringSecurityDialect

@Bean
public SpringSecurityDialect securityDialect() {
    return new SpringSecurityDialect();
}

我得到了:

Exception in thread "main" java.lang.NoClassDefFoundError: org/thymeleaf/dialect/IExpressionEnhancingDialect

我在我的依赖项中包含以下内容:

<dependency>
    <groupId>org.thymeleaf.extras</groupId>
    <artifactId>thymeleaf-extras-springsecurity4</artifactId>
</dependency>

自动配置似乎没有添加SpringSecurityDialect

手动添加Bean之后,我得到了提到的异常。

这是一个错误还是我错过了什么?

我的Thymeleaf版本是:

<thymeleaf.version>3.0.2.RELEASE</thymeleaf.version>
<thymeleaf-extras-java8time.version>3.0.0.RELEASE</thymeleaf-extras-java8time.version>
<thymeleaf-layout-dialect.version>2.1.2</thymeleaf-layout-dialect.version>

3 个答案:

答案 0 :(得分:13)

要使其正常工作,如果您在Spring Boot 1.4中使用Thymeleaf 3.0.2,则需要强制3.0.1.RELEASE的版本thymeleaf-extras-springsecurity4(因为它继承了版本2.1.2,与Thymeleaf 3)无法合作:

<dependency>
    <groupId>org.thymeleaf.extras</groupId>
    <artifactId>thymeleaf-extras-springsecurity4</artifactId>
    <version>3.0.1.RELEASE</version>
</dependency>

标签应使用hasRole功能。

<div sec:authorize="hasRole('ROLE_ADMIN')">

答案 1 :(得分:3)

如果您使用Spring Boot 2.0.0.RELEASE

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.0.0.RELEASE</version>
    <relativePath/> <!-- lookup parent from repository -->
</parent>

您只需要以下依赖项:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
    <groupId>org.thymeleaf.extras</groupId>
    <artifactId>thymeleaf-extras-springsecurity4</artifactId>
</dependency>

thymeleaf-extras-springsecurity4的版本将从spring-boot-starter-parent继承,并且为3.0.2.RELEASE

感谢@ yglodt指出这一点。

同样在您的模板中添加spring-security名称空间xmlns:sec="http://www.thymeleaf.org/extras/spring-security"并在hasRole标记中使用hasAuthority而不是<sec:authorize>值:

<div sec:authorize="hasRole('ROLE_ADMIN')">
    ...
</div>

答案 2 :(得分:1)

我曾经遇到过同样的问题。 Thymeleaf SpringSecurity仅适用于thymeleaf的3.x.x版本,Spring-boot附带的版本类似于2.x.x atm。

查看如何将v3.x.x添加到我的项目中,将我带到了以下文档页面: http://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#howto-use-thymeleaf-3

所以你只需要添加你的依赖项,然后在你的属性中添加以下内容来覆盖你的依赖项的默认版本的thymeleaf:

<thymeleaf.version>3.0.2.RELEASE</thymeleaf.version>
<thymeleaf-layout-dialect.version>2.1.1</thymeleaf-layout-dialect.version>