#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 (), это не сработает.