我需要使用特定的标头(例如“ sessionId”)来实现授权,并保护除一个以外的所有uri。
我扩展了OncePerRequestFilter
并实现了自定义AuthenticationProvider
,以检查sessionId是否有效(以及自定义令牌类等)。
现在如何工作:对于 any uri,它会在应用AuthSessionAuthenticationProvider
之后立即跳至authenticate
的{{1}}方法,如果标头{未指定{1}}。但是我希望某些uri允许不带该标头的访问。
这一切:
config:
AuthSessionFilter
过滤器:
sessionId
提供者:
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests().antMatchers(permittedUris).permitAll()
.anyRequest().authenticated()
.and().exceptionHandling().accessDeniedHandler(new AuthSessionAccessDeniedHandler())
.and().addFilterBefore(new AuthSessionFilter(), BasicAuthenticationFilter.class);
}
答案 0 :(得分:0)
我发现了专门为此目的开发的更优雅的解决方案。
这是RequestHeaderAuthenticationFilter
。然后antMatchers
会按预期工作。初始配置如下所示:
@Bean
@SneakyThrows
public RequestHeaderAuthenticationFilter preAuthenticationFilter() {
RequestHeaderAuthenticationFilter preAuthenticationFilter = new RequestHeaderAuthenticationFilter();
preAuthenticationFilter.setPrincipalRequestHeader(SESSION_ID);
preAuthenticationFilter.setCredentialsRequestHeader(SESSION_ID);
preAuthenticationFilter.setExceptionIfHeaderMissing(false);
preAuthenticationFilter.setContinueFilterChainOnUnsuccessfulAuthentication(true);
preAuthenticationFilter.setAuthenticationManager(authenticationManager());
return preAuthenticationFilter;
}