Spring 安全,为什么第二个 WebSecurityConfigurerAdapter 不工作?

Spring Security, Why second WebSecurityConfigurerAdapter is not working?

更新:

在第一个 WebSecurityConfigurerAdapter 中添加 .antMatcher("/admin/**") 现在可以使用了,这是为什么?

现在第一个 WebSecurityConfigurerAdapter 的配置方法是:

        protected void configure(HttpSecurity http) throws Exception {
            http
                .antMatcher("/admin/**")                 // <<<<<<<<<<<<<<--- newly added
                    .authorizeRequests()
                    .antMatchers("/admin/**").hasRole("ADM")
                    .and()
                .formLogin()
                    .loginPage("/admin/login")
                    .permitAll()
                .logout()
                    .permitAll();
        }

我的站点分为两部分,一部分供用户使用,另一部分供管理员使用,因此我在我的网络应用程序中为每个部分配置了两个 WebSecurityConfigurerAdapter。

像这样:

@Configuration
@EnableWebSecurity
public class WebSecurityConfig  {

    @Configuration
    @Order(1)
    public static class ManagerSecurityConfigurationAdapter extends WebSecurityConfigurerAdapter {
        @Autowired
        private ManagerDetailsService managerDetailsService;

        //allow access to static resouces
        @Override
        public void configure(WebSecurity web) throws Exception {
            web.ignoring().antMatchers("/pc/css/**", "/pc/js/**", "/pc/img/**");
            web.ignoring().antMatchers("/mobile/css/**", "/mobile/js/**", "/mobile/img/**");
        }

        protected void configure(HttpSecurity http) throws Exception {
            http
                    .authorizeRequests()
                    .antMatchers("/admin/**").hasRole("ADM")
                    .and()
                .formLogin()
                    .loginPage("/admin/login")
                    .permitAll()
                .logout()
                    .permitAll();
        }

        @Override
        public void configure(AuthenticationManagerBuilder auth) throws Exception {
            auth
                .userDetailsService(managerDetailsService);
        }
    }

    @Configuration
    @Order(2)
    public static class UserLoginWebSecurityConfigurerAdapter extends WebSecurityConfigurerAdapter {

        @Autowired
        private WeUserDetailsService weUserDetailsService;

        @Override
        protected void configure(HttpSecurity http) throws Exception {

            http
                .authorizeRequests()
                    .antMatchers("/user/**").hasRole("USER")
                    .anyRequest().authenticated()
                    .and()
                .formLogin()
                    .loginPage("/user/login")
                    .permitAll()
                .logout()
                    .permitAll();

            http.addFilterBefore(new WeAuthenticationFilter(authenticationManager()), BasicAuthenticationFilter.class);
        }

        @Override
        protected void configure(AuthenticationManagerBuilder auth) throws Exception {
            auth.userDetailsService(weUserDetailsService);
        }
    }
}

问题是第二个 WebSecurityConfigurerAdapter 不工作,如果我在浏览器中输入:/admin,它会按预期将我带到 /admin/login,

而如果我输入 /user,它会直接进入控制器中的操作,通过安全过滤器。

这是为什么?

原因首先是WebSecurityConfigurerAdapter的

        http
            .authorizeRequests()

这将匹配所有的 url,使第二个 UserLoginWebSecurityConfigurerAdapter 无用,添加 antMatcher 可以帮助限制它可以匹配的 url,这就是添加的原因 .antMatcher("/admin/**") 可以工作。