具有多个身份验证提供程序的Spring Boot设置(API +浏览器)

时间:2016-06-29 14:53:38

标签: spring spring-security spring-boot

我的应用程序同时提供API和浏览器。我已经对所有自定义提供程序和过滤器实施了API令牌身份验证。现在配置似乎会干扰浏览器版本。

我有两个问题,我需要有关如何解决的建议,因为我在挖掘文档和其他示例后没有得到任何答案。

1)尽管有请求,我的StatelessAuthenticationFilter仍被调用 来自浏览器。我有例如将请求匹配器指定为" / api / **"。那是为什么?

2)AuthenticationManager尚未注册两个AuthenticationProvider。这是我调试StatelessAuthenticationFilter被错误调用后的结论。

这是我拥有的配置类

@Configuration
@EnableWebSecurity
public class WebSecurityConfig {


    @Order(1)
    @Configuration
    public static class A extends WebSecurityConfigurerAdapter {
        @Autowired
        TokenAuthenticationProvider tokenAuthenticationProvider;

        @Autowired
        ApiEntryPoint apiEntryPoint;

        @Override
        protected void configure(HttpSecurity http) throws Exception {
            StatelessAuthenticationFilter filter = new StatelessAuthenticationFilter();
            AntPathRequestMatcher requestMatcher = new AntPathRequestMatcher("/api/**");
            filter.setRequiresAuthenticationRequestMatcher(requestMatcher);
            filter.setAuthenticationManager(super.authenticationManager());

            http.csrf().disable()
                    .exceptionHandling().authenticationEntryPoint(apiEntryPoint)
                    .and()
                    .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
                    .and()
                    .addFilterBefore(filter, UsernamePasswordAuthenticationFilter.class);
        }

        @Override
        protected void configure(AuthenticationManagerBuilder auth) throws Exception {
            auth.authenticationProvider(tokenAuthenticationProvider);
        }

        @Override
        public void configure(WebSecurity web) throws Exception {
            web.ignoring().antMatchers("/api/user/register");

        }
    }

    @Configuration
    public static class B extends WebSecurityConfigurerAdapter {
        @Override
        protected void configure(AuthenticationManagerBuilder auth) throws Exception {
            auth.authenticationProvider(new DaoAuthenticationProvider());
        }    
    }    
}

如您所见,B类没有指定任何内容,但是当我访问localhost:8080时,会调用StatelessAuthenticationFilter。这是怎么回事?

1 个答案:

答案 0 :(得分:0)

在A类中,您正在配置StatelessAuthenticationFilter以使用requestMatcher。无论你做什么,春天都不知道或不关心。 您还必须使用

限制安全配置
  http.antMatcher("/api/**")   

否则为每个URI配置它,并且将为每个请求调用StatelessAuthenticationFilter,完全如您所述。

您还应该使用@Order注释A和B类,如multiple-httpsecurity中的示例所示