|
|
@@ -16,13 +16,18 @@ import org.springframework.security.config.annotation.web.builders.WebSecurity;
|
|
|
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
|
|
|
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
|
|
|
import org.springframework.security.config.http.SessionCreationPolicy;
|
|
|
+import org.springframework.security.core.session.SessionRegistry;
|
|
|
import org.springframework.security.web.authentication.AuthenticationFailureHandler;
|
|
|
import org.springframework.security.web.authentication.AuthenticationSuccessHandler;
|
|
|
import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;
|
|
|
import org.springframework.security.web.authentication.logout.LogoutHandler;
|
|
|
import org.springframework.security.web.authentication.logout.LogoutSuccessHandler;
|
|
|
+import org.springframework.security.web.authentication.session.*;
|
|
|
import org.springframework.security.web.context.SecurityContextPersistenceFilter;
|
|
|
|
|
|
+import java.util.ArrayList;
|
|
|
+import java.util.List;
|
|
|
+
|
|
|
/**
|
|
|
* Web 应用安全配置
|
|
|
*
|
|
|
@@ -43,16 +48,19 @@ public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
|
|
|
private final AuthenticationFailureHandler failureHandler;
|
|
|
private final LogoutHandler logoutHandler;
|
|
|
private final LogoutSuccessHandler logoutSuccessHandler;
|
|
|
+ private final SessionRegistry sessionRegistry;
|
|
|
|
|
|
public WebSecurityConfig(AccountAuthProvider userAuthProvider, AccountAuthService accountAuthService,
|
|
|
AuthenticationSuccessHandler successHandler, AuthenticationFailureHandler failureHandler,
|
|
|
- LogoutHandler logoutHandler, LogoutSuccessHandler logoutSuccessHandler) {
|
|
|
+ LogoutHandler logoutHandler, LogoutSuccessHandler logoutSuccessHandler,
|
|
|
+ SessionRegistry sessionRegistry) {
|
|
|
this.userAuthProvider = userAuthProvider;
|
|
|
this.accountAuthService = accountAuthService;
|
|
|
this.successHandler = successHandler;
|
|
|
this.failureHandler = failureHandler;
|
|
|
this.logoutHandler = logoutHandler;
|
|
|
this.logoutSuccessHandler = logoutSuccessHandler;
|
|
|
+ this.sessionRegistry = sessionRegistry;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
@@ -82,7 +90,7 @@ public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
|
|
|
|
|
|
// 配置 FilterChainProxy 过滤器链
|
|
|
http.addFilterAfter(new LoginRedirectFilter(), SecurityContextPersistenceFilter.class);
|
|
|
- http.addFilterBefore(accountAuthFilter(), UsernamePasswordAuthenticationFilter.class);
|
|
|
+ http.addFilterBefore(accountAuthFilter(sessionRegistry), UsernamePasswordAuthenticationFilter.class);
|
|
|
|
|
|
// 禁用 UsernamePasswordAuthenticationFilter, 使用自定义的 AccountAuthFilter
|
|
|
http.formLogin().disable();
|
|
|
@@ -151,14 +159,31 @@ public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
|
|
|
* @return
|
|
|
* @date 2022-07-06 上午9:54
|
|
|
*/
|
|
|
- private AccountAuthFilter accountAuthFilter() throws Exception {
|
|
|
+ @Bean
|
|
|
+ public AccountAuthFilter accountAuthFilter(SessionRegistry sessionRegistry) throws Exception {
|
|
|
AccountAuthFilter filter = new AccountAuthFilter(loginApi, "POST", accountAuthService);
|
|
|
filter.setAuthenticationManager(super.authenticationManager());
|
|
|
filter.setAuthenticationSuccessHandler(successHandler);
|
|
|
filter.setAuthenticationFailureHandler(failureHandler);
|
|
|
+ filter.setSessionAuthenticationStrategy(sessionAuthenticationStrategy(sessionRegistry));
|
|
|
return filter;
|
|
|
}
|
|
|
|
|
|
+ public CompositeSessionAuthenticationStrategy sessionAuthenticationStrategy(SessionRegistry sessionRegistry){
|
|
|
+ ConcurrentSessionControlAuthenticationStrategy controlAuthenticationStrategy =
|
|
|
+ new ConcurrentSessionControlAuthenticationStrategy(sessionRegistry);
|
|
|
+ // 设置帐号同时登录的最大数量
|
|
|
+ controlAuthenticationStrategy.setMaximumSessions(1);
|
|
|
+ //controlAuthenticationStrategy.setExceptionIfMaximumExceeded(true);
|
|
|
+
|
|
|
+ List<SessionAuthenticationStrategy> authenticationStrategies = new ArrayList<>();
|
|
|
+ authenticationStrategies.add(controlAuthenticationStrategy);
|
|
|
+ authenticationStrategies.add(new SessionFixationProtectionStrategy());
|
|
|
+ authenticationStrategies.add(new RegisterSessionAuthenticationStrategy(sessionRegistry));
|
|
|
+
|
|
|
+ return new CompositeSessionAuthenticationStrategy(authenticationStrategies);
|
|
|
+ }
|
|
|
+
|
|
|
/**
|
|
|
* 角色继承
|
|
|
* ADMIN 可以访问 USER 的权限,反之不可
|