Spring Security OAuth2 (URI авторизованного перенаправления Google) — Для доступа к этому ресурсу требуется полная аутентификация

#java #spring #spring-boot #oauth-2.0

Вопрос:

Я пытаюсь реализовать вход OAuth2 (Google) в свой REST api с помощью Spring Boot. Когда я пытаюсь получить http://localhost:8080/api/login/oauth2/code/google (мой авторизованный URI перенаправления Google) я получаю сообщение об исключении Для доступа к этому ресурсу требуется полная аутентификация. Как я могу отключить Spring Security, чтобы получить этот URI из моего api ? Без весенней защиты это работает.

Мой SecurityConfig.class

 @Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true, jsr250Enabled = true)
@RequiredArgsConstructor
@Profile("dev")
public class SecurityConfig extends WebSecurityConfigurerAdapter implements WebMvcConfigurer {

    private final JwtFilter jwtFilter;

    @Override
    public void configure(WebSecurity web) throws Exception {
        web.ignoring().antMatchers("/v2/api-docs",
                "/configuration/ui",
                "/swagger-resources/**",
                "/configuration/security",
                "/swagger-ui.html",
                "/webjars/**");
    }

    @Override
    public void configure(HttpSecurity http) throws Exception {
        http.cors()
                .and()
                    .csrf().disable()
                    .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
                .and()
                    .exceptionHandling().authenticationEntryPoint(authenticationEntryPoint())
                .and()
                    .authorizeRequests()
                    .antMatchers("/auth/sign-up").permitAll()
                    .antMatchers("/auth/sign-in").permitAll()
                    .antMatchers("/auth/refresh").permitAll()
                    .anyRequest()
                    .authenticated()
                .and()
                    .oauth2Login()
                .and()
                    .addFilterBefore(jwtFilter, UsernamePasswordAuthenticationFilter.class);
    }
 

Мой JwtFilter.class

 @Component
public class JwtFilter extends GenericFilterBean {
private final JwtProvider jwtProvider;

public JwtFilter(JwtProvider jwtProvider) {
    this.jwtProvider = jwtProvider;
}

@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {

    String token = jwtProvider.resolveToken((HttpServletRequest) servletRequest);
    if (!((HttpServletRequest) servletRequest).getRequestURL().toString().endsWith("auth/refresh")) {
        try {
            if (token != null amp;amp; jwtProvider.validateToken(token)) {
                Authentication authentication = jwtProvider.getAuthentication(token);
                if (authentication != null) {
                    SecurityContextHolder.getContext().setAuthentication(authentication);
                }
            }
        } catch (JwtAuthenticationException e) {
            SecurityContextHolder.clearContext();
            throw new JwtAuthenticationException("Access token is expired or invalid");
        }
    }
    filterChain.doFilter(servletRequest, servletResponse);
}
 

}

Мой файл свойств

 spring:
  security:
    oauth2:
      client:
        registration:
          google:
            client-id: <id>
            client-secret: <secret>
 

Комментарии:

1. Я не вижу никакого правила, разрешающего доступ к этому URL-адресу. (Обратите также внимание, что поддержка JWT доступна из коробки в Spring Security; вам не следует писать свой собственный фильтр.)

2. Как я могу добавить это правило к этому URL-адресу ? Если я добавлю его в метод настройки с помощью .antMatchers(…).permitAny (), это не сработает.