我正在构建一个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");
}
答案 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
}