在Spring Boot和OAuth2应用程序中禁用同一用户的多次登录

时间:2019-02-18 09:54:41

标签: spring-boot oauth-2.0 netflix-zuul

我有与zuul api-gateway一起使用的微服务架构应用程序,并添加了Oauth2安全功能。现在,我可以在多个会话中使用同一用户登录(我的意思是多个浏览器和多个计算机)。所以我想限制同一用户的多次登录。

我使用以下代码限制了同一用户的登录。当我执行oauth注销时,此代码可以完美地工作。但是当用户登录并关闭其浏览器或清除其浏览器cookie时,我遇到了问题。

static SessionRegistry sessionRegistry;

@Override
    protected void configure(HttpSecurity http) throws Exception
    {
        http.csrf().disable().authorizeRequests().antMatchers("/login", "/logout").permitAll().anyRequest()
        .authenticated().and().formLogin().loginPage("/login")
        .failureHandler(loginAuthenticationFailureHandler).permitAll().and().logout().and().authorizeRequests()
        .anyRequest().authenticated()
        .and()
        .sessionManagement()
        .maximumSessions(1)
        .maxSessionsPreventsLogin(true)
        .sessionRegistry(sessionRegistry);
    }

 @Bean
    public ServletListenerRegistrationBean<HttpSessionEventPublisher> httpSessionEventPublisher() {
        return new ServletListenerRegistrationBean<HttpSessionEventPublisher>(new HttpSessionEventPublisher());
    }

在关闭浏览器并清除cookie或有单独的程序来开发此功能时,任何人都可以帮助我如何实现此单用户会话注销。

1 个答案:

答案 0 :(得分:0)

我尝试使用相同的方法来实现实现以使用sessionManagement配置,但是它对我没有用,在我的情况下,我只需要删除多个登录名,使新的登录名消失或以前的登录名,请使用InMemoryTokenStore扩展名进行。

@Component
public class ResetTokenStore extends InMemoryTokenStore {

 @Override
 public OAuth2AccessToken getAccessToken(OAuth2Authentication authentication) {
    OAuth2AccessToken accessToken = super.getAccessToken(authentication);

    if(accessToken != null) {
        removeAccessToken(accessToken);
        removeRefreshToken(accessToken.getRefreshToken());
    }

    return null;
 }
}

基本上,我的工作是强制令牌更新,每次生成并登录新令牌时,都会删除以前生成的accesstoken和refreshtoken。

在扩展AuthorizationServerConfigurerAdapter的类中:

@Override
public void configure(AuthorizationServerEndpointsConfigurer endpoints) {
    endpoints.tokenStore(tokenStore())
            .accessTokenConverter(accessTokenConverter())
            .reuseRefreshTokens(false)
            .userDetailsService(userDetailsService)
            .authenticationManager(authenticationManager);
}

@Bean
public TokenStore tokenStore() {
    return new ResetTokenStore();
}