SpringSecurity的安全过滤器链功能详解

 更新时间:2025年03月26日 09:49:04   作者:康小庄  
本文介绍了如何配置SpringSecurity的安全过滤器链,包括定义URL路径的访问权限、用户认证和授权配置、自定义CSRF过滤器等内容,通过这些配置,可以实现对不同URL路径的访问控制以及用户的登录、注销等功能,感兴趣的朋友一起看看吧

主要是用于配置Spring Security的安全过滤器链(SecurityFilterChain),以及定义用户认证和授权的相关配置。具体来说,代码实现了以下功能:

  • 配置安全过滤器链:定义了哪些URL路径需要进行认证,哪些路径可以匿名访问,以及如何处理登录、注销和CSRF防护等。
  • 用户认证:使用内存中的用户详情服务(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的安全过滤器链,以及定义用户认证和授权的相关配置。
     * 通过这些配置,可以实现对不同URL路径的访问控制,以及用户的登录、注销和“记住我”等功能
     */
    @Bean
    protected SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        // 配置安全过滤器链:定义了哪些URL路径需要进行认证,哪些路径可以匿名访问,以及如何处理登录、注销和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:指定认证成功后的处理器。
                logout:配置注销功能。
                httpBasic:启用HTTP基本认证。
                 */
                .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:设置CSRF令牌的存储方式。
         * csrfTokenRequestHandler:设置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:设置“记住我”功能的密钥。
    tokenValiditySeconds:设置“记住我”令牌的有效期。
     */
    @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)的内部实现。
     * 该过滤器的主要功能是处理跨站请求伪造(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的安全过滤器链,以及定义用户认证和授权的相关配置。通过这些配置,可以实现对不同URL路径的访问控制,以及用户的登录、注销和“记住我”等功能。

到此这篇关于SpringSecurity的安全过滤器链的文章就介绍到这了,更多相关SpringSecurity的安全过滤器链内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java最简洁数据结构之冒泡排序快速理解

    Java最简洁数据结构之冒泡排序快速理解

    冒泡排序是编程中数据结构绕不过的一个基础点,有关于冒泡排序的文章也有很多,但可能会比较缭乱未能理解,本章将一子u为简洁明了的例图带你通关冒泡排序
    2021-11-11
  • RocketMQ顺序消息的原理与特点

    RocketMQ顺序消息的原理与特点

    RocketMQ作为一款纯java、分布式、队列模型的开源消息中间件,支持事务消息、顺序消息、批量消息、定时消息、消息回溯等,本篇我们了解如何实现顺序消息的原理与特点
    2023-02-02
  • Java基础教程之HashMap迭代删除使用方法

    Java基础教程之HashMap迭代删除使用方法

    这篇文章主要给大家介绍了关于Java基础教程之HashMap迭代删除使用方法的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用Java具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-05-05
  • Java合并区间的实现

    Java合并区间的实现

    本文主要介绍了Java合并区间的实现,通过合理使用集合类和排序算法,可以有效地解决合并区间问题,具有一定的参考价值,感兴趣的可以了解一下
    2023-08-08
  • Android图片转换器代码分享

    Android图片转换器代码分享

    本文给大家总结了下在安卓程序中进行图片转换的方法,非常的实用,小伙伴们可以参考下。
    2015-10-10
  • BigDecimal divide除法除不尽报错的问题及解决

    BigDecimal divide除法除不尽报错的问题及解决

    这篇文章主要介绍了BigDecimal divide除法除不尽报错的问题及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-06-06
  • 如何解决TCP socket的阻塞问题

    如何解决TCP socket的阻塞问题

    这篇文章主要介绍了如何解决TCP socket的阻塞问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12
  • Springboot工具类FileCopyUtils使用教程

    Springboot工具类FileCopyUtils使用教程

    这篇文章主要介绍了Springboot内置的工具类之FileCopyUtils的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧
    2022-12-12
  • 关于servlet向mysql添加数据时中文乱码问题的解决

    关于servlet向mysql添加数据时中文乱码问题的解决

    最近在工作中遇到一个小问题,出现了中文乱码的问题,无奈只能想办法解决,下面这篇文章主要给大家介绍了关于servlet向mysql添加数据时中文乱码问题的解决方法,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-08-08
  • Java语言实现对MySql数据库中数据的增删改查操作的代码

    Java语言实现对MySql数据库中数据的增删改查操作的代码

    这篇文章主要介绍了Java语言实现对MySql数据库中数据的增删改查操作的代码,实现了连接数据库,和数据库的增删改查操作,有兴趣的可以了解一下。
    2016-12-12

最新评论