我应该同时使用SocialAuthenticationFilter和ProviderSignInController吗?

7

简而言之

使用ProviderSigninController时,认证事件不会被触发。如何使用完整的Spring安全集成?

详细说明

据我所知,我已经有一个功能正常的Spring-social设置,如下所示:

ProviderSignInController用于创建社交连接,并在出现新用户时自动提供用户帐户。我使用了一个SignInAdapter,如文档中所示

我还拥有一个基于regular spring-security的认证服务,使用UserDetailsService。

然而,我看到的一个区别是,社交认证登录不会引发任何*AuthenticationEvents。这些事件由常规帐户的过滤器引发。

我想知道-我是否缺少此集成的某些部分?
不通过SocialAuthenticationFilter,仅手动设置auth上下文似乎有点脆弱。

我希望有一个集中记录身份验证事件的地方。


我有同样的问题。你有任何关于这个的消息吗?谢谢。 - alexanoid
1
不好意思,我不确定自从我发布这篇文章以来 Spring Security 是否有任何改进/更新。 - Rob Shepherd
1个回答

2
我曾经遇到过类似的情况,在使用Spring Security的SocialAuthenticationFilter进行授权和隐式注册时,我不想使用ProviderSignInController(我同意使用该控制器感觉有点不妥),于是我将其挂钩上去了。虽然大部分功能可用,但我失去了由普通登录提供的onAuthenticationSuccess事件。
为了让我的过滤器按照我的需求工作,我最终在其中添加了一个ObjectPostProcessor。这使我可以在SpringSocialConfigurer中深入初始化过滤器后(没有控制权),手动设置我的AuthenticationSuccessHandler。
以下是片段。
            // Spring Social configurer integrates with Spring Security for us
            .and().apply(new SpringSocialConfigurer()
                    .postLoginUrl("/")
                    // other setup
                    .addObjectPostProcessor(new ObjectPostProcessor<SocialAuthenticationFilter>() {
                        @Override
                        public <O extends SocialAuthenticationFilter> O postProcess(O filter) {
                            filter.setAuthenticationSuccessHandler(loginSuccessHandler);
                            return filter;    
                        }
                    });

loginSuccessHandler,就是我通过.formLogin().successHandler(loginSuccessHandler)在普通过滤器配置中设置的相同bean。

你也可以在这里设置failureHandler

这个解决方案满足了我的需求。现在的解决方案使用了我的SocialUserDetailsService进行身份验证,并使用ConnectionSignUp进行隐式注册(当在UsersConnectionRepository上注册时)。

希望这能帮到你。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接