我们正在尝试使用Spring Security来保护我们的Web服务。我们正在使用客户过滤器(扩展GenericFilterBean
的类)从HTTP标头读取JSON Web令牌。如果令牌存在,则将其作为PreAuthenticatedAuthenticationToken
存储在安全上下文中。受保护的资源应使用我们的客户身份验证提供程序来验证令牌是否有效,并加载用户信息(包括角色)。
问题是我没有为特定资源配置AntMatcher。
如果我使用antMatchers("/**").hasRole("USER")
,则该资源受保护,但我们不希望所有资源都匹配,因此我尝试对以下一种资源使用AntMachter:
.antMatchers(HttpMethod.GET,"/rest/security/v1/currentuser").hasRole("USER")
但是此匹配器似乎与请求的资源不匹配,因此未调用身份验证提供程序。但是我不知道为什么。我尝试了几种组合的蚂蚁模式,但没有任何效果。
我在自定义过滤器中设置了一个断点,以检查当前路径,当我调用servletRequest.getPathInfo()
时,得到的是我认为它应该是我们的蚂蚁模式的信息:/rest/security/v1/currentuser
Spring Security配置:
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.anonymous().disable()
.csrf().disable()
.authorizeRequests()
//.antMatchers("/**").hasRole("USER")
.antMatchers(HttpMethod.GET, "/rest/security/v1/currentuser").hasRole("USER")
.and()
.httpBasic()
.authenticationEntryPoint(authenticationEntryPoint())
.and()
.sessionManagement()
.sessionCreationPolicy(SessionCreationPolicy.STATELESS);
http
.addFilterBefore(new JwtAuthenticationFilter(), BasicAuthenticationFilter.class);
}
自定义过滤器:
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest httpRequest = (HttpServletRequest) servletRequest;
Optional<String> token = Optional.ofNullable(httpRequest.getHeader(HTTP_AUTHENTICATION_HEADER));
if (token.isPresent()) {
PreAuthenticatedAuthenticationToken requestAuthentication = new PreAuthenticatedAuthenticationToken(token, null);
SecurityContextHolder.getContext().setAuthentication(requestAuthentication);
}
filterChain.doFilter(servletRequest, servletResponse);
}
身份验证提供者:
@Override
public Authentication authenticate(Authentication authentication) throws AuthenticationException {
UsernamePasswordAuthenticationToken authenticationToken = null;
try {
// Token Validation, Loading User Info
} catch (Exception e) {
LOG.error("Failed to authenticate", e);
}
return authenticationToken;
}