Spring Boot 2安全性-似乎不允许请求登录

时间:2019-07-20 12:00:43

标签: spring spring-boot spring-security

因此,我第一次在Spring Boot应用程序中使用Spring Security。这是我以前从未使用过的Spring的一部分。我已经正确配置了大多数东西,以对用户进行身份验证,生成JWT,然后在后续请求中验证该JWT。但是,我的问题是我似乎无法登录。每次发送登录请求时,都会从安全筛选器中收到错误消息。我已经根据我在网络上找到的示例反复检查了配置,并且我认为我已将登录路径从身份验证中排除了。我希望有人能帮助我。

顺便说一下,这是一个使用Kotlin的项目。

无论如何,这是我的SecurityConfig:

@Configuration
class SecurityConfig (
        private val jwtTokenProvider: JwtTokenProvider
) : WebSecurityConfigurerAdapter() {

    override fun configure(http: HttpSecurity?) {
        http?.let {
            http.csrf().disable()
                    .authorizeRequests()
                        .antMatchers("/api/auth/**").permitAll()
                        .anyRequest().authenticated()
                    .and()
                        .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)

            http.apply(JwtTokenFilterConfigurer(jwtTokenProvider))
        }
    }

    @Bean
    fun passwordEncoder(): PasswordEncoder {
        return BCryptPasswordEncoder(12)
    }
}

这是JwtTokenFilterConfigurer:

class JwtTokenFilterConfigurer (
        private val jwtTokenProvider: JwtTokenProvider
) : SecurityConfigurerAdapter<DefaultSecurityFilterChain, HttpSecurity>() {

    override fun configure(http: HttpSecurity?) {
        http?.let {
            val jwtFilter = JwtTokenFilter(jwtTokenProvider)
            http.addFilterBefore(jwtFilter, UsernamePasswordAuthenticationFilter::class.java)
        }
    }
}

这是我的JwtTokenFilter:

class JwtTokenFilter (
        private val jwtTokenProvider: JwtTokenProvider
) : OncePerRequestFilter() {

    override fun doFilterInternal(req: HttpServletRequest, resp: HttpServletResponse, chain: FilterChain) {
        val token = jwtTokenProvider.resolveToken(req)
        token?.let {
            try {
                if (!jwtTokenProvider.validateToken(token)) {
                    throw ApiUnauthorizedException("User is unauthorized")
                }
                val auth = jwtTokenProvider.getAuthentication(token)
                SecurityContextHolder.getContext().authentication = auth
                chain.doFilter(req, resp)
                return
            }
            catch (ex: Exception) {
                SecurityContextHolder.clearContext()
                throw ex
            }
        }

        throw ApiUnauthorizedException("User is unauthorized")
    }
}

据我所知,蚂蚁匹配器已正确设置为允许登录请求通过而无需对其进行身份验证。登录API的完整URL为POST http://localhost:8080/api/auth/login

我们非常感谢您的帮助。非常感谢。

1 个答案:

答案 0 :(得分:0)

尝试在配置中添加登录路径:

...
.and()
.formLogin()
.loginPage("/api/auth/login")
...

我假设您已经配置了一个视图/控制器。像这样简单的东西:

...
@Configuration
public class MvcConfig implements WebMvcConfigurer {

@Override
public void addViewControllers(final ViewControllerRegistry registry) {
    registry.addViewController("/api/auth/login");
    ...

或适当的控制器。