【问题标题】:AuthenticationSuccessEvent never firedAuthenticationSuccessEvent 从未触发
【发布时间】:2016-09-03 11:38:58
【问题描述】:

我正在编写用户使用 facebook 登录的应用程序。

我的安全配置/应用程序类:

@SpringBootApplication
@EnableOAuth2Sso
@ComponentScan(basePackages = { "app" })
public class Application extends WebSecurityConfigurerAdapter {

    @SuppressWarnings("SpringJavaAutowiringInspection")
    @Autowired
    private OAuth2ClientContext oauth2ClientContext;

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
                .antMatcher("/**")
                .authorizeRequests()
                .antMatchers("/",
                        "/login**",
                        "/webjars/**",
                        "/bower_components/**",
                        "/assets/**",
                        "/app/**",
                        "/api/auth/isAuthenticated")
                .permitAll()
                .anyRequest()
                .authenticated()
                .and().formLogin().defaultSuccessUrl("/", true).loginPage("/login").permitAll()
                .and().logout().logoutSuccessUrl("/").permitAll()
                .and().addFilterBefore(ssoFilter(), BasicAuthenticationFilter.class);
    }

    @Bean
    @ConfigurationProperties("facebook")
    ClientResources facebook() {
        return new ClientResources();
    }

    private Filter ssoFilter() {
        CompositeFilter filter = new CompositeFilter();
        List<Filter> filters = new ArrayList<>();
        filters.add(ssoFilter(facebook(), "/login/facebook"));
        filter.setFilters(filters);
        return filter;
    }

    private Filter ssoFilter(ClientResources client, String path) {
        OAuth2ClientAuthenticationProcessingFilter filter = new OAuth2ClientAuthenticationProcessingFilter(path);
        OAuth2RestTemplate facebookTemplate = new OAuth2RestTemplate(client.getClient(), oauth2ClientContext);
        filter.setRestTemplate(facebookTemplate);
        filter.setTokenServices(new UserInfoTokenServices(client.getResource().getUserInfoUri(), client.getClient().getClientId()));
        return filter;
    }

    class ClientResources {
        private OAuth2ProtectedResourceDetails client = new AuthorizationCodeResourceDetails();
        private ResourceServerProperties resource = new ResourceServerProperties();

        public OAuth2ProtectedResourceDetails getClient() {
            return client;
        }

        public ResourceServerProperties getResource() {
            return resource;
        }
    }

我的问题是即使我配置了监听器:

package app;
    @Component
    public class AuthenticationListener implements ApplicationListener<AuthenticationSuccessEvent> {

        @Override
        public void onApplicationEvent(AuthenticationSuccessEvent event) {
            System.out.println("Event fired");
        }
    }

它永远不会被解雇。我尝试了这里提供的解决方案:Spring boot OAuth successful login listener not triggering,但它也无济于事。 SecurityContextHolder.getContext().getAuthentication().isAuthenticated()登录后返回true。

【问题讨论】:

    标签: java spring spring-security oauth spring-boot


    【解决方案1】:

    OAuth SSO 支持确实不会触发 AuthenticationSuccessEvent。这也是我最近一直面临的问题。这是is implemented now,但尚未发布。

    【讨论】:

    • 那么有解决方法吗?我的意思是成功登录后如何执行某些操作?
    • 我猜。更糟糕的是,我还修复了与此相关的an issue in Spring Boot。我最好的猜测是您应该尝试自己注册OAuth2ClientAuthenticationProcessingFilter 。检查实现中的更改,您可能可以在自己的扩展中反向移植。
    猜你喜欢
    • 2017-04-25
    • 1970-01-01
    • 1970-01-01
    • 2014-06-20
    • 2013-05-10
    • 1970-01-01
    • 2012-08-25
    • 2019-04-18
    • 1970-01-01
    相关资源
    最近更新 更多