如何将auth成功处理程序分配给多个Spring安全领域

时间:2016-10-16 10:19:56

标签: java spring spring-mvc authentication spring-security

我有两个独立的安全领域,即管理区域和前端区域的以下Spring安全配置类:

@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled=true)
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
    @Autowired
    private CustomUserDetailsServiceImpl userDetailsService;

    @Configuration
    @Order(1)
    public static class AdminAreaConfiguration  extends WebSecurityConfigurerAdapter {
        @Autowired
        private AuthSuccessAdmin authSuccessAdmin; 

        @Override
        protected void configure(HttpSecurity http) throws Exception {
            http
                .requestMatcher(new AntPathRequestMatcher("/admin/**"))
                .csrf().disable()  
                .authorizeRequests()
                    .antMatchers("/admin/login/login.html").permitAll()
                    .antMatchers("/admin/**").hasRole("ADMIN")
                    .anyRequest().authenticated()
                    .and()
                .formLogin()
                    .loginPage("/admin/login.html")
                    .permitAll()
                    .successHandler(authSuccessAdmin)
                    .and()
                .logout()
                    .permitAll();

        }
    }

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

        @Autowired
        private AuthSuccessFrontend authSuccessFrontend;

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

            http
                    .requestMatcher(new AntPathRequestMatcher("/**"))
                    .csrf().disable()  
                    .authorizeRequests()
                        .antMatchers("/about", "/register").permitAll()
                        .antMatchers("/**").hasRole("USER")
                        .anyRequest().authenticated()
                        .and()
                    .formLogin()
                        .loginPage("/login")
                        .permitAll()
                        .successHandler(authSuccessFrontend)
                        .and()
                    .logout()
                        .permitAll();
        }
    }
}

当应用程序启动时,管理区域的身份验证成功处理程序将被前端区域的身份验证处理程序覆盖,该处理程序在第一个之后加载。登录管理区域时会导致错误的重定向(重定向到前端auth成功处理程序中定义的url)。如何将分配处理程序分配给单独的配置?

1 个答案:

答案 0 :(得分:1)

问题似乎是在RequestMatcher模式中。 您的 USER 应用程序具有RequestMatcher模式' / **'(表示将包含路径/管理员之后的任何内容),它将覆盖您的 ADMIN RequestMatcher模式/ admin / ** 将用户RequestMatcher更改为/ user / **