2016-02-09 2 views
0

Я пытаюсь добавить дополнительные поля в поля регистрации пользователя, предоставленные плагином. Я считаю, что переопределение RegisterController - это правильный подход для добавления дополнительных полей (исправьте меня, если я ошибаюсь). Я создал новый RegisterController.groovy из исходного файла со следующим содержимым. На данный момент я не добавил новые свойства поля, просто пытаюсь имитировать то, что делает плагин.Grails Spring Security UI Регистрация Дополнительные поля

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. 

Любая идея, чтобы решить эту проблему, было бы весьма признателен.

+0

Вы хотите, чтобы дополнительные поля были постоянными в db, в классе User domain? –

+0

да, это цель. Мне также нужно выяснить, как сделать страницу регистрации привязанной к ограничениям класса домена пользователя. – elixir

ответ

0

The 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])(?=.*[[email protected]#$%^&]).*$' 
} 

где значение RegisterCommand.User создается. Сделайте это также в своем новом RegistrationController.

+0

спасибо за подсказку. это решило проблему. – elixir

Смежные вопросы