我正在为Grails应用程序使用Spring Security插件和Spring Security REST插件,并尝试实施密码更改策略。在前端,我们的应用程序在您未登录时捕获401错误,但是您的密码已过期的情况会给出完全相同的HTTP响应。我正在寻找是否有办法改变它。
我可以捕获AbstractAuthenticationFailureEvent并确定它是否是由于AuthenticationFailureCredentialsExpired事件引起的,但我不知道如何让该事件从API发送任何有意义的事件,表明这不仅仅是一个失败的密码登录。
顺便说一句,我可以使密码到期并执行该政策,这不是问题所在。主要问题是此API的使用者如何区分失败的用户名/密码质询和“您需要更改密码”方案。
答案 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状态代码。