Thymeleaf无法渲染已认证用户用户名问题求助
Thymeleaf 登录状态判断失效问题解决
你遇到的问题是:无论用户是否登录,页面始终显示登录和注册选项,无法正确展示已登录用户的用户名和退出按钮。
问题原因
你使用的#ctx.principal是ServletContext的主体对象,并非Spring Security的认证用户信息,所以无论用户是否登录,这个值始终为null,导致判断逻辑失效。
解决方案
方案1:使用Thymeleaf Spring Security方言(推荐)
这是Spring Security集成Thymeleaf的标准方式,更直观可靠。
- 添加依赖(Maven示例):
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf-extras-springsecurity</artifactId> </dependency>
- 修改页面代码:
<ul> <li sec:authorize="isAnonymous()"> <i class="fi-rs-user"></i> <a th:href="@{/login}">登录</a> </li> <li sec:authorize="isAuthenticated()"> <i class="fi-rs-user"></i> <span sec:authentication="name"></span> <a th:href="@{/logout}">退出</a> </li> <li sec:authorize="isAnonymous()"> <i class="fi-rs-user"></i> <a th:href="@{/register}">注册</a> </li> </ul>
sec:authorize="isAnonymous()":未登录时显示对应内容sec:authorize="isAuthenticated()":已登录时显示对应内容sec:authentication="name":直接获取当前登录用户的用户名
方案2:修正原有表达式
如果不想引入额外依赖,可改用Thymeleaf提供的#authentication对象,它对应Spring Security的认证信息,未登录时为null。
修改后的代码:
<ul> <li th:if="${#authentication == null}"> <i class="fi-rs-user"></i> <a th:href="@{/login}">登录</a> </li> <li th:unless="${#authentication == null}"> <i class="fi-rs-user"></i> <span th:text="${#authentication.principal.username}"></span> <a th:href="@{/logout}">退出</a> </li> <li th:if="${#authentication == null}"> <i class="fi-rs-user"></i> <a th:href="@{/register}">注册</a> </li> </ul>
注意:确保你的用户实体类实现了UserDetails接口,且username属性可正常访问。
内容的提问来源于stack exchange,提问作者Athul
相关产品推荐
相关产品推荐

