Я раньше видел, как люди писали об этой проблеме. Проблема в том, что я хочу, чтобы все в моем контроллере /api/v1/auth/
не go проходило через цепочку фильтров JWT.
Вот как выглядит моя конфигурация безопасности
@Configuration
@EnableWebSecurity
class SecurityConfig() : WebSecurityConfigurerAdapter() {
@Autowired
lateinit var tokenService: TokenService
override fun configure(web: WebSecurity) {
web.ignoring().antMatchers(
"/v2/api-docs",
"/configuration/ui",
"/swagger-resources/**",
"/configuration/security",
"/swagger-ui.html",
"/webjars/**",
"/api/v1/auth/**",
"/api/v1/auth/request",
"/api/v1/auth/verify",
"/api/v1/auth/verify_hack",
"/api/v1/auth/refresh_token",
"/messages",
"/index.html"
)
}
override fun configure(http: HttpSecurity) {
http.cors().and().csrf()
.disable()
.sessionManagement()
.sessionCreationPolicy(SessionCreationPolicy.STATELESS)
.and()
.authorizeRequests()
.antMatchers("/api/v1/auth/**").permitAll()
.anyRequest().authenticated()
.and()
.addFilterBefore(JwtFilter(tokenService), UsernamePasswordAuthenticationFilter::class.java)
}
}
Сортировать из работ до того, где, если я попаду в конечную точку в / api / v1 / auth и DONT добавлю заголовок авторизации, он, похоже, обойдет класс фильтра jwt, если я добавлю заголовок авторизации к любому запросу, это ВСЕГДА входит в класс фильтра JWT, мне нужно, чтобы он полностью игнорировал его, что и должны делать оба метода configure
.
Вы можете спросить, почему бы просто не отправить заголовок Auth, ну, мне это особенно нужно для api/v1/auth/refresh_token
конечной точки
Это Spring Boot 2.3.0, самый последний и лучший.
TL; DR, как, черт возьми, получить конфигурацию безопасности, чтобы фактически игнорировать пути
фильтр JWT
class JwtFilter(private val tokenService: TokenService) : GenericFilterBean() {
override fun doFilter(request: ServletRequest, response: ServletResponse, chain: FilterChain) {
val token = TokenUtil.extractToken(request as HttpServletRequest)
if (token != null && token.isNotEmpty()) {
try {
tokenService.getClaims(token)
} catch (e: SignatureException) {
throw ResponseStatusException(HttpStatus.UNAUTHORIZED, "Invalid JWT Signature")
} catch (e: MalformedJwtException) {
throw ResponseStatusException(HttpStatus.UNAUTHORIZED, "Invalid JWT token")
} catch (e: ExpiredJwtException) {
throw ResponseStatusException(HttpStatus.UNAUTHORIZED, "Expired JWT token")
} catch (e: UnsupportedJwtException) {
throw ResponseStatusException(HttpStatus.UNAUTHORIZED, "Unsupported JWT exception")
} catch (e: IllegalArgumentException) {
throw ResponseStatusException(HttpStatus.UNAUTHORIZED, "Jwt claims string is empty")
}
} else {
throw ResponseStatusException(HttpStatus.UNAUTHORIZED, "Missing auth token")
}
chain.doFilter(request, response)
}
}