仅针对 spring 安全性中的少数路径禁用过滤器
Disabling a filter for only a few paths in spring security
除了我想忽略的请求之外,我如何获得一个过滤器以应用于根路径之外的每个请求?这是我的例子:
我有一个 Spring 安全过滤器,如下所示:
private static class SecurityConfiguration extends WebSecurityConfigurerAdapter {
@Override
public void configure(HttpSecurity http) throws Exception {
http.csrf().disable().antMatcher("/**")
.addFilterBefore(new AuthenticationFilter(), BasicAuthenticationFilter.class);
}
@Override
public void configure(WebSecurity web) {
web.ignoring().requestMatchers(SecurityServletRequestMatchers.servletIgnoreAuthMatcher());
}
}
此过滤器填充 CustomApiToken object,其中包含我们所有的 header 信息,并将其放入 spring 安全上下文 SecurityContextHolder.getContext().setAuthentication(token)
以便于访问令牌请求控制器。
我正在尝试将 springfox 添加到项目中,这意味着我想禁用 UI 和 api 文档页面的过滤器。
我最初的尝试是在方法中添加一个子句:
@Override
public void configure(HttpSecurity http) throws Exception {
http.csrf().disable().antMatcher("/**")
.addFilterBefore(new AuthenticationFilter(), BasicAuthenticationFilter.class);
http.requestMatcher(SecurityServletRequestMatchers.servletIgnoreAuthMatcher()).headers() //.servletIgnoreAuthMatchers has all the swagger urls also
.defaultsDisabled()
.disable()
.authorizeRequests()
.anyRequest().authenticated();
}
但是我发现这只考虑了第二个子句,因为 spring 安全只接受最后一个子句。
我已经尝试过:
@Override
public void configure(HttpSecurity http) throws Exception {
http.csrf().disable()
.antMatcher("/**")
.addFilterBefore(new AuthenticationFilter(), BasicAuthenticationFilter.class)
.requestMatcher(SecurityServletRequestMatchers.servletIgnoreAuthMatcher()).headers()
.defaultsDisabled()
.disable()
.authorizeRequests()
.anyRequest().authenticated();
}
但是 springfox 上的 webfilter url 给我一个缺少身份验证令牌的错误。
我试过在这里和互联网上四处寻找,但是 none 个例子已经给了我一个可以接受的答复。
在您的自定义 AuthenticationFilter
中,您可以定义一个 RequestMatcher
并在执行您的逻辑之前使用它,如下所示:
public class AuthenticationFilter extends OncePerRequestFilter {
private final RequestMatcher ignoredPaths = new AntPathRequestMatcher("/swagger-ui");
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) {
if (this.ignoredPaths.matches(request)) {
filterChain.doFilter(request, response);
return;
}
// do your logic
filterChain.doFilter(request, response);
}
}
除了我想忽略的请求之外,我如何获得一个过滤器以应用于根路径之外的每个请求?这是我的例子:
我有一个 Spring 安全过滤器,如下所示:
private static class SecurityConfiguration extends WebSecurityConfigurerAdapter {
@Override
public void configure(HttpSecurity http) throws Exception {
http.csrf().disable().antMatcher("/**")
.addFilterBefore(new AuthenticationFilter(), BasicAuthenticationFilter.class);
}
@Override
public void configure(WebSecurity web) {
web.ignoring().requestMatchers(SecurityServletRequestMatchers.servletIgnoreAuthMatcher());
}
}
此过滤器填充 CustomApiToken object,其中包含我们所有的 header 信息,并将其放入 spring 安全上下文 SecurityContextHolder.getContext().setAuthentication(token)
以便于访问令牌请求控制器。
我正在尝试将 springfox 添加到项目中,这意味着我想禁用 UI 和 api 文档页面的过滤器。
我最初的尝试是在方法中添加一个子句:
@Override
public void configure(HttpSecurity http) throws Exception {
http.csrf().disable().antMatcher("/**")
.addFilterBefore(new AuthenticationFilter(), BasicAuthenticationFilter.class);
http.requestMatcher(SecurityServletRequestMatchers.servletIgnoreAuthMatcher()).headers() //.servletIgnoreAuthMatchers has all the swagger urls also
.defaultsDisabled()
.disable()
.authorizeRequests()
.anyRequest().authenticated();
}
但是我发现这只考虑了第二个子句,因为 spring 安全只接受最后一个子句。
我已经尝试过:
@Override
public void configure(HttpSecurity http) throws Exception {
http.csrf().disable()
.antMatcher("/**")
.addFilterBefore(new AuthenticationFilter(), BasicAuthenticationFilter.class)
.requestMatcher(SecurityServletRequestMatchers.servletIgnoreAuthMatcher()).headers()
.defaultsDisabled()
.disable()
.authorizeRequests()
.anyRequest().authenticated();
}
但是 springfox 上的 webfilter url 给我一个缺少身份验证令牌的错误。
我试过在这里和互联网上四处寻找,但是 none 个例子已经给了我一个可以接受的答复。
在您的自定义 AuthenticationFilter
中,您可以定义一个 RequestMatcher
并在执行您的逻辑之前使用它,如下所示:
public class AuthenticationFilter extends OncePerRequestFilter {
private final RequestMatcher ignoredPaths = new AntPathRequestMatcher("/swagger-ui");
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) {
if (this.ignoredPaths.matches(request)) {
filterChain.doFilter(request, response);
return;
}
// do your logic
filterChain.doFilter(request, response);
}
}