Kotlin Spring security + JWT - 401 на конечной точке регистрации - PullRequest
0 голосов
/ 12 апреля 2020

Я работаю над приложением, чтобы узнать больше об аутентификации jwt, и у меня проблема с регистрацией. Я положил URL-адрес регистрации в antMatchers, чтобы разрешить все, но это не работает. Вот код:

   const val AUTH_LOGIN_URL = "/library/authenticate"
   const val SIGN_UP_URL = "/library/signup"

Конфигурация безопасности:

override fun configure(http: HttpSecurity?) {
    http?.cors()?.and()
            ?.csrf()?.disable()
            ?.authorizeRequests()
            ?.antMatchers(SIGN_UP_URL, AUTH_LOGIN_URL)?.permitAll()
            ?.anyRequest()?.authenticated()
            ?.and()
            ?.exceptionHandling()?.authenticationEntryPoint(authenticationEntryPoint)
            ?.and()
            ?.sessionManagement()
            ?.sessionCreationPolicy(SessionCreationPolicy.STATELESS)

    http?.addFilterBefore(jwtRequestFilter, UsernamePasswordAuthenticationFilter::class.java)
}

Фильтр JWT:

@Component
class JwtRequestFilter(
        @Autowired
        val jwtTokenProvider: JwtTokenProvider,
        @Autowired
        val customUserDetailsService: CustomUserDetailsService
) : OncePerRequestFilter() {

    override fun doFilterInternal(request: HttpServletRequest, response: HttpServletResponse, filterChain: FilterChain) {

        var username: String
        var jwtToken = getJwtFromRequrst(request)


        try {
            if (!StringUtils.isEmpty(jwtToken)) {
                username = jwtTokenProvider.getUsernameFromToken(jwtToken)
                val userDetails = customUserDetailsService.loadUserByUsername(username)
                val authentication = UsernamePasswordAuthenticationToken(userDetails, null, emptyList())
                authentication.details = WebAuthenticationDetailsSource().buildDetails(request)
                SecurityContextHolder.getContext().authentication = authentication
            }
        } catch (e: Exception) {
            logger.error("Could not set user authentication in security context", e)
        }
        filterChain.doFilter(request, response)
    }

    private fun getJwtFromRequrst(request: HttpServletRequest): String {
        val bearerToken = request.getHeader(TOKEN_HEADER)
        if (!StringUtils.isEmpty(bearerToken) && bearerToken.startsWith(TOKEN_PREFIX)) {
            return bearerToken.substring(7, bearerToken.length)
        }
        return ""
    }
}

Точка входа:

@Component
class WebSecurityEntryPoint: AuthenticationEntryPoint {

    override fun commence(request: HttpServletRequest?, response: HttpServletResponse?, authException: AuthenticationException?) {
        response?.sendError(HttpServletResponse.SC_UNAUTHORIZED, "Access denied")
    }
}

Используя SIGN_UP_URL, я всегда получаю 401. Не могли бы вы мне помочь?

1 Ответ

0 голосов
/ 12 апреля 2020

Хорошо. Я разрешаю проблему:

Я изменил контроллер, добавив сопоставление запроса:

@RestController
@RequestMapping("/auth")
class AuthenticationController 

, а затем в конфигурации безопасности:

?.antMatchers("/auth/**")?.permitAll()

Он начинает работать .

Я думаю, что это была проблема:

?.antMatchers(SIGN_UP_URL, AUTH_LOGIN_URL)?.permitAll()

Может быть, если я объявлю это один за другим, это также будет работать

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...