我已经实现了映射到特定URL "/partner/login" 的自定义安全机制,其中我正在使用我自己的子类 AbstractAuthenticationProcessingFilter ,它生成一个由 AuthenticationProvider 的实现验证的子类 AbstractAuthenticationToken . 成功后我调用 SimpleUrlAuthenticationSuccessHandler ,它将尝试重定向到"/UserProfile" . 这 "/partner/login" 处理来自我们的合作伙伴的SSO请求 . 在开发过程中,我们使用Spring Security的默认登录形式模拟我们的内部登录过程,这就是auto-config为真的原因 .
最初我使用以下(spring security)配置进行开发:
<http auto-config="true">
<intercept-url pattern="/**/*.jsp" access="ROLE_USER, ROLE_PARTNER_USER"/>
<custom-filter after = "FORM_LOGIN_FILTER" ref = "partnerSsoAuthFilter"/>
</http>
Now this works as expected ,我在重定向到"/UserProfile"后从SecurityContextHolder获取Authentication对象
一旦我在使用自定义过滤器链映射的 生产环境 ( spring 安全)配置中使用这些问题,问题就开始了 . (我们在 生产环境 中使用CAS进行自己的登录)
<bean id="springSecurityFilterChain" class="org.springframework.security.web.FilterChainProxy">
<sec:filter-chain-map path-type="ant">
<sec:filter-chain pattern="/partner/login" filters="sif,partnerSsoAuthFilter,etfPartner,fsi" />
<sec:filter-chain pattern="/" filters="casValidationFilter, wrappingFilter" />**
<sec:filter-chain pattern="/secure/receptor" filters="casValidationFilter" />
<sec:filter-chain pattern="/j_spring_security_logout" filters="logoutFilter,etf,fsi" />
***More filters***
</sec:filter-chain-map>
</bean>
这里sif,etf,fsi是常规的SecurityContextPersistenceFilter,ExceptionTranslationFilter和FilterSecurityInterceptor .
使用此配置,当重定向到"/UserDetails" SecurityContextHolder.getContext().getAuthentication() returns null 时,我仍然可以访问放置在会话中的身份验证对象 .
我对这种行为感到困惑 . 我在“/ partner / login”的两种情况下都使用相同的自定义过滤器/提供者/令牌等 . 为什么在一种情况下getAuthentication()不为null而在另一种情况下它为null?任何帮助都会很棒 . TIA .
1 回答
我有一个想法,但我根本不确定(我没有任何与SS CAS的过期,我不喜欢在conf中手动声明SS过滤器) . 我知道有一个
SecurityContextPersistenceFilter
负责填充SecurityContextHolder . 请检查它是否在您的dev配置中被触发?如果它被解雇,请为您的 生产环境 环境检查相同的内容 . 希望这可以帮助 .