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

Grails和spring安全核心插件-编辑用户,grails,spring-security,Grails,Spring Security,我在编辑用户时遇到验证问题。一切正常,但每次我想编辑选定的用户,我得到的验证错误,第二个密码(密码确认)是空的。我知道它是空的,因为我没有在数据库中存储密码确认。我的应用程序和Grails文档的SpringSecurityCorePluginforGrails中的用户类几乎相同,在默认的UserController中我并没有做任何更改 如何关闭该验证消息?您的域类中有passwordConfirmation字段,该字段具有约束: passwordConfirmation bindable: tr

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


如何关闭该验证消息?

您的域类中有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
        }
它不能为“空白”,并且必须与“密码”相同。 因此,您有两种方法:

  • 从域类中删除passwordConfirmation并运行迁移脚本(如果使用)
  • 将约束更改为
    passwordConfirmation null:true
    并手动启动迁移脚本或更新库(需要删除NOTNULL约束)

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

    从域中删除confirmPassword。使用
    @Validatable注释创建命令对象。请在此处编写自定义验证以确认密码。根据你的需要调整它。
    此外,一个域可以有多个command对象,或者我们可以说这些对象独立于域,可以用于任何自定义验证或操作

    建议您仔细阅读以了解命令对象及其用法

    对于您的情况,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
            }
        }
    }
    

    希望有帮助

    一,。若我从域类中删除passwordConfirmation,那个么在将用户添加到数据库时,它应该去哪里工作,并检查两个密码是否相同?2.我并没有将passwordConfirmation存储在数据库中,所以不需要将其更改为nullable:true(我试过了,但它不起作用)。在我单击“编辑用户”时,会立即显示确认密码不能为null的消息。因为您有不应为null的解释,所以默认情况下,所有字段都不为null。如果您添加nullable:true,它必须解决您的问题。所有验证逻辑,您可以从UI中比较两个密码,我会尽快检查并让您知道!我在src/groovy中创建了这个类,但在约束方面遇到了问题。还有一些警告,比如:“'username'不能应用于…”还有一些我不能用@validable注释类的东西。也许是因为圣杯3?