如何使用 Spring MVC、Spring Security 和 FreeMarker 在每个页面上显示用户名
Posted
技术标签:
【中文标题】如何使用 Spring MVC、Spring Security 和 FreeMarker 在每个页面上显示用户名【英文标题】:How to show the username on every page using Spring MVC, Spring Security and FreeMarker 【发布时间】:2016-11-23 20:06:49 【问题描述】:如何在每个页面的标题上显示登录用户的用户名,我尝试使用以下方法
1) 今年春天的安全标签是这样的:
首先我创建一个像这样的变量安全
<#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>
欢迎任何解决方案谢谢
【问题讨论】:
使用name
或principal.name
代替principal.username
。 Principal
类确实没有属性 username
它有一个属性名称。 (如果你检查Principal
的api很容易检查)。
谢谢这是问题所在,我使用以下行来显示用户名<@security.authentication property="name"> </@security.authentication>
,谢谢,但我检查了API,他们向我展示了这个例子<sec:authentication property="principal.username" />
,那个例子没有t 工作它向我显示了我的问题的错误。这是我检查的 API docs.spring.io/spring-security/site/docs/3.0.x/reference/…
这与您的问题无关,但请注意您使用的是相当旧的 FreeMarker 版本。这可能会让您付出代价,因为例如有用的错误消息较少。
实际上,Freemarker 似乎没有正确处理表达式,它实际上应该可以工作。您是否尝试过更新版本的 Freemarker。像 2.3.23 (不确定孵化的 24 和 25 版本是什么......)。
【参考方案1】:
显然,在 Freemarker 中使用时,该表达式无法解析为以下 Java 调用。 (我已经太久无法记住确切的语法了)。
authentication.getPrincipal().getUsername();
这也是异常提示找不到名为principal.username
的属性的原因。相反,只需编写name
,它将获得当前Authentication
对象的name
属性。
<@security.authentication property="name">
【讨论】:
【参考方案2】:以下内容对我有用:
$Session.SPRING_SECURITY_CONTEXT.authentication.name
【讨论】:
以上是关于如何使用 Spring MVC、Spring Security 和 FreeMarker 在每个页面上显示用户名的主要内容,如果未能解决你的问题,请参考以下文章
spring mvc jsp怎么获得ModelAndView设置的值 急急急!
Spring MVC官方文档学习笔记之DispatcherServlet