Spring Boot 2.7.0中Thymeleaf无法展示已认证用户信息问题求助
解决Spring Boot 2.7.0中Thymeleaf无法显示已认证用户信息的问题
1. 修正Thymeleaf的Spring Security命名空间
当前index.html里的sec命名空间路径错误,导致Thymeleaf无法解析Spring Security专属标签。把:
xmlns:sec="https://www.thymeleaf.org/thymeleaf-extras-springsecurity5"
替换为标准的命名空间:
xmlns:sec="http://www.thymeleaf.org/extras/spring-security"
2. 让Spring Security正确使用自定义AuthenticationProvider
你已经定义了authenticationProvider Bean,但需要在SecurityFilterChain中明确配置它,否则Spring Security可能不会自动关联你的用户认证逻辑。修改securityFilterChain方法:
@Bean public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { http .authorizeHttpRequests(requests -> requests .requestMatchers("/login").permitAll() // 单独放行登录页 .anyRequest().authenticated()) // 其余所有请求需认证 .formLogin(form -> form.loginPage("/login").permitAll()) .logout(logout -> logout.permitAll()) .authenticationProvider(authenticationProvider()); // 绑定自定义认证提供者 return http.build(); }
注:原代码里requestMatchers("**").authenticated()属于冗余配置,anyRequest().authenticated()已经覆盖了所有请求场景,只需单独放行登录页即可。
3. 优化sec标签的表达式写法
如果用户信息还是不显示,检查表达式是否合理:
- 用户名:
sec:authentication="name"是有效的,也可以用sec:authentication="principal.username"(如果你的UserDetails实现类包含username字段) - 角色列表:直接输出
principal.authorities会显示集合对象的toString结果,建议格式化后展示:
Roles: <span sec:authentication="principal.authorities" th:text="${#strings.listJoin(principal.authorities, ', ')}">[ROLE_USER, ROLE_ADMIN]</span>
或者用迭代标签逐个渲染角色:
Roles: <ul> <li sec:authorize="isAuthenticated()" th:each="auth : ${principal.authorities}" th:text="${auth.authority}">ROLE_USER</li> </ul>
4. 确保依赖版本兼容
Spring Boot 2.7.0默认管理的thymeleaf-extras-springsecurity5版本为3.1.1.RELEASE,不要手动指定冲突版本,让Spring Boot自动管理依赖版本即可。
5. 关闭Thymeleaf缓存并重启
开发环境下Thymeleaf的模板缓存可能导致修改不生效,在application.properties中添加配置关闭缓存:
spring.thymeleaf.cache=false
之后重启应用,验证用户信息是否正常显示。
内容的提问来源于stack exchange,提问作者SAR
相关产品推荐
相关产品推荐

