如何使用 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}
如何在每个页面的页眉显示登录用户的用户名,我尝试使用以下方法
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}