SpringSecurity的安全過濾器鏈功能詳解
主要是用于配置Spring Security的安全過濾器鏈(SecurityFilterChain),以及定義用戶認(rèn)證和授權(quán)的相關(guān)配置。具體來說,代碼實(shí)現(xiàn)了以下功能:
- 配置安全過濾器鏈:定義了哪些URL路徑需要進(jìn)行認(rèn)證,哪些路徑可以匿名訪問,以及如何處理登錄、注銷和
CSRF防護(hù)等。 - 用戶認(rèn)證:使用內(nèi)存中的用戶詳情服務(wù)(
InMemoryUserDetailsManager)來管理用戶信息,并使用BCrypt密碼編碼器(BCryptPasswordEncoder)對用戶密碼進(jìn)行加密
@Configuration(proxyBeanMethods = false)
public class SecuritySecureConfig {
private final AdminServerProperties adminServer;
private final SecurityProperties security;
public SecuritySecureConfig(AdminServerProperties adminServer, SecurityProperties security) {
this.adminServer = adminServer;
this.security = security;
}
/**
* 用于配置Spring Security的安全過濾器鏈,以及定義用戶認(rèn)證和授權(quán)的相關(guān)配置。
* 通過這些配置,可以實(shí)現(xiàn)對不同URL路徑的訪問控制,以及用戶的登錄、注銷和“記住我”等功能
*/
@Bean
protected SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
// 配置安全過濾器鏈:定義了哪些URL路徑需要進(jìn)行認(rèn)證,哪些路徑可以匿名訪問,以及如何處理登錄、注銷和CSRF防護(hù)
SavedRequestAwareAuthenticationSuccessHandler successHandler = new SavedRequestAwareAuthenticationSuccessHandler();
successHandler.setTargetUrlParameter("redirectTo");
successHandler.setDefaultTargetUrl(this.adminServer.path("/"));
http.authorizeHttpRequests((authorizeRequests) -> authorizeRequests //
.requestMatchers(new AntPathRequestMatcher(this.adminServer.path("/assets/**")))
.permitAll()
.requestMatchers(new AntPathRequestMatcher(this.adminServer.path("/actuator/info")))
.permitAll()
.requestMatchers(new AntPathRequestMatcher(adminServer.path("/actuator/health")))
.permitAll()
.requestMatchers(new AntPathRequestMatcher(this.adminServer.path("/login")))
.permitAll()
.dispatcherTypeMatchers(DispatcherType.ASYNC)
.permitAll()
.anyRequest()
.authenticated())
/*
formLogin:配置表單登錄。
loginPage:指定自定義的登錄頁面。
successHandler:指定認(rèn)證成功后的處理器。
logout:配置注銷功能。
httpBasic:啟用HTTP基本認(rèn)證。
*/
.formLogin(
(formLogin) -> formLogin.loginPage(this.adminServer.path("/login")).successHandler(successHandler))
.logout((logout) -> logout.logoutUrl(this.adminServer.path("/logout")))
.httpBasic(Customizer.withDefaults());
/*
* addFilterAfter:在指定的過濾器之后添加自定義的CSRF過濾器。
* csrf:配置CSRF防護(hù)。
* csrfTokenRepository:設(shè)置CSRF令牌的存儲方式。
* csrfTokenRequestHandler:設(shè)置CSRF令牌的請求處理器。
* ignoringRequestMatchers:忽略某些URL路徑的CSRF防護(hù)。
*/
http.addFilterAfter(new CustomCsrfFilter(), BasicAuthenticationFilter.class)
.csrf((csrf) -> csrf.csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse())
.csrfTokenRequestHandler(new CsrfTokenRequestAttributeHandler())
.ignoringRequestMatchers(
new AntPathRequestMatcher(this.adminServer.path("/instances"), "POST"),
new AntPathRequestMatcher(this.adminServer.path("/instances/*"), "DELETE"),
new AntPathRequestMatcher(this.adminServer.path("/actuator/**"))
));
http.rememberMe((rememberMe) -> rememberMe.key(UUID.randomUUID().toString()).tokenValiditySeconds(1209600));
return http.build();
}
/*
rememberMe:配置“記住我”功能。
key:設(shè)置“記住我”功能的密鑰。
tokenValiditySeconds:設(shè)置“記住我”令牌的有效期。
*/
@Bean
public InMemoryUserDetailsManager userDetailsService(PasswordEncoder passwordEncoder) {
UserDetails user = User.withUsername("macro")
.password(passwordEncoder.encode("123456"))
.roles("USER")
.build();
return new InMemoryUserDetailsManager(user);
}
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
}自定義CSRF過濾器
public class CustomCsrfFilter extends OncePerRequestFilter {
public static final String CSRF_COOKIE_NAME = "XSRF-TOKEN";
/**
* 它是一個過濾器(Filter)的內(nèi)部實(shí)現(xiàn)。
* 該過濾器的主要功能是處理跨站請求偽造(CSRF)防護(hù),確保每個請求都包含有效的CSRF令牌
*/
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
throws ServletException, IOException {
CsrfToken csrf = (CsrfToken) request.getAttribute(CsrfToken.class.getName());
if (csrf != null) {
Cookie cookie = WebUtils.getCookie(request, CSRF_COOKIE_NAME);
String token = csrf.getToken();
if (cookie == null || token != null && !token.equals(cookie.getValue())) {
cookie = new Cookie(CSRF_COOKIE_NAME, token);
cookie.setPath("/");
response.addCookie(cookie);
}
}
filterChain.doFilter(request, response);
}
}用于配置Spring Security的安全過濾器鏈,以及定義用戶認(rèn)證和授權(quán)的相關(guān)配置。通過這些配置,可以實(shí)現(xiàn)對不同URL路徑的訪問控制,以及用戶的登錄、注銷和“記住我”等功能。
到此這篇關(guān)于SpringSecurity的安全過濾器鏈的文章就介紹到這了,更多相關(guān)SpringSecurity的安全過濾器鏈內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- SpringSecurity中內(nèi)置過濾器的使用小結(jié)
- springSecurity自定義登錄接口和JWT認(rèn)證過濾器的流程
- SpringSecurity中的Filter Chain(過濾器鏈)
- idea如何debug看springsecurity的過濾器順序
- SpringSecurity request過濾問題示例小結(jié)
- SpringSecurity定義多個過濾器鏈的操作代碼
- springSecurity之如何添加自定義過濾器
- SpringSecurity學(xué)習(xí)之自定義過濾器的實(shí)現(xiàn)代碼
- springSecurity過濾web請求的項(xiàng)目實(shí)踐
相關(guān)文章
Java最簡潔數(shù)據(jù)結(jié)構(gòu)之冒泡排序快速理解
冒泡排序是編程中數(shù)據(jù)結(jié)構(gòu)繞不過的一個基礎(chǔ)點(diǎn),有關(guān)于冒泡排序的文章也有很多,但可能會比較繚亂未能理解,本章將一子u為簡潔明了的例圖帶你通關(guān)冒泡排序2021-11-11
BigDecimal divide除法除不盡報錯的問題及解決
這篇文章主要介紹了BigDecimal divide除法除不盡報錯的問題及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-06-06
Springboot工具類FileCopyUtils使用教程
這篇文章主要介紹了Springboot內(nèi)置的工具類之FileCopyUtils的使用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧2022-12-12
關(guān)于servlet向mysql添加數(shù)據(jù)時中文亂碼問題的解決
最近在工作中遇到一個小問題,出現(xiàn)了中文亂碼的問題,無奈只能想辦法解決,下面這篇文章主要給大家介紹了關(guān)于servlet向mysql添加數(shù)據(jù)時中文亂碼問題的解決方法,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面來一起看看吧。2017-08-08
Java語言實(shí)現(xiàn)對MySql數(shù)據(jù)庫中數(shù)據(jù)的增刪改查操作的代碼
這篇文章主要介紹了Java語言實(shí)現(xiàn)對MySql數(shù)據(jù)庫中數(shù)據(jù)的增刪改查操作的代碼,實(shí)現(xiàn)了連接數(shù)據(jù)庫,和數(shù)據(jù)庫的增刪改查操作,有興趣的可以了解一下。2016-12-12

