AccessDeniedException 上的 HTTP 401 [重复]

Posted

技术标签:

【中文标题】AccessDeniedException 上的 HTTP 401 [重复]【英文标题】:HTTP 401 on AccessDeniedException [duplicate] 【发布时间】:2022-01-18 17:57:01 【问题描述】:

我有以下安全配置和 JwtFilter:

@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
class SecurityConfig(
    val tokenService: TokenService,
) : WebSecurityConfigurerAdapter(), WebMvcConfigurer 

    override fun configure(http: HttpSecurity) 
        http
            .csrf().disable()
            .authorizeRequests()
            .anyRequest().authenticated()
            .and()
            .addFilterAt(
                JwtFilter(authenticationManager(), tokenService),
                UsernamePasswordAuthenticationFilter::class.java
            )
    


class JwtFilter(
    authManager: AuthenticationManager,
    private val tokenService: TokenService,
) : BasicAuthenticationFilter(authManager) 

    @Throws(IOException::class, ServletException::class)
    override fun doFilterInternal(
        req: HttpServletRequest,
        res: HttpServletResponse,
        chain: FilterChain
    ) 
        val header = req.getHeader("Authorization")
        if (header == null || !header.startsWith("Bearer")) 
            chain.doFilter(req, res)
            return
        
        tokenService.extractUser(header)?.also 
            SecurityContextHolder.getContext().authentication = it
        
        chain.doFilter(req, res)
    

TokenService#extractUser 抛出 AccessDeniedException 以防 JWT 解析错误。我找不到将其映射到 HTTP 401 的方法。可以做到吗?

我尝试过使用HttpSecurity#exceptionHandling() 以及在@ControllerAdvice 中添加@ExceptionHandler,但我总是收到HTTP 403。

【问题讨论】:

【参考方案1】:

感谢this 线程,我设法通过将以下两行添加到我的WebSecurityConfigurerAdapter#configure 来解决它:

.exceptionHandling()
.authenticationEntryPoint(HttpStatusEntryPoint(HttpStatus.UNAUTHORIZED))

【讨论】:

以上是关于AccessDeniedException 上的 HTTP 401 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

gsutil cors set 命令返回 403 AccessDeniedException

AccessDeniedException:用户无权对资源执行 dynamodb BatchWriteItem:表

如果使用 RoleHierarchyImpl,则 AccessDeniedException

将 AccessDeniedException 传播到 Spring Security 3.2

错误:获取备份保管库时出错:AccessDeniedException:

golang DynamoDB sdk AccessDeniedException