Spring Security 返回 403 而不是 401 并创建无效的 Redis 会话 cookie

Posted

技术标签:

【中文标题】Spring Security 返回 403 而不是 401 并创建无效的 Redis 会话 cookie【英文标题】:Spring Security returns 403 instead of 401 and creates invalid Redis session cookie 【发布时间】:2021-01-28 21:58:49 【问题描述】:

我正在使用 Spring Security 和 Spring Data Redis 来跟踪具有自定义角色和权利的用户会话。当我尝试在浏览器中访问没有会话 cookie 的 PreAuthorized 端点时,它应该返回 401。相反,会创建一个新的(无效)会话 cookie,并且端点会返回 403。

这是我的安全配置:

@Configuration
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SecurityConfig extends WebSecurityConfigurerAdapter 

    @Override
    protected void configure(HttpSecurity http) throws Exception 
        http
                .authorizeRequests((authorize) -> authorize.anyRequest().authenticated())
                .csrf().disable().cors();
    

我还使用MethodSecurityConfigUserDetails 的实现来解析来自用户身份验证的自定义字段。

【问题讨论】:

添加AuthenticationFailureHandler并将响应状态编辑为401 baeldung.com/… @RoieBeck 谢谢你,但没用。在调试模式下运行后端时,我在故障处理程序中放置了一个断点,但它没有到达它。 只要确保您在经过验证后添加了这一行:.failureHandler(authenticationFailureHandler()); @RoieBeck yessir 【参考方案1】:

以下是解决方案,适用于遇到类似问题的任何人:

    @Override
    protected void configure(HttpSecurity http) throws Exception 
        http.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.NEVER).and()   //let redis handle session creation
                .csrf().disable().cors().and()
                .requestCache().disable().exceptionHandling().and()                         //prevent exception creating duplicate session
                .authorizeRequests().anyRequest().authenticated().and()                     //all endpoints need auth
                .exceptionHandling().authenticationEntryPoint(
                        new HttpStatusEntryPoint(HttpStatus.UNAUTHORIZED));                 //return 401 on no session
    

【讨论】:

以上是关于Spring Security 返回 403 而不是 401 并创建无效的 Redis 会话 cookie的主要内容,如果未能解决你的问题,请参考以下文章

Spring Security 总是返回 403 被禁止,访问被拒绝

Spring security UsernamePasswordAuthenticationToken 始终返回 403:用户凭据已过期

Spring Security 总是返回 HTTP 403 访问被拒绝 [关闭]

Spring Security 返回 403 而不是 401 并创建无效的 Redis 会话 cookie

配置 Spring Security 为 REST URL 返回 403 并重定向到其他 URL 的登录

在 Spring Security 中使用 CSRF 令牌获取 403