我有与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或有单独的程序来开发此功能时,任何人都可以帮助我如何实现此单用户会话注销。
答案 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();
}