我是Spring Security的新手。我需要进行基于URL的身份验证,其中用户需要根据每次作为URL中的参数发送的唯一引用进行身份验证。我将这个引用传递给webservice,获取所需的数据,然后验证用户(并设置角色)。身份验证&授权部分工作正常。
然而,当我尝试再次访问应用程序时(现在在URL中使用不同的引用),它说“SecurityContextHolder没有填充匿名令牌,因为它已经包含......”并且它显示了之前的详细信息请求。我已经尝试使用清除安全上下文 SecurityContextHolder.getContext()。setAuthentication(null)和SecurityContextHolder.clearContext()。
在此之后,我能够多次访问该应用程序。但是,如果我尝试从同事机器同时访问应用程序,我会得到一个空白页面。检查日志后,我看到一条消息“SecurityContextHolder没有填充匿名令牌......”。我也试过设置会议,但我对于失去赛道的地方一无所知。
下面是我的web.xml(只有spring安全部分):
<filter>
<filter-name>springSecurityFilterChain</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
<filter-name>springSecurityFilterChain</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
<listener>
<listener-class>
org.springframework.security.web.session.HttpSessionEventPublisher
</listener-class>
</listener>
<session-config>
<session-timeout>30</session-timeout>
</session-config>
弹簧security.xml文件:
<http use-expressions="true" auto-config="false" entry-point-
ref="http403ForbiddenEntryPoint">
<intercept-url pattern="/paymentPortalInternal.*" access="hasRole('Internal')"/>
<intercept-url pattern="/paymentPortalExternal.*" access="hasRole('External')"/>
<custom-filter position="PRE_AUTH_FILTER" ref="customAuthenticationFilter"/>
<custom-filter position="CONCURRENT_SESSION_FILTER" ref="concurrencyFilter" />
<session-management session-authentication-strategy-ref="sas"/>
</http>
<beans:bean id="concurrencyFilter"
class="org.springframework.security.web.session.ConcurrentSessionFilter">
<beans:property name="sessionRegistry" ref="sessionRegistry" />
<beans:property name="expiredUrl" value="/session-expired.htm" />
</beans:bean>
<beans:bean id="http403ForbiddenEntryPoint"
class="org.springframework.security.web.authentication.Http403ForbiddenEntryPoint"/>
<beans:bean id="customAuthenticationFilter"
class="com.xxx.xxx.xxxxx.security.CustomAuthenticationFilter">
<beans:property name="sessionAuthenticationStrategy" ref="sas" />
<beans:property name="authenticationManager" ref="authenticationManager" />
</beans:bean>
<beans:bean id="sas"
class="org.springframework.security.web.authentication.session.
ConcurrentSessionControlStrategy">
<beans:constructor-arg name="sessionRegistry" ref="sessionRegistry" />
<beans:property name="maximumSessions" value="1" />
<beans:property name="exceptionIfMaximumExceeded" value="true" />
</beans:bean>
<beans:bean id="sessionRegistry"
class="org.springframework.security.core.session.SessionRegistryImpl" />
<authentication-manager alias="authenticationManager">
<authentication-provider ref="preauthAuthProvider" />
</authentication-manager>
<beans:bean id="preauthAuthProvider"
class="org.springframework.security.web.authentication.preauth.
PreAuthenticatedAuthenticationProvider">
<beans:property name="preAuthenticatedUserDetailsService">
<beans:bean class="com.XXX.XXXX.XXX.UserServiceImpl" />
</beans:property>
</beans:bean>
如果我需要提供更多信息,请与我们联系。
编辑:添加日志。
对于第一个请求:
2013-02-07 17:27:38,834 DEBUG [http-8081-2] [org.springframework.security.web.context.HttpSessionSecurityContextRepository.readSecurityContextFromSession(127)] - 目前不存在HttpSession 2013-02-07 17:27:38,834 DEBUG [http-8081-2] [org.springframework.security.web.context.HttpSessionSecurityContextRepository.loadContext(85)] - 没有来自HttpSession的SecurityContext:null。将创建一个新的。
对于第二个请求(请注意,安全上下文中的详细信息是第一个请求的详细信息):
2013-02-07 17:27:54,272 DEBUG [http-8081-2] [org.springframework.security.web.context.HttpSessionSecurityContextRepository.readSecurityContextFromSession(158)] - 从SPRING_SECURITY_CONTEXT获取有效的SecurityContext:'org。 springframework.security.core.context.SecurityContextImpl@1017293c:身份验证:org.springframework.security.web.authentication.preauth.PreAuthenticatedAuthenticationToken@1017293c:校长:org.springframework.security.core.userdetails.User@35cd3811:用户名:内部@ 5581e6e1-7e61-41bb-9257-b3c1acb96519;密码保护];启用:true; AccountNonExpired:true; credentialsNonExpired:true; AccountNonLocked:true;授权机构:内部;证书:[保护];认证:真实;详细信息:org.springframework.security.web.authentication.WebAuthenticationDetails@ffffc434:RemoteIpAddress:10.188.182.107; SessionId:null;授权机构:内部'
我的理解是安全上下文持有者存储所有用户的详细信息。但在这种情况下,我无法从不同的选项卡/浏览器启动应用程序。
答案 0 :(得分:1)
如果您的CustomAuthenticationFilter正在扩展AbstractPreAuthenticatedProcessingFilter
,则以下2个属性可能会为您提供见解。
1. checkForPrincipalChanges
2. invalidateSessionOnPrincipalChange
答案 1 :(得分:1)
我能够通过覆盖默认过滤器链(使用过滤器链代理)并仅调用所需的过滤器来解决此问题。感谢LukeTaylor和Ketan的建议。如果有人有同样的问题,请告诉我。我可以发布我的XML和其他内容。