Похоже, AntMatcher не соответствует запрошенному пути (Spring Security) - PullRequest
1 голос
/ 23 апреля 2019

Мы пытаемся использовать 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...