Spring Boot + Thymeleaf Security 无法识别

Posted

技术标签:

【中文标题】Spring Boot + Thymeleaf Security 无法识别【英文标题】:Spring Boot + Thymeleaf Security not recognized 【发布时间】:2019-02-26 20:28:01 【问题描述】:

我一直在尝试使用 thymeleaf 的安全标签,但我无法让它们工作。 这是我的安全类:

@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SecurityConfig extends WebSecurityConfigurerAdapter 

    @Autowired
    private Environment env;

    @Autowired
    private UserSecurityService userSecurityService;

    private BCryptPasswordEncoder passwordEncoder() 
        return SecurityUtility.passwordEncoder();
    

    private static final String[] PUBLIC_MATCHERS =  "/css/**", "/js/**", "/image/**", "/", "/myAccount" ;

    @Override
    protected void configure(HttpSecurity http) throws Exception 
        http.authorizeRequests().
                antMatchers(PUBLIC_MATCHERS).permitAll().anyRequest().authenticated();

        http.csrf().disable().cors().disable().formLogin().failureUrl("/login?error").defaultSuccessUrl("/")
                .loginPage("/login").permitAll().and().logout()
                .logoutRequestMatcher(new AntPathRequestMatcher("/logout")).logoutSuccessUrl("/?logout")
                .deleteCookies("remember-me").permitAll().and().rememberMe();

    

    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception 
        auth.userDetailsService(userSecurityService).passwordEncoder(passwordEncoder());
    


Pom.xml

<dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.thymeleaf.extras</groupId>
            <artifactId>thymeleaf-extras-springsecurity4</artifactId>
        </dependency>
    </dependencies>

索引.html

<html lang="en" xmlns:th="http://www.thymeleaf.org"
    xmlns:sec="http://www.thymeleaf.org/extras/spring-security">

            <ul class="navbar-nav navbar-right">
                    <li class="nav-item"><a class="nav-link" href="#">Shopping
                            Cart</a></li>
                    <li class="nav-item"><a sec:authorize="isAnonymous()"
                        class="nav-link" th:href="@/login">My Account</a></li>
                    <li class="nav-item"><a sec:authorize="isAuthenticated()"
                        class="nav-link" th:href="@/myProfile">My Account</a></li>
                    <li class="nav-item"><a class="nav-link"
                        sec:authorize="isAuthenticated()" href="@/logout">Logout</a></li>
                </ul>

我的问题是两个名为“我的帐户”的导航项都显示在页面上,我猜标签 sec:authorize 没有被识别或类似的东西,或者我显然做错了什么:(我需要做任何其他配置?我正在使用spring boot 2,我尝试以不同的方式解决这个问题,从更改thymeleaf-extras-springsecurity4的版本到在spring上下文中添加一个bean,但它仍然无法正常工作:(

【问题讨论】:

您能粘贴 UserSecurityService 吗?问题可能是您在不应该进行身份验证时进行了身份验证。您的百​​里香代码看起来不错。只是为了确保它正在工作,尝试查看页面源代码,你不应该在你的 html 元素上看到 sec:authorize。 感谢您的回答!我能够通过将 spring boot 版本更改为 1.5.8 来解决问题,但我仍然不确定 spring boot 2 有什么问题 我复制了您的代码并启动了它2.0.5.RELEASE,一切正常。 OBS:我的 UserSecurityService 只是实现 loadUserByUsername 并返回 null。 【参考方案1】:

在 Spring Boot 自动配置中,SpringSecurityDialect 的实例不会自动配置。因此,您遇到了这个问题。尝试添加一个SpringSecurityDialect 的bean,如下所示,我希望它会起作用。

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

【讨论】:

以上是关于Spring Boot + Thymeleaf Security 无法识别的主要内容,如果未能解决你的问题,请参考以下文章

Thymeleaf 无法检测到 spring-boot 项目中的模板

Spring Boot中使用thymeleaf

spring boot整合Thymeleaf

Spring Boot2:使用Spring Boot结合Thymeleaf模板引擎使用总结

Spring Boot(十五):spring boot+jpa+thymeleaf增删改查示例

Spring Boot 学习笔记--整合Thymeleaf