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

时间:2015-10-13 21:26:44

标签: grails spring-security spring-security-rest

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

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

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

2 个答案:

答案 0 :(得分:2)

找到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")
            }
        }

答案 1 :(得分:1)

我找到了一个基于Burt Beckwith对此帖子的回应的解决方案:Grails Spring Security Login/Logout Controllers not generated

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