使用Spring Security登录后如何做某事?

时间:2015-03-06 16:28:59

标签: java spring spring-security spring-saml

我有一个Spring Web应用程序,它使用Spring SAML和Spring Security来管理登录过程。 现在我需要在正确登录后执行一些任务。特别是我必须在SecurityContext.getContext()对象中存储一些数据。

我从未使用过Spring Security / SAML,我不知道它如何管理IdP的回报。

代码中是否有任何地方通常可以在登录过程正确结束后放置代码?

我的意思是,我知道重定向页面的设置位置,但是我无法将自定义代码放在此重定向页面的Controller中,因为该页面被访问了一次以上,我需要在登录时只运行一次自定义代码时间。

3 个答案:

答案 0 :(得分:4)

最好的方法是实现接口SAMLUserDetailsService,它将自动存储您从loadUserBySAML对象返回的对象,您可以稍后从Authentication对象进行查询}。每次身份验证后都会调用一次该接口。有关详细信息和示例,请参阅the manual

另一种可能性是SecurityContext.getContext()。登录进程调用onAuthenticationSuccess方法,该方法可以访问AuthenticationSuccessHandler对象,该对象将存储在SecurityContext.getContext()中。

只需创建自己的类来实现接口Authentication(您还可以扩展一些现有的类,例如AuthenticationSuccessHandlerSimpleUrlAuthenticationSuccessHandler)。然后通过更改现有AbstractAuthenticationTargetUrlRequestHandler bean中的类来将您的实现插入securityContext.xml

问题是,successRedirectHandler对象往往是不可变的 - 所以第一种方式可能更好。

答案 1 :(得分:3)

您可以使用AuthenticationSuccessEvent。只需注册一个实现ApplicationListener的bean。

    @Component
    public class SomeSpringBean implements
                             ApplicationListener<AuthenticationSuccessEvent> {

        public onApplicationEvent(AuthenticationSuccessEvent event) {
           String userName = ((UserDetails) event.getAuthentication().
           //do stuff                                       
        }
   }

您需要注册AuthenticationEventPublisher。 看看这里:https://gist.github.com/msarhan/10834401

如果您使用自定义身份验证提供程序,您还可以在此处插入任何内容。

答案 2 :(得分:1)

您使用的是Spring的Java配置吗?

如果是这样,那么您可能在项目中有一个覆盖WebSecurityConfigurerAdapter的类。扩展此类使您可以覆盖方法configure(HttpSecurity http)。

您可以使用提供的HttpSecurity构建器对象来配置很多东西,其中一个是身份验证成功处理程序。或多或少,您可以创建一个简单的实现AuthenticationSuccessHandler的类(Spring已经为扩展构建了一些类以使其变得简单),您可以调用http.successHandler(yourSuccessHandler)将其注册到Spring Security。

实现该接口为您提供了将自定义代码放入onAuthenticationSuccess(...)方法的钩子。我认为他们也有一个失败。