gpt4 book ai didi

Grails spring-security - 我可以在成功操作之前拦截以检查所需的密码更改吗?

转载 作者:行者123 更新时间:2023-12-02 13:48:39 28 4
gpt4 key购买 nike

在我的系统中创建新用户后,我通过电子邮件向他们发送一个临时密码并设置 changePasswordNextLogin=true 的属性。当他们第一次登录时,我想在成功登录后拦截流程,检查此值,如果为真,则将他们重定向到更改密码操作。密码更改完成后,理想情况下我想将它们发送到预定目的地。

我一直在研究默认设置,但没有看到 - 或者更可能没有正确解释 - 任何实现这一目标的方法。似乎几乎每次我尝试在 Grails 中拼凑一些解决方案时,我都会发现有人已经用更优雅的方法来做同样的事情。是否有任何内置功能可以允许这样做?

如果没有,我将不胜感激关于实现这一目标的最佳方法的任何建议。

最佳答案

Spring Security 和 grails 插件直接对此提供了一些支持,但您还必须自己做一些工作:)

在安装 grails-spring-security 插件(并运行 S2Quickstart 脚本)时创建的域类有一个名为“passwordExpired”的属性。在创建新的用户域实例时将其设置为 true。

一旦该用户首次登录,Spring Security 核心库将抛出一个异常,您可以在登录 Controller 的 authfail 闭包中捕获该异常,将它们重定向到更改密码表单(您需要自己提供) .

这是我的一个应用程序的示例,此闭包的骨架版本应该已经包含在您的登录 Controller 中:

/**
* Callback after a failed login.
*/
def authfail = {

def msg = ''

def username =
session[UsernamePasswordAuthenticationFilter.SPRING_SECURITY_LAST_USERNAME_KEY]

def exception = session[WebAttributes.AUTHENTICATION_EXCEPTION]

if (exception) {
if (exception instanceof CredentialsExpiredException) {
msg = g.message(code: "springSecurity.errors.login.passwordExpired")
if (!springSecurityService.isAjax(request))
redirect (action:'changePassword') // <-- see below
}
// other failure checks omitted
}

if (springSecurityService.isAjax(request)) {
render([error: msg] as JSON)
}
else {
flash.message = msg
redirect controller: 'login', action:'auth', params: params
}
}

/**
* render the change pwd form
*/
def changePassword = {
[username: session[UsernamePasswordAuthenticationFilter.SPRING_SECURITY_LAST_USERNAME_KEY] ?: springSecurityService.authentication.name]
}

从您的“changePasssword” View 中,将表单提交回另一个 Controller 闭包(我将我的称为“updatePassword”,它会检查您想要的密码约束,并在域对象上保存或不保存更新的密码。

def updatePassword = {
String username = session[UsernamePasswordAuthenticationFilter.SPRING_SECURITY_LAST_USERNAME_KEY] ?: springSecurityService.authentication.name
if (!username) {
flash.message = 'Sorry, an error has occurred'
redirect controller: 'login', action:'auth'
return
}
String password = params.password
String newPassword = params.password_new
String newPassword2 = params.password_new_2
if (!password || !newPassword || !newPassword2 || newPassword != newPassword2) {
flash.message = 'Please enter your current password and a new password'
render view: 'changePassword', model: [username: username]
return
}
SecUser user = SecUser.findByUsername(username)
if (!passwordEncoder.isPasswordValid(user.password, password, null /*salt*/)) {
flash.message = 'Current password is incorrect'
render view: 'changePassword', model: [username: username]
return
}
if (passwordEncoder.isPasswordValid(user.password, newPassword, null /*salt*/)) {
flash.message = 'Please choose a different password from your current one'
render view: 'changePassword', model: [username: username]
return
}
if (!newPassword.matches(PASSWORD_REGEX)) {
flash.message = 'Password does not meet minimum requirements'
render view: 'changePassword', model: [username: username]
return
}

// success if we reach here!
user.password = springSecurityService.encodePassword(newPassword)
user.passwordExpired = false
user.save()

flash.message = 'Password changed successfully' + (springSecurityService.loggedIn ? '' : ', you can now login')
redirect uri: '/'
}

关于Grails spring-security - 我可以在成功操作之前拦截以检查所需的密码更改吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7923429/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com