Spring Security定义多个过滤器链(10)

打印 上一主题 下一主题

主题 869|帖子 869|积分 2607

  在Spring Security中可以同时存在多个过滤器链,一个WebSecurityConfigurerAdapter的实例就可以配置一条过滤器链。
  我们来看如下一个案例:
  1. @Configuration
  2. public class SecurityConfig {
  3.     @Bean
  4.     UserDetailsService us(){
  5.         InMemoryUserDetailsManager users = new InMemoryUserDetailsManager();
  6.         users.createUser(User.withUsername("剑气近").password("{noop}123").roles("admin").build());
  7.         return users;
  8.     }
  9.     @Configuration
  10.     @Order(1)
  11.     static class SecurityConfig01 extends WebSecurityConfigurerAdapter{
  12.         @Override
  13.         protected void configure(HttpSecurity http) throws Exception {
  14.             InMemoryUserDetailsManager users = new InMemoryUserDetailsManager();
  15.             users.createUser(User.withUsername("chain1in").password("{noop}123").roles("admin").build());
  16.             http.antMatcher("/bar/**")
  17.                     .authorizeRequests()
  18.                     .anyRequest().authenticated()
  19.                     .and()
  20.                     .formLogin()
  21.                     .loginPage("/mylogin.html")
  22.                     .loginProcessingUrl("/bar/login")
  23.                     .successHandler(((req, resp, auth) -> {
  24.                         resp.setContentType("application/json;charset=UTF-8");
  25.                         String s = new ObjectMapper().writeValueAsString(auth);
  26.                         resp.getWriter().write(s);
  27.                     }))
  28.                     .permitAll()
  29.                     .and()
  30.                     .csrf().disable()
  31.                     .userDetailsService(users);
  32.         }
  33.     }
  34.     @Configuration
  35.     @Order(2)
  36.     static class SecurityConfig02 extends WebSecurityConfigurerAdapter{
  37.         @Override
  38.         protected void configure(AuthenticationManagerBuilder auth) throws Exception {
  39.             auth.inMemoryAuthentication().withUser("chain2out").password("{noop}123").roles("admin");
  40.         }
  41.         @Override
  42.         protected void configure(HttpSecurity http) throws Exception {
  43.             InMemoryUserDetailsManager users = new InMemoryUserDetailsManager();
  44.             users.createUser(User.withUsername("chain2in").password("{noop}123").roles("admin").build());
  45.             http.antMatcher("/foo/**")
  46.                     .authorizeRequests()
  47.                     .anyRequest().authenticated()
  48.                     .and()
  49.                     .formLogin()
  50.                     .loginPage("/mylogin.html")
  51.                     .loginProcessingUrl("/foo/login")
  52.                     .successHandler(((req, resp, auth) -> {
  53.                         resp.setContentType("application/json;charset=UTF-8");
  54.                         String s = new ObjectMapper().writeValueAsString(auth);
  55.                         resp.getWriter().write(s);
  56.                     }))
  57.                     .permitAll()
  58.                     .and()
  59.                     .csrf().disable()
  60.                     .userDetailsService(users);
  61.         }
  62.     }
  63. }
复制代码
  在SecurityConfig中分别定义两个静态内部类SecurityConfig01和SecurityConfig02,两个配置类都继承自WebSecurityConfigurerAdapter, 可以分别配置一条过滤器链。
  先来看Security01,在Security01中,我们设置过滤器链的拦截规则是/bar/**,即如果请求路径是/bar/**格式的,则进入到Security01的过滤器链中进行处理。同时我们配置了局部 AuthenticationManager 对应的用户是 chain1in/123 ,由于没有重写 configure(AuthenticationManagerBuilder)方法,所以注册到 Spring 容器中的 UserDetailsService 将作为局部 AuthenticationManager的parent对应的用户,换句话说,如果登录的路径是/bar/login,那么升发者可以使用 chain1in/123和 剑气近/123两个用户进行登录。
  再来看SecurityConfig02。在Security02中,我们设置过滤器链的拦截规则是/foo/**,即如果请求路径是/foo/**格式的,则进入到Secunty02的过滤器链中进行处理,同时我们配置了局部 AuthenticationManager 对应的用户是 chain2in/123 ,由于重写了 configure(Authentication ManagerBuilder)方法,在该方法中定义了局部AuthenticationManager的parent对应的用户,此时注册到Spring容器中的UserDetailsService实例对于/foo/**过滤器链不再生效。换句话说, 如果登录路径是/foo/login,开发者可以使用chain2in/123和 chain2out/123两个用户进行登录,而不可以使用 剑气近/123进行登录。
  需要注意的是,如果配置了多个过滤器链,需要使用@Order注解来标记不同配置的优先级(即不同过滤器链的优先级),数字越大优先级越低,当请求到来时,会按照过滤器链的优先级从高往低,依次进行匹配。
  
  
 

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

前进之路

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表