2013-01-05 46 views
0
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网页。然后我在同一窗口选项卡中将网址更改为www.someurl.com。我在同一个http会话中工作,所以我希望能够检索用户登录信息。如何使用Spring Security 3检索UserDetails?

公共URL请求由专用控制器处理。在这个控制器中,我有一个有线用户服务。此服务的实施者试图检索凭证,但不能 - 认证对象为空。

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

=== UPDATE =========================

当我检查公共HttpSession中URL请求控制器,I看到该属性:

{SPRING_SECURITY_CONTEX[email protected]ed20eaf7:认证:org.springframew[email protected]ed20eaf7:主要:org.springframework。 [email protected]:用户名:admin;密码保护];启用:true; AccountNonExpired:true; credentialsNonExpired:true; AccountNonLocked:true;授权机构:管理员,作者,编辑,读者;证书:[PROTECTED];已验证:true;详细信息:org.sprin[email protected]380f4:RemoteIpAddress:127.0.0.1; SessionId:43A582157C5813018632ACDD7499CF7D;授予权限:管理员,作者,编辑,读者}

+0

得到当前用户登录详细信息代码看起来不错 - 你确定你有弹簧安全配置来拦截www.someurl.com网址吗? –

+0

公共网址未被拦截。这是问题吗? – jacekn

+0

是的。我将把一个答案放在一起 –

回答

1

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

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

这意味着春天的安全性将让大家看到根URL(不论是会员或没有),但春季安全将处理的URL,这意味着你对控制器根URL将能够从SecurityContextHolder

+0

我已经有了这个配置''。如上所述添加模式和安全性会导致我遇到问题。由于某些原因,公共和管理页面都停止加载。我不想玩拦截更多,因为我的公开网址是动态的,我不想使用/ **这样的任何内容,因为这可能会影响/ admin网址的安全。现在,我将直接从会话中获取Authentication属性。至少我知道发生了什么事,当我切换到Shiro时,我会正确地做到这一点。 – jacekn

+0

顺便说一句:我接受,因为我的问题得到解答。谢谢。 – jacekn

+1

@jacekn将/ **规则放在所有其他规则的末尾,并且不会影响前面的规则 - 它适用于我以前从未执行的项目。 –