Мы пытаемся использовать Spring Security для защиты нашего веб-сервиса.Мы используем фильтр клиентов (класс, который расширяет GenericFilterBean
) для чтения веб-токена JSON из заголовка HTTP.Если токен существует, он сохраняется как 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;
}