Grails和Spring安全核心插件 - 编辑用户

时间:2016-01-12 10:48:16

标签: grails spring-security

我在编辑用户时遇到验证问题。一切正常,但每次我想编辑选定的用户我得到验证错误,第二个密码(密码确认)为空。我知道它是null,因为我没有在我的数据库中存储密码确认。我的应用程序与Grails文档的Spring Security Core插件中的用户类几乎相同,我在默认的UserController中没有更改任何内容。

如何关闭该验证讯息?

2 个答案:

答案 0 :(得分:1)

您的域类中有passwordConfirmation字段,但有约束:

passwordConfirmation bindable: true, blank: false, password: true, display: false, validator: { val, obj ->
            if (obj.id && (!obj.password )) {
                return true
            }
            if (!(obj.password == obj.passwordConfirmation)) {
                return 'passwordMismatch'
            }
            return true
        }

它不能为“空白”,必须与“密码”相同。 所以,你有两种方式:

  1. 从域类中删除passwordConfirmation并运行迁移脚本(如果使用)。
  2. 将约束更改为passwordConfirmation nullable: true 并手动启动迁移脚本或更新库(需要删除非空约束)。

答案 1 :(得分:1)

在您的情况下,它更依赖于您的业务逻辑。如果我认为您在创建页面上需要confirmPassword,但在编辑页面上您不需要它,我会说使用CommandObjects

从您的域中删除confirmPassword。使用@Validatable annotation创建命令对象。在那里写确认密码的自定义验证。根据您的需要进行调整。 此外,您可以为域提供多个命令对象,或者我们可以说这些对象独立于域,可以用于任何自定义验证或操作。

建议通过this来了解命令对象及其用法。

对于您的情况,co(简称)可能如下所示:

@Validatable
class UserCO {
    def springSecurityService

    String username
    String password
    String passwordConfirmation
    boolean enabled = true
    boolean accountExpired
    boolean accountLocked
    boolean passwordExpired

static constraints = {
        username blank: false, unique: true
        password blank: false, size: 5..60, password: true, display: false, validator: { val, obj ->
            if (!obj.id && !obj.password) {
                return 'validation.user.password'
            }
        }
        passwordConfirmation bindable: true, blank: false, password: true, display: false, validator: { val, obj ->
            if (obj.id && (!obj.password )) {
                return true
            }
            if (!(obj.password == obj.passwordConfirmation)) {
                return 'passwordMismatch'
            }
            return true
        }
    }
}

希望它有所帮助!