Spring Security: Как разрешить доступ неавторизованным клиентам?

На REST только несколько методов требуют, чтобы пользователь был авторизован. Остальные методы должны быть доступны для всех
Для авторизации написал кастомный фильтр, унаследованный от AbstractAuthenticationProcessingFilter. Фильтр обрабатывает все запросы, поступающие на REST. Если в запросе нет токена, то attemptAuthentication возвращает
SecurityContextHolder.getContext().getAuthentication();

Если быть точным, то AnonymousAuthenticationToken
Как нужно настроить HttpSecurity, чтобы доступ ко всем методам REST был у всех пользователей? Кроме методов, помеченных @Secured

Реализация attemptAuthentication в моем фильтре:
@Override
    public Authentication attemptAuthentication(HttpServletRequest request,
                                                HttpServletResponse response)
            throws AuthenticationException, IOException, ServletException {
        String token = request.getHeader(HEADER_TOKEN);
        if (token == null) {
            return SecurityContextHolder.getContext().getAuthentication();
        }

        TokenAuthentication authentication = new TokenAuthentication(token);
        return getAuthenticationManager().authenticate(authentication);
    }


Текущая настройка, которая не работает:
@Override
    protected void configure(HttpSecurity http) throws Exception {
        http
                .authorizeRequests()
                    .anyRequest()
                    .permitAll()
            .and()
                .httpBasic()
                .authenticationEntryPoint(entryPoint);
    }
  • Вопрос задан
  • 3045 просмотров
Решения вопроса 1
@kir55rus Автор вопроса
Проблему решил, установив флаг фильтра continueChainBeforeSuccessfulAuthentication = true
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
r0zh0k
@r0zh0k
Site Reliability Engineer
Пишете матчер на все и разрешаете его всем. Нужные эндпоинты – закрываете, например:
@Override
    protected void configure(final HttpSecurity http) throws Exception {
        http
            .sessionManagement()
                .sessionCreationPolicy(SessionCreationPolicy.STATELESS).and()
            .csrf().disable()
            .exceptionHandling().and()
            .anonymous().and()
            .servletApi().and()
            .authorizeRequests()
            .antMatchers(HttpMethod.GET, "/api/**").permitAll()
            .antMatchers(HttpMethod.POST, "/api/**").permitAll()
            .anyRequest().authenticated().and()
            .addFilterBefore(
                    new AuthFilter(),
                    UsernamePasswordAuthenticationFilter.class
            );
    }
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы