Grails Spring Security UI注册附加字段

时间:2016-02-09 23:15:33

标签: grails spring-security

我正在尝试在插件提供的用户注册字段中添加其他字段。我相信重写RegisterController是添加更多字段的正确方法(如果我错了,请纠正我)。我已经从原始文件创建了一个新的RegisterController.groovy,其中包含以下内容。此时我还没有添加新的字段属性,只是试图模仿插件的功能。

package myPackage

import grails.plugin.springsecurity.authentication.dao.NullSaltSource
import grails.plugin.springsecurity.ui.CommandObject
import grails.plugin.springsecurity.ui.RegistrationCode
import grails.plugin.springsecurity.ui.strategy.MailStrategy
import grails.plugin.springsecurity.ui.strategy.PropertiesStrategy
import grails.plugin.springsecurity.ui.strategy.RegistrationCodeStrategy

class RegisterController extends grails.plugin.springsecurity.ui.RegisterController {

    static defaultAction = 'register'

    def saltSource
    MailStrategy uiMailStrategy
    RegistrationCodeStrategy uiRegistrationCodeStrategy
    PropertiesStrategy uiPropertiesStrategy

    def register(RegisterCommand registerCommand) {

        if (!request.post) {
            return [registerCommand: new RegisterCommand()]
        }

        if (registerCommand.hasErrors()) {
            return [registerCommand: registerCommand]
        }

        def user = uiRegistrationCodeStrategy.createUser(registerCommand)
        String salt = saltSource instanceof NullSaltSource ? null : registerCommand.username
        RegistrationCode registrationCode = uiRegistrationCodeStrategy.register(user, registerCommand.password, salt)

        if (registrationCode == null || registrationCode.hasErrors()) {
            // null means problem creating the user
            flash.error = message(code: 'spring.security.ui.register.miscError')
            return [registerCommand: registerCommand]
        }

        sendVerifyRegistrationMail registrationCode, user, registerCommand.email

        [emailSent: true, registerCommand: registerCommand]
    }

}

class RegisterCommand implements CommandObject {

    protected static Class<?> User
    protected static String usernamePropertyName

    String username
    String email
    String password
    String password2

    static constraints = {
        username validator: { value, command ->
            if (!value) {
                return
            }

            if (User.findWhere((usernamePropertyName): value)) {
                return 'registerCommand.username.unique'
            }
        }
        email email: true
        password validator: RegisterController.passwordValidator
        password2 nullable: true, validator: RegisterController.password2Validator
    }
}

当我运行此程序时,出现错误

Cannot invoke method findWhere() on null object.

任何解决这个问题的想法都会非常感激。

1 个答案:

答案 0 :(得分:0)

grails.plugin.springsecurity.ui.RegisterController有这个包私有方法:

void afterPropertiesSet() {
    super.afterPropertiesSet()

    RegisterCommand.User = User
    RegisterCommand.usernamePropertyName = usernamePropertyName

    forgotPasswordEmailBody = conf.ui.forgotPassword.emailBody ?: ''
    registerEmailBody = conf.ui.register.emailBody ?: ''
    registerEmailFrom = conf.ui.register.emailFrom ?: ''
    registerEmailSubject = conf.ui.register.emailSubject ?: ''
    registerPostRegisterUrl = conf.ui.register.postRegisterUrl ?: ''
    registerPostResetUrl = conf.ui.register.postResetUrl ?: ''
    successHandlerDefaultTargetUrl = conf.successHandler.defaultTargetUrl ?: '/'

    passwordMaxLength = conf.ui.password.maxLength instanceof Number ? conf.ui.password.maxLength : 64
    passwordMinLength = conf.ui.password.minLength instanceof Number ? conf.ui.password.minLength : 8
    passwordValidationRegex = conf.ui.password.validationRegex ?: '^.*(?=.*\\d)(?=.*[a-zA-Z])(?=.*[!@#$%^&]).*$'
}

正在设置RegisterCommand.User的值。也可以在新的RegistrationController中执行此操作。