Spring启动安全性,仅对某些路由应用身份验证过滤器

时间:2016-08-10 14:40:50

标签: spring spring-security spring-boot

我正在构建一个Web应用程序,它将在单个应用程序中包含API和管理界面。因此,我需要两种类型的身份验证,API的基于令牌的身份验证,以及管理界面的基于表单的身份验证。

我几乎通过应用过滤器来验证API令牌,但是过滤器正在为每个请求执行,我只希望它在匹配'/api/**'的路径上执行。

希望从我的安全配置中可以清楚地知道我正在尝试做什么,但遗憾的是它没有按预期工作。

所有API请求都将启动'/ api /',而所有管理界面请求都将启动'/ admin /'。所以我希望对每个规则应用不同的安全规则。

@Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests().antMatchers("/api/account/login").permitAll();
        http.addFilterBefore(webServiceAuthenticationFilter, UsernamePasswordAuthenticationFilter.class).authorizeRequests().antMatchers("/api/**").hasAuthority("APIUSER");

        http.authorizeRequests().antMatchers("/admin/**").authenticated().and()
            .formLogin()
                .loginPage("/admin/account/login").permitAll()
                .passwordParameter("password")
                .usernameParameter("username")
                .failureUrl("/admin/account/login?error").permitAll()
                .defaultSuccessUrl("/admin/dashboard")
                .and()
            .logout()
                .logoutRequestMatcher(new AntPathRequestMatcher("/admin/account/logout"))
                .logoutSuccessUrl("/admin/account/login");

        http.exceptionHandling().accessDeniedPage("/admin/account/forbidden");
    }

2 个答案:

答案 0 :(得分:4)

有一种方法可以直接在HttpSecurity上使用HttpSecurity(或更高级的情况antMatcher),而不是{{1},根据网址配置多个requestMatchers }}!)。请参阅:https://docs.spring.io/spring-security/site/docs/current/apidocs/org/springframework/security/config/annotation/web/builders/HttpSecurity.html#antMatcher-java.lang.String-

这需要使用已定义的authorizeRequests定义多个WebSecurityConfigurerAdapter,以便Spring根据给定的url和配置顺序使用第一个适当的配置。有关详细信息,请查看http://docs.spring.io/spring-security/site/docs/current/reference/htmlsingle/#multiple-httpsecurity

上的文档

答案 1 :(得分:0)

我不知道这是否是'正确'的方法,但我设法只通过添加if来获取路由与'/ api / **'匹配时执行的过滤器代码对过滤器本身的陈述;

所以在我的过滤器中我有以下内容;

AntPathMatcher urlMatch = new AntPathMatcher();
if (urlMatch.match("/api/**", httpRequest.getRequestURI().substring(httpRequest.getContextPath().length()))) {
    // Token authentication in here
}