You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Thymeleaf无法渲染已认证用户用户名问题求助

Thymeleaf 登录状态判断失效问题解决

你遇到的问题是:无论用户是否登录,页面始终显示登录和注册选项,无法正确展示已登录用户的用户名和退出按钮。

问题原因

你使用的#ctx.principal是ServletContext的主体对象,并非Spring Security的认证用户信息,所以无论用户是否登录,这个值始终为null,导致判断逻辑失效。

解决方案

方案1:使用Thymeleaf Spring Security方言(推荐)

这是Spring Security集成Thymeleaf的标准方式,更直观可靠。

  1. 添加依赖(Maven示例):
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-thymeleaf-extras-springsecurity</artifactId>
</dependency>
  1. 修改页面代码:
<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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 14:00:21