Spring Boot Security не будет игнорировать определенные пути, которые не нужно защищать - PullRequest
0 голосов
/ 14 июля 2020

Я раньше видел, как люди писали об этой проблеме. Проблема в том, что я хочу, чтобы все в моем контроллере /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)
    }

}

Ответы [ 2 ]

1 голос
/ 14 июля 2020

Вы можете добавить этот метод в свой JwtFilter

class JwtFilter(private val tokenService: TokenService) : GenericFilterBean() {

    override fun doFilter(request: ServletRequest, response: ServletResponse, chain: FilterChain) {
        if (request.getRequestURI().startsWith("/api/v1/auth/")) {
           filterChain.doFilter(request, response);
           return;
        }

        val token = TokenUtil.extractToken(request as HttpServletRequest)
        ....
0 голосов
/ 14 июля 2020

Что вы можете сделать, так это добавить проверку в свой фильтр, чтобы исключить URL, который вы не хотите фильтровать.

добавьте этот код в свой фильтр

String path = request.getRequestURI();
if ("/urltoexclude".equals(path)) {
    filterChain.doFilter(request, response);
    return;
}

вот подробнее о том, как исключить URL из фильтра. https://www.baeldung.com/spring-exclude-filter

...