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)對(duì)用戶密碼進(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)對(duì)不同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令牌的存儲(chǔ)方式。
* csrfTokenRequestHandler:設(shè)置CSRF令牌的請(qǐng)求處理器。
* 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";
/**
* 它是一個(gè)過濾器(Filter)的內(nèi)部實(shí)現(xiàn)。
* 該過濾器的主要功能是處理跨站請(qǐng)求偽造(CSRF)防護(hù),確保每個(gè)請(qǐng)求都包含有效的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)對(duì)不同URL路徑的訪問控制,以及用戶的登錄、注銷和“記住我”等功能。
到此這篇關(guān)于SpringSecurity的安全過濾器鏈的文章就介紹到這了,更多相關(guān)SpringSecurity的安全過濾器鏈內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- SpringSecurity中內(nèi)置過濾器的使用小結(jié)
- springSecurity自定義登錄接口和JWT認(rèn)證過濾器的流程
- SpringSecurity中的Filter Chain(過濾器鏈)
- idea如何debug看springsecurity的過濾器順序
- SpringSecurity request過濾問題示例小結(jié)
- SpringSecurity定義多個(gè)過濾器鏈的操作代碼
- springSecurity之如何添加自定義過濾器
- SpringSecurity學(xué)習(xí)之自定義過濾器的實(shí)現(xiàn)代碼
- springSecurity過濾web請(qǐng)求的項(xiàng)目實(shí)踐
相關(guān)文章
Java 按照字節(jié)來截取字符串的代碼(不會(huì)出現(xiàn)半個(gè)漢字)
Java 按照字節(jié)來截取字符串的工具,不會(huì)出現(xiàn)半個(gè)漢字。一個(gè)中文兩個(gè)字節(jié),一個(gè)英文字符只占 1 個(gè)字節(jié)** 1. 通常我們用于前端顯示的時(shí)候,防止標(biāo)題過長2014-01-01
Netty開發(fā)及粘包實(shí)戰(zhàn)解決分析
這篇文章主要為大家介紹了Netty開發(fā)及粘包實(shí)戰(zhàn)解決分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2024-02-02
MybatisPlus 主鍵策略的幾種實(shí)現(xiàn)方法
MybatisPlus-Plus支持多種主鍵生成策略,可以通過@TableId注解的type屬性配置,主要策略包括AUTO、INPUT、ASSING_ID、ASSING_UUID和NONE,每種策略適用于不同的場(chǎng)景,下面就來介紹一下2024-10-10
Spring中@Configuration注解的Full模式和Lite模式詳解
這篇文章主要介紹了Spring中@Configuration注解的Full模式和Lite模式詳解,準(zhǔn)確來說,Full?模式和?Lite?模式其實(shí)?Spring?容器在處理?Bean?時(shí)的兩種不同行為,這兩種不同的模式在使用時(shí)候的表現(xiàn)完全不同,今天就來和各位小伙伴捋一捋這兩種模式,需要的朋友可以參考下2023-09-09
利用MultipartFile實(shí)現(xiàn)文件上傳功能
這篇文章主要為大家詳細(xì)介紹了利用MultipartFile實(shí)現(xiàn)文件上傳功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-11-11
SpringBoot整合Hutool實(shí)現(xiàn)文件上傳的使用示例
文件上傳在項(xiàng)目經(jīng)常會(huì)用到,本文主要介紹了SpringBoot整合Hutool實(shí)現(xiàn)文件上傳的使用示例,具有一定的參考價(jià)值,感興趣的可以了解一下2023-11-11

