首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Spring Boot 2安全性-似乎不允许请求登录

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

Stack Overflow用户
提问于 2019-07-20 20:00:43
回答 1查看 156关注 0票数 0

我第一次在Spring Boot应用程序中使用Spring Security。这是Spring中我从未使用过的一部分。我已经正确配置了大部分内容,可以对用户进行身份验证,生成JWT,然后在后续请求中验证该JWT。我的问题是,我似乎不能登录。每次我发送登录请求时,我的安全筛选器都会出现错误。我已经根据我在web上找到的示例反复检查了配置,我相信我已经从身份验证中排除了我的登录路径。

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

无论如何,这是我的SecurityConfig:

代码语言:javascript
运行
复制
@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:

代码语言:javascript
运行
复制
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:

代码语言:javascript
运行
复制
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")
    }
}

据我所知,ant匹配器被正确地设置为允许登录请求通过而不对它们进行身份验证。登录接口的完整URL为POST http://localhost:8080/api/auth/login

EN

回答 1

Stack Overflow用户

发布于 2019-07-20 23:10:40

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

代码语言:javascript
运行
复制
...
.and()
.formLogin()
.loginPage("/api/auth/login")
...

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

代码语言:javascript
运行
复制
...
@Configuration
public class MvcConfig implements WebMvcConfigurer {

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

或者是一个合适的控制者。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57124493

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档