使用spring 3 security在jsp页面中访问我的自定义用户对象

Posted

技术标签:

【中文标题】使用spring 3 security在jsp页面中访问我的自定义用户对象【英文标题】:Accessing my custom user object in jsp page, using spring 3 security 【发布时间】:2011-12-10 02:44:00 【问题描述】:

我已经实现了UserDetailsService,它返回一个MyUser的实例(它实现了UserDetails

public MyUser loadUserByUsername(String arg0)

现在我想在我的 JSP 页面中访问 MyUser 上的自定义 getter/字段,到目前为止我得到了这个:

$pageContext.request.userPrincipal.name

但这仅允许访问Principal 对象。如何访问MyUser 对象?

【问题讨论】:

【参考方案1】:

在我添加的jsp页面中很容易:

<%@ taglib prefix="sec" uri="http://www.springframework.org/security/tags" %>
...
<sec:authentication property="principal.firstname" /> 

principal 实际上是 MyUser 的一个实例,因此“名字”可以是我的任何自定义 getter 和 setter

【讨论】:

【参考方案2】:

分析HTTPSesson后,在成功登录后立即发现有一个名为SPRING_SECURITY_CONTEXT的属性。例如,我的自定义 UserDetails 具有名为 user 的对象,该对象具有属性 firstName。在 JSP 中,该属性的值可以通过以下方式获得:

$sessionScope.SPRING_SECURITY_CONTEXT.authentication.principal.user.firstName

【讨论】:

对我来说 '$sessionScope.SPRING_SECURITY_CONTEXT.authentication.principal.email' 工作得就像我在 '' 标签中看到的一样'principal.firstname'【参考方案3】:

如果您的 MyUser 对象实现了 Principal 并且您在成功登录时将其置于 http 会话中,您可以从会话中获取它并进行转换。


您可以在其中实现AuthenticationSuccessHandler 注入您的UserDetailsService 并将其放置在会话中。

然后您可以将您的AuthenticationSuccessHandler 注入处理&lt;form-login&gt; 元素的UsernamePasswordauthenticationFilter

如果您提供有关您的安全上下文配置的详细信息,我可以为您提供更多详细信息。

【讨论】:

我同意 100%,我如何“在成功登录时将其放置在 http 会话中,您可以从会话中获取并投射它。” @NimChimpsky 请粘贴您的安全配置的一些相关部分。我会更详细地编辑我的答案。 谢谢你的帮助,我有解决方案,会发布。

以上是关于使用spring 3 security在jsp页面中访问我的自定义用户对象的主要内容,如果未能解决你的问题,请参考以下文章

如何配置 Spring Security 以允许在 JSP 页面中使用 hasPermission?

如何使用 Spring Security 在 login.jsp 页面显示登录错误消息?

是否可以使用jsp登录表单作为spring security的自定义登录表单

我们应该使用啥来代替 Spring Security 的 JSP 标签库来在 HTML 页面中的客户端具有安全性?

使用spring security在jsp中显示用户详细信息

通过 Spring Security 和 CAS 登录后,如何在非安全 JSP 页面上显示登录用户详细信息?