Spring Security,为什么第二个WebSecurityConfigurerAdapter无效?

时间:2016-05-23 02:27:46

标签: spring spring-security spring-java-config

更新

在第一个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();
        }

我的网站分为两个部分,一个用于用户,另一个用于管理员,因此我在我的网络应用中为每个部分配置了两个WebSecurityConfigurerAdapters。

像这样:

@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,它将通过安全过滤器直接在控制器中执行操作。

为什么会这样?

1 个答案:

答案 0 :(得分:1)

原因是WebSecurityConfigurerAdapter的第一个

        http
            .authorizeRequests()

这将匹配所有网址,使第二个UserLoginWebSecurityConfigurerAdapter无用,添加antMatcher可以帮助限制它可以匹配的网址,这就是为什么添加 .antMatcher("/admin/**")可以发挥作用。