如何自定义 Grails Spring Security REST 登录响应 HTTP 代码

Posted

技术标签:

【中文标题】如何自定义 Grails Spring Security REST 登录响应 HTTP 代码【英文标题】:How to customize Grails Spring Security REST login response HTTP code 【发布时间】:2016-01-11 19:25:41 【问题描述】:

我正在为 Grails 应用程序使用 Spring Security 插件和 Spring Security REST 插件,并尝试实施密码更改策略。在前端,当您未登录时,我们的应用程序会捕获 401 错误,但您的密码已过期的情况会给出完全相同的 HTTP 响应。我正在寻找是否有办法改变它。

我可以捕获 AbstractAuthenticationFailureEvent 并确定它是否是由于 AuthenticationFailureCredentialsExpired 事件造成的,但我不知道如何让该事件从 API 中发送任何有意义的信息,表明这不仅仅是失败的密码登录。

顺便说一句,我可以使密码过期并执行该策略,所以这不是问题。主要问题是此 API 的使用者如何区分失败的用户名/密码质询和“您需要更改密码”场景。

【问题讨论】:

这已经在这里被问及回答了:***.com/a/33692352/2923710 【参考方案1】:

找到 LoginController.groovy

这里是相关的代码authfail方法

        Exception exception = session[WebAttributes.AUTHENTICATION_EXCEPTION]
        if (exception) 
            if (exception instanceof AccountExpiredException) 
                msg = g.message(code: "springSecurity.errors.login.expired")
             else if (exception instanceof CredentialsExpiredException) 
                msg = g.message(code: "springSecurity.errors.login.passwordExpired")
             else if (exception instanceof DisabledException) 
                msg = g.message(code: "springSecurity.errors.login.disabled")
             else if (exception instanceof LockedException) 
                msg = g.message(code: "springSecurity.errors.login.locked")
             else 
                msg = g.message(code: "springSecurity.errors.login.fail")
            
        

【讨论】:

【参考方案2】:

我根据 Burt Beckwith 对这篇帖子的回复找到了一个解决方案:Grails Spring Security Login/Logout Controllers not generated

spring security REST 插件有一个名为 RestAuthenticationFailureHandler 的类,我将它复制到我的项目中并重写了。当调用 onAuthenticationFailure 方法时,我会检查错误的类型是否为 org.springframework.security.authentication.CredentialsExpiredException,如果是,我会发出比预配置更合适的 HTTP 状态代码。

【讨论】:

以上是关于如何自定义 Grails Spring Security REST 登录响应 HTTP 代码的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 grails 1.3.2 和插件 spring-security-core 1 实现自定义 FilterSecurityInterceptor?

如何在 Spring Security Grails 上自定义 /login/authenticate?

Grails spring security如何在自定义身份验证中记住我?

如何自定义 Grails Spring Security Core 2 登录/注销控制器和视图?

如何使用 JOSSO 和 Spring Security 从 Grails 应用程序中的 LDAP 获取自定义属性?

如何在grails spring security自定义UserDetailsS​​ervices类中获取url参数?