我试图找出如何让Spring安全返回UserDetails对象为匿名用户本次通话:的Spring Security 3.1和返回匿名的UserDetails
SecurityContextHolder.getContext().getAuthentication().getPrincipal()
我知道,如果没有特殊的配置,该呼叫将返回一个字符串,而不是使用自定义的UserDetailsService实现创建的UserDetails对象,但我宁愿不经常检查“if(principal instanceof String)”。有没有办法做到这一点与Spring配置 - 一种方式,将匿名UserDetails对象存储在用户的会话上下文,直到他们登录?表面上,我想为每个客人提供一个独特的匿名UserDetails,这样我就可以跟踪它的个人用法。
我也注意到我用“PreAuthorize”注释保证的方法似乎没有兑现匿名用户的hasRole检查。我敢肯定,这是我做错事的一个症状。这里有一个例子:
@RequestMapping(value = "/almanac/new", method = RequestMethod.GET)
@PreAuthorize("hasRole('ROLE_ADMIN')")
public String newSetup(ModelMap model) {
这是我的弹簧安全上下文(除了封闭的bean节点之外,是完整的)。你可以注意到我试图启用“匿名”
<debug />
<http pattern="/js/**" security="none" />
<http pattern="/css/**" security="none" />
<http pattern="/images/**" security="none" />
<http pattern="/loggedout.jsp" security="none"/>
<http name="httpSiteMap" use-expressions="true">
<custom-filter ref="almanacUsrPwdAuthProcFilter" before="FORM_LOGIN_FILTER"/>
<intercept-url pattern="/login*" access="isAnonymous()" />
<intercept-url pattern="/home/**" access="hasRole('ROLE_USER')" />
<intercept-url pattern="/admin/**" access="hasRole('ROLE_ADMIN')" />
<intercept-url pattern="/**" access="isAnonymous()" />
<form-login login-page="/login.jsp"
default-target-url="/home.htm"
always-use-default-target="false" />
<logout logout-success-url="/loggedout.jsp" delete-cookies="JSESSIONID"/>
<session-management invalid-session-url="/timeout.jsp">
<concurrency-control max-sessions="1" error-if-maximum-exceeded="true" />
</session-management>
<anonymous enabled="true" />
</http>
<global-method-security pre-post-annotations="enabled" secured-annotations="enabled" />
<authentication-manager alias="mainAuthMgr">
<authentication-provider ref="almanacAuthenticationProvider"/>
</authentication-manager>
根据你在这里看到的代码的任何其他建议将受到欢迎。
你能解释一下你想使用匿名UserDetails吗?它包含哪些数据以及如何使用它?你不需要'',因为这是默认值。您应该看到在调试日志中报告的AnonymousAuthenticationFilter作为确认。 –
2012-01-29 18:57:14
我试图避免让“getPrincipal()”调用返回一个字符串。我希望这个调用只返回一个UserDetails实现,无论是匿名身份验证还是用户登录。我想避免为exampleof String测试“getPrincipal()”的返回值。当然,由于文档在某些领域非常模糊,特定的配置点的信息在很多章节中都很细致地分布,所以很难判断这是您应该做的事情,还是仅仅处理比较实例。 – ogradyjd 2012-01-29 19:28:40