|
|
@@ -1,10 +1,11 @@
|
|
|
package cn.reghao.devops.manager.rbac.security;
|
|
|
|
|
|
import cn.reghao.devops.manager.rbac.security.filter.LoginRedirectFilter;
|
|
|
-import cn.reghao.devops.manager.rbac.security.form.UserDetailsServiceImpl;
|
|
|
+import cn.reghao.devops.manager.rbac.security.form.AccountAuthFilter;
|
|
|
import cn.reghao.devops.manager.rbac.security.form.AccountAuthProvider;
|
|
|
-import cn.reghao.devops.manager.rbac.security.handler.WebAuthFailureHandlerImpl;
|
|
|
-import cn.reghao.devops.manager.rbac.security.handler.WebAuthSuccessHandlerImpl;
|
|
|
+import cn.reghao.devops.manager.rbac.security.handler.AuthFailHandlerImpl;
|
|
|
+import cn.reghao.devops.manager.rbac.security.handler.AuthSuccessHandlerImpl;
|
|
|
+import cn.reghao.devops.manager.rbac.service.AccountAuthService;
|
|
|
import org.springframework.context.annotation.Bean;
|
|
|
import org.springframework.context.annotation.Configuration;
|
|
|
import org.springframework.security.access.expression.SecurityExpressionHandler;
|
|
|
@@ -18,7 +19,10 @@ import org.springframework.security.config.annotation.web.configuration.EnableWe
|
|
|
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
|
|
|
import org.springframework.security.web.FilterInvocation;
|
|
|
import org.springframework.security.web.access.expression.DefaultWebSecurityExpressionHandler;
|
|
|
+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.context.SecurityContextPersistenceFilter;
|
|
|
|
|
|
/**
|
|
|
* Web 应用安全配置
|
|
|
@@ -30,10 +34,19 @@ import org.springframework.security.web.authentication.UsernamePasswordAuthentic
|
|
|
@EnableWebSecurity
|
|
|
@EnableGlobalMethodSecurity(prePostEnabled = true) // 调用方法时检查权限
|
|
|
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
|
|
|
- private final UserDetailsServiceImpl userDetailsService;
|
|
|
+ private final String loginApi = "/login";
|
|
|
|
|
|
- public WebSecurityConfig(UserDetailsServiceImpl userDetailsService) {
|
|
|
- this.userDetailsService = userDetailsService;
|
|
|
+ private final AccountAuthProvider userAuthProvider;
|
|
|
+ private final AccountAuthService accountAuthService;
|
|
|
+ private final AuthenticationSuccessHandler successHandler;
|
|
|
+ private final AuthenticationFailureHandler failureHandler;
|
|
|
+
|
|
|
+ public WebSecurityConfig(AccountAuthProvider userAuthProvider, AccountAuthService accountAuthService,
|
|
|
+ AuthenticationSuccessHandler successHandler, AuthenticationFailureHandler failureHandler) {
|
|
|
+ this.userAuthProvider = userAuthProvider;
|
|
|
+ this.accountAuthService = accountAuthService;
|
|
|
+ this.successHandler = successHandler;
|
|
|
+ this.failureHandler = failureHandler;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
@@ -65,14 +78,12 @@ public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
|
|
|
.anyRequest().authenticated();
|
|
|
http.exceptionHandling().accessDeniedPage("/deny");
|
|
|
|
|
|
- // 禁用 CSRF
|
|
|
- http.csrf().disable();
|
|
|
-
|
|
|
// 处理 X-Frame-Options header
|
|
|
http.headers().frameOptions().sameOrigin();
|
|
|
|
|
|
// 在 UsernamePasswordAuthenticationFilter 后添加 filter
|
|
|
- http.addFilterAfter(new LoginRedirectFilter(), UsernamePasswordAuthenticationFilter.class);
|
|
|
+ http.addFilterAfter(new LoginRedirectFilter(), SecurityContextPersistenceFilter.class);
|
|
|
+ http.addFilterBefore(accountAuthFilter(), UsernamePasswordAuthenticationFilter.class);
|
|
|
|
|
|
// 基于表单的认证
|
|
|
http.formLogin()
|
|
|
@@ -80,16 +91,27 @@ public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
|
|
|
.loginPage("/login")
|
|
|
// 登录接口(POST 请求)
|
|
|
.loginProcessingUrl("/login")
|
|
|
- .successHandler(new WebAuthSuccessHandlerImpl())
|
|
|
- .failureHandler(new WebAuthFailureHandlerImpl())
|
|
|
+ .successHandler(new AuthSuccessHandlerImpl())
|
|
|
+ .failureHandler(new AuthFailHandlerImpl())
|
|
|
.and()
|
|
|
.logout()
|
|
|
.logoutSuccessUrl("/")
|
|
|
.and()
|
|
|
.httpBasic().disable();
|
|
|
|
|
|
- // HTTP Basic 认证
|
|
|
- http.httpBasic();
|
|
|
+ // 配置 RememberMeAuthenticationFilter, 禁用 RememberMeAuthenticationFilter
|
|
|
+ http.rememberMe().disable();
|
|
|
+ /*.key("DExNzAyNTQ2Nzo3NDI3MTNhYmM5MGE5")
|
|
|
+ .rememberMeParameter("rememberMe");*/
|
|
|
+
|
|
|
+ // 配置 CorsFilter, 禁用 CorsFilter
|
|
|
+ http.cors().disable();
|
|
|
+
|
|
|
+ // 配置 CsrfFilter, 禁用 CsrfFilter
|
|
|
+ http.csrf().disable();
|
|
|
+
|
|
|
+ // 配置 HeaderWriterFilter, 禁用 HeaderWriterFilter
|
|
|
+ http.headers().disable();
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
@@ -101,9 +123,22 @@ public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
|
|
|
*/
|
|
|
@Override
|
|
|
public void configure(AuthenticationManagerBuilder auth) throws Exception {
|
|
|
- //auth.userDetailsService(userDetailsService);
|
|
|
- // TODO 尝试使用 DaoAuthenticationProvider
|
|
|
- auth.authenticationProvider(new AccountAuthProvider(userDetailsService));
|
|
|
+ auth.authenticationProvider(userAuthProvider);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 配置账号密码登录 filter
|
|
|
+ *
|
|
|
+ * @param
|
|
|
+ * @return
|
|
|
+ * @date 2022-07-06 上午9:54
|
|
|
+ */
|
|
|
+ private AccountAuthFilter accountAuthFilter() throws Exception {
|
|
|
+ AccountAuthFilter filter = new AccountAuthFilter(loginApi, "POST", accountAuthService);
|
|
|
+ filter.setAuthenticationManager(super.authenticationManager());
|
|
|
+ filter.setAuthenticationSuccessHandler(successHandler);
|
|
|
+ filter.setAuthenticationFailureHandler(failureHandler);
|
|
|
+ return filter;
|
|
|
}
|
|
|
|
|
|
/**
|