欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

SpringSecurity的安全過濾器鏈功能詳解

 更新時間:2025年03月26日 09:49:04   作者:康小莊  
本文介紹了如何配置SpringSecurity的安全過濾器鏈,包括定義URL路徑的訪問權(quán)限、用戶認(rèn)證和授權(quán)配置、自定義CSRF過濾器等內(nèi)容,通過這些配置,可以實現(xiàn)對不同URL路徑的訪問控制以及用戶的登錄、注銷等功能,感興趣的朋友一起看看吧

主要是用于配置Spring Security的安全過濾器鏈(SecurityFilterChain),以及定義用戶認(rèn)證和授權(quán)的相關(guān)配置。具體來說,代碼實現(xiàn)了以下功能:

  • 配置安全過濾器鏈:定義了哪些URL路徑需要進行認(rèn)證,哪些路徑可以匿名訪問,以及如何處理登錄、注銷和CSRF防護等。
  • 用戶認(rèn)證:使用內(nèi)存中的用戶詳情服務(wù)(InMemoryUserDetailsManager)來管理用戶信息,并使用BCrypt密碼編碼器(BCryptPasswordEncoder)對用戶密碼進行加密
@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)配置。
     * 通過這些配置,可以實現(xiàn)對不同URL路徑的訪問控制,以及用戶的登錄、注銷和“記住我”等功能
     */
    @Bean
    protected SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        // 配置安全過濾器鏈:定義了哪些URL路徑需要進行認(rèn)證,哪些路徑可以匿名訪問,以及如何處理登錄、注銷和CSRF防護
        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防護。
         * csrfTokenRepository:設(shè)置CSRF令牌的存儲方式。
         * csrfTokenRequestHandler:設(shè)置CSRF令牌的請求處理器。
         * ignoringRequestMatchers:忽略某些URL路徑的CSRF防護。
         */
        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)部實現(xiàn)。
     * 該過濾器的主要功能是處理跨站請求偽造(CSRF)防護,確保每個請求都包含有效的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)配置。通過這些配置,可以實現(xiàn)對不同URL路徑的訪問控制,以及用戶的登錄、注銷和“記住我”等功能。

到此這篇關(guān)于SpringSecurity的安全過濾器鏈的文章就介紹到這了,更多相關(guān)SpringSecurity的安全過濾器鏈內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java 按照字節(jié)來截取字符串的代碼(不會出現(xiàn)半個漢字)

    Java 按照字節(jié)來截取字符串的代碼(不會出現(xiàn)半個漢字)

    Java 按照字節(jié)來截取字符串的工具,不會出現(xiàn)半個漢字。一個中文兩個字節(jié),一個英文字符只占 1 個字節(jié)** 1. 通常我們用于前端顯示的時候,防止標(biāo)題過長
    2014-01-01
  • Java如何從Redis中批量讀取數(shù)據(jù)

    Java如何從Redis中批量讀取數(shù)據(jù)

    這篇文章主要介紹了Java如何從Redis中批量讀取數(shù)據(jù)的情況,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-05-05
  • Netty開發(fā)及粘包實戰(zhàn)解決分析

    Netty開發(fā)及粘包實戰(zhàn)解決分析

    這篇文章主要為大家介紹了Netty開發(fā)及粘包實戰(zhàn)解決分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2024-02-02
  • Java空集合使用場景與填坑記錄

    Java空集合使用場景與填坑記錄

    這篇文章主要給大家介紹了關(guān)于Java空集合使用場景與填坑的相關(guān)資料,并且給大家介紹了java判斷集合是否為空的方法,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-08-08
  • MybatisPlus 主鍵策略的幾種實現(xiàn)方法

    MybatisPlus 主鍵策略的幾種實現(xiàn)方法

    MybatisPlus-Plus支持多種主鍵生成策略,可以通過@TableId注解的type屬性配置,主要策略包括AUTO、INPUT、ASSING_ID、ASSING_UUID和NONE,每種策略適用于不同的場景,下面就來介紹一下
    2024-10-10
  • JAVA讀取PDF、WORD文檔實例代碼

    JAVA讀取PDF、WORD文檔實例代碼

    本篇文章主要通過實例代碼介紹了JAVA讀取PDF、WORD文檔,需要的朋友可以參考下
    2017-04-04
  • Spring中@Configuration注解的Full模式和Lite模式詳解

    Spring中@Configuration注解的Full模式和Lite模式詳解

    這篇文章主要介紹了Spring中@Configuration注解的Full模式和Lite模式詳解,準(zhǔn)確來說,Full?模式和?Lite?模式其實?Spring?容器在處理?Bean?時的兩種不同行為,這兩種不同的模式在使用時候的表現(xiàn)完全不同,今天就來和各位小伙伴捋一捋這兩種模式,需要的朋友可以參考下
    2023-09-09
  • MyBatis流式查詢的三種實現(xiàn)方法

    MyBatis流式查詢的三種實現(xiàn)方法

    流式查詢指的是查詢成功后不是返回一個集合而是返回一個迭代器,應(yīng)用每次從迭代器取一條查詢結(jié)果,本文介紹了MyBatis流式查詢的實現(xiàn),感興趣的可以了解一下
    2021-05-05
  • 利用MultipartFile實現(xiàn)文件上傳功能

    利用MultipartFile實現(xiàn)文件上傳功能

    這篇文章主要為大家詳細(xì)介紹了利用MultipartFile實現(xiàn)文件上傳功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-11-11
  • SpringBoot整合Hutool實現(xiàn)文件上傳的使用示例

    SpringBoot整合Hutool實現(xiàn)文件上傳的使用示例

    文件上傳在項目經(jīng)常會用到,本文主要介紹了SpringBoot整合Hutool實現(xiàn)文件上傳的使用示例,具有一定的參考價值,感興趣的可以了解一下
    2023-11-11

最新評論