如何使用 Spring MVC、Spring 安全和 FreeMarker 在每个页面上显示用户名

How to show the username on every page using Spring MVC, Spring Security and FreeMarker

如何在每个页面的页眉显示登录用户的用户名,我尝试使用以下方法

1) 这个 spring 安全标签是这样的:

首先我创建一个像这样的变量安全性

<#assign security=JspTaglibs["http://www.springframework.org/security/tags"] />

然后我尝试使用我调查过的 authentication 标记方法获取用户名

<@security.authentication  property="principal.username"> 

</@security.authentication>

但是我得到这个错误

    FreeMarker template error:
org.springframework.beans.NotReadablePropertyException: Invalid property 'principal.username' of bean class [org.springframework.security.authentication.UsernamePasswordAuthenticationToken]: Bean property 'principal.username' is not readable or has an invalid getter method: Does the return type of the getter match the parameter type of the setter?

2) 我尝试在控制器中获取用户名并将其放入视图中,如下所示

 Authentication auth = SecurityContextHolder.getContext().getAuthentication();
 String name = auth.getName(); //get logged in username

    map.addAttribute("username" , name);

可行,但我的控制器太多,我不想更新我所有的控制器并将这些线路放入我的所有控制器中。

这些是我的版本

<spring.version>4.2.5.RELEASE</spring.version>
<spring.security.version>4.1.0.RELEASE</spring.security.version>

<artifactId>spring-security-taglibs</artifactId>
<version>4.0.4.RELEASE</version>

<artifactId>freemarker</artifactId>
<version>2.3.21</version>

欢迎任何解决方案谢谢

显然,当在 Freemarker 中使用时,表达式不会解析为以下 Java 调用。 (我记不起确切的语法太久了)。

authentication.getPrincipal().getUsername();

这也是异常提示无法找到名为 principal.username 的 属性。相反,只需编写 name 即可获取当前 Authentication 对象的 name 属性。

<@security.authentication  property="name">

以下对我有用:

${Session.SPRING_SECURITY_CONTEXT.authentication.name}