Thymeleaf spring 安全方言根本不起作用

Posted

技术标签:

【中文标题】Thymeleaf spring 安全方言根本不起作用【英文标题】:Thymeleaf spring security dialect doesn't work at all 【发布时间】:2019-09-12 13:40:32 【问题描述】:

我想使用 spring 安全方言,但是当我使用它的标签时,它根本不起作用。它显示 sec:authorize 内容,不管它是否经过身份验证。

这里是 pom:

 <dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-core</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-config</artifactId>
        </dependency>
<dependency>
            <groupId>org.thymeleaf</groupId>
            <artifactId>thymeleaf-spring5</artifactId>
        </dependency>
        <dependency>
            <groupId>org.thymeleaf.extras</groupId>
            <artifactId>thymeleaf-extras-springsecurity4</artifactId>
            <version>2.1.2.RELEASE</version>
        </dependency>

这是我的一页:

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:th="http://www.thymeleaf.org"
      xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity4">
<head>
    <meta charset="utf-8"/>
    <div th:replace="fragments/header :: header-css"></div>
</head>
<body>
<div th:replace="fragments/header :: header"/>
<div class="container">
    <header>
        <h1 align="center">
            Main Page
            <div class="logout" sec:authorize="hasAnyAuthority('ADMIN')">
                        <span id="currentUserLogin" sec:authentication="name" >
                            user temp
                        </span>
                <a href="/logout">
                    <i class="icon-off"></i>
                </a>
            </div>
        </h1>
    </header>
</div>
<div th:replace="fragments/footer :: footer"/>
<script src="/resources/jquery-1.8.1.min.js"></script>
</body>
</html>

无论如何,它总是显示带有“用户临时”文本的注销。谁能帮我理解为什么会这样? 我正在使用 cairo-sr7 进行依赖管理

<dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>io.spring.platform</groupId>
                <artifactId>platform-bom</artifactId>
                <version>Cairo-SR7</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

我想我需要通过模板引擎注册方言但是我应该怎么做呢? 这是我的 webMvcConfig

@Configuration
@EnableWebMvc
@ComponentScan(basePackages = "com.rjproject")
public class WebMvcConfig implements WebMvcConfigurer 

    @Autowired
    private ApplicationContext applicationContext;

    @Bean
    public SpringResourceTemplateResolver templateResolver() 
        SpringResourceTemplateResolver templateResolver = new SpringResourceTemplateResolver();
        templateResolver.setApplicationContext(applicationContext);
        templateResolver.setPrefix("/WEB-INF/templates/");
        templateResolver.setSuffix(".html");
        templateResolver.setTemplateMode(TemplateMode.HTML);
        templateResolver.setCacheable(true);
        return templateResolver;
    

    @Bean
    public SpringTemplateEngine templateEngine() 
        SpringTemplateEngine templateEngine = new SpringTemplateEngine();
        templateEngine.setTemplateResolver(templateResolver());
        templateEngine.setEnableSpringELCompiler(true);
        return templateEngine;
    

    @Bean
    public ViewResolver viewResolver() 
        ThymeleafViewResolver viewResolver = new ThymeleafViewResolver();
        viewResolver.setTemplateEngine(templateEngine());
        return viewResolver;
    

    @Override
    public void addResourceHandlers(final ResourceHandlerRegistry registry) 
        registry.addResourceHandler("/resources/**").addResourceLocations("/resources/");
    

【问题讨论】:

确保您使用的是正确的版本并已注册方言。 “注册方言”是什么意思? 只添加依赖不会有太大的作用,你必须在你的配置中使用百里香引擎注册方言。除非您使用的是 Spring Boot,它会自动配置它。 我用我的 mvcConfig 更新了我的帖子,我在其中配置了 thymeleaf 引擎。你能举个例子我应该如何配置方言? 为什么您使用 2.1.2.RELEASE 而不是与您拥有的当前 spring 安全依赖版本内联?似乎依赖项不匹配导致此问题。 【参考方案1】:

我只需要这一行:

springTemplateEngine.addDialect(new SpringSecurityDialect()); 

在 thymeleaf 模板引擎配置中。 因为方言应该手动注册。

【讨论】:

感谢这篇文章。帮助了我 也帮了我!【参考方案2】:

我假设您使用的是 Spring Boot 2.1.X

那你就得用版本5了:

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

【讨论】:

以上是关于Thymeleaf spring 安全方言根本不起作用的主要内容,如果未能解决你的问题,请参考以下文章

如何将布局方言添加到spring-boot thymeleaf自动配置文件

Thymeleaf 安全不适用于 Spring Boot 1.3.5

升级的 Spring Boot Starter Parent - Thymeleaf 方言布局:装饰器坏了

Spring 安全性和 Thymeleaf 不起作用

Thymeleaf 和 Spring 引导以及 Spring 安全性不起作用

SpringBoot + Thymeleaf + Security Dialect 怎么配置?