SpringSecurity定义多个过滤器链
  TEZNKK3IfmPf 2023年11月13日 23 0

在Spring Security中可以定义多个过滤器链,一个WebSerityConfigurerAdapter的实例就可以配置一个过滤器链,我们只需要配置多个WebSerityConfigurerAdapter的实例即可
SpringSecurity定义多个过滤器链
可以看到,当请求到达 FilterChainProxy 之后,FilterChainProxy 会根据请求的路径,将请求转发到不同的 过滤器链 上面去,不同的 过滤器链 对应了不同的过滤器,也就是不同的请求将经过不同的过滤器。


@Configuration
public class SecurityConfig {
     
       
    @Bean
    protected UserDetailsService userDetailsService() {
     
       
        InMemoryUserDetailsManager manager = new InMemoryUserDetailsManager();
        manager.createUser(User.withUsername("javaboy").password("{bcrypt}$2a$10$Sb1gAUH4wwazfNiqflKZve4Ubh.spJcxgHG8Cp29DeGya5zsHENqi").roles("admin", "aaa", "bbb").build());
        manager.createUser(User.withUsername("sang").password("{noop}123").roles("admin").build());
        manager.createUser(User.withUsername("吴名氏").password("{MD5}{Wucj/L8wMTMzFi3oBKWsETNeXbMFaHZW9vCK9mahMHc=}4d43db282b36d7f0421498fdc693f2a2").roles("user", "aaa", "bbb").build());
        return manager;
    }

    @Configuration
    @Order(1)
    static class DefaultWebSecurityConfig extends WebSecurityConfigurerAdapter {
     
       

        @Override
        protected void configure(HttpSecurity http) throws Exception {
     
       
            http.antMatcher("/foo/**")
                    .authorizeRequests()
                    .anyRequest().hasRole("admin")
                    .and()
                    .csrf().disable();
        }
    }

    @Configuration
    @Order(2)
    static class DefaultWebSecurityConfig2 extends WebSecurityConfigurerAdapter {
     
       

        @Override
        protected void configure(HttpSecurity http) throws Exception {
     
       
            http.antMatcher("/bar/**")
                    .authorizeRequests()
                    .anyRequest().hasRole("user")
                    .and()
                    .formLogin()
                    .permitAll()
                    .and()
                    .csrf().disable();
        }
    }
}

说明:

  1. 首先,SecurityConfig 不再需要继承自 WebSecurityConfigurerAdapter了,只是作为一个普通的配置类,加上 @Configuration 注解即可。
  2. 提供 UserDetailsService 实例,相当于是我们的数据源。
  3. 创建静态内部类继承 WebSecurityConfigurerAdapter 类,同时用 @Configuration
    注解标记静态内部类是一个配置类,配置类里边的代码就和之前的一样了,无需赘述。
  4. 每一个静态内部类相当于就是一个过滤器链的配置。
  5. 注意在静态内部类里边,我没有使用 http.authorizeRequests()
    开始,http.authorizeRequests() 配置表示该过滤器链过滤的路径是 /。在静态内部类里边,我是用了
    http.antMatcher("/bar/
    ") 开启配置,表示将当前过滤器链的拦截范围限定在
    /bar/**。所以有的时候authorizeRequests()不能放在第一个位置
  6. 当存在多个过滤器链的时候,必然会有一个优先级的问题,所以每一个过滤器链的配置类上通过 @Order(2)
    注解来标记优先级。数字越大优先级越低。请求会先进入优先级高的过滤器链中。
【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月13日 0

暂无评论

TEZNKK3IfmPf