如何使用 Spring Security 3 检索 UserDetails?

Posted

技术标签:

【中文标题】如何使用 Spring Security 3 检索 UserDetails?【英文标题】:How to retrieve UserDetails with Spring Security 3? 【发布时间】:2012-12-19 22:32:06 【问题描述】:
www.someurl.com - public access not intercepted by Spring Security 3.
www.someurl.com/admin  - intercepted by Spring Security 3. Works fine. 

我登录到 www.someurl.com/admin 下的页面。然后我在同一个窗口选项卡中将 url 更改为 www.someurl.com。我在同一个 http 会话中工作,所以我希望能够检索用户登录详细信息。

公共 url 请求由专用控制器处理。在这个控制器中,我有一个有线用户服务。此服务的实现者正在尝试检索凭据,但无法检索 - 身份验证对象为空。

Authentication a=SecurityContextHolder.getContext().getAuthentication();
userDetails=(UserDetails) a.getPrincipal();

=== 更新 ==========================

当我在公共 url 请求控制器中检查 HttpSession 时,我看到了这个属性:

SPRING_SECURITY_CONTEXT=org.springframework.security.core.context.SecurityContextImpl@ed20eaf7:身份验证:org.springframework.security.authentication.UsernamePasswordAuthenticationToken@ed20eaf7:主体:org.springframework.security.core.userdetails.User@586034f:用户名:admin;密码保护];启用:真; AccountNonExpired:真;凭据非过期:真; AccountNonLocked:真;授予权限:ADMINISTRATOR、AUTHOR、EDITOR、READER;凭证:[受保护];已认证:真实;详细信息:org.springframework.security.web.authentication.WebAuthenticationDetails@380f4:RemoteIpAddress:127.0.0.1;会话ID:43A582157C5813018632ACDD7499CF7D;授予权限:ADMINISTRATOR、AUTHOR、EDITOR、READER

【问题讨论】:

代码看起来没问题 - 你确定你已经配置了 spring security 来拦截 www.someurl.com url? 公共网址不被拦截。是这个问题吗? 是的。我会一起回答的 【参考方案1】:

如果你想像你一样获取安全细节,Spring Security 必须拦截 url,否则不会有任何安全信息。您可以将以下内容添加到您的 spring 安全配置中:

<security:http pattern="/" security='none' />

这意味着spring security会让每个人都看到root url(无论是否登录),但是spring security会处理这个url,这意味着你的控制器针对root url将能够从@获取当前用户登录详细信息987654322@

【讨论】:

我已经有了这个配置&lt;security:http auto-config="true" use-expressions="true" access-denied-page="/admin/denied"&gt;。如上所述添加模式和安全性会给我带来问题。由于某种原因,公共页面和管理页面都停止加载。我不想更多地使用拦截,因为我的公共 url 是动态的,我不想使用 /** 之类的东西,因为这可能会影响 /admin url 的安全性。现在,我将直接从会话中获取 Authentication 属性。至少我知道发生了什么,当我切换到 Shiro 时,我会正确地做到这一点。 顺便说一句:我接受是因为我的问题得到了回答。谢谢。 @jacekn 将 /** 规则放在所有其他规则的末尾,它不会干扰之前的规则 - 它在我之前做过的项目中运行良好。

以上是关于如何使用 Spring Security 3 检索 UserDetails?的主要内容,如果未能解决你的问题,请参考以下文章

使用 Spring Security 检索会话 ID

Spring Security 从两个实现 UserDetails 的方法中检索当前用户对象

如何使用 Spring Security 登录页面传递附加参数

使用 Spring Security 更新角色时如何注销用户

我可以从 Spring Security Oauth 中检索访问令牌吗?

从Spring Security Oauth2中的Token Store检索访问和刷新令牌的方法