Граальс весенний охранный / Acegi.Пользовательский пользователь + управление паролем истекло - PullRequest
0 голосов
/ 05 октября 2010

Я работаю над проектом Grails Legacy. Существует класс домена с именем User. Он содержит пароль, имя пользователя, роли и т. Д.

Этот проект использует Spring Security для управления ролями. Я хотел бы добавить срок действия учетных данных (заставить пользователя обновить свой пароль).

Я изменил класс User. Не он реализует интерфейс UserDetails .

Однако, когда я запускаю сервер, я получаю эту ошибку>

org.springframework.beans.factory.BeanCreationException: Ошибка создания бина с именем 'messageSource': инициализация боб не удался; вложенное исключение org.springframework.beans.factory.BeanCreationException:

Ошибка создания бина с именем 'actionManager ': не удается разрешить ссылка на bean-компонент 'sessionFactory' при настройке свойства бина 'SessionFactory'; вложенное исключение org.springframework.beans.factory.BeanCreationException:

Ошибка создания бина с именем 'sessionFactory': вызов init метод не удался; вложенное исключение org.hibernate.PropertyNotFoundException:

Не удалось найти установщик для свойства accountNonExpired в классе com.company.app.user.User

Должен ли я зарегистрировать боб? Я нахожу ошибку довольно запутанной, поскольку интерфейс не запрашивает метод установки.

обновление

После более подробного изучения я столкнулся с моим SecurityConfig.groovy, который выглядит LOT следующим образом ( AcegiSecurity Plugin * ):

security {
   // see DefaultSecurityConfig.groovy for all settable/overridable properties

   active = true

   loginUserDomainClass = "User"
   authorityDomainClass = "Role"

 ....
}

Мой класс User также выглядит A LOT следующим образом:

/**
 * User domain class.
 */
class User {
   static transients = ['pass','passwordExpired','credentialsNonExpired']
   static hasMany = [authorities: Role]
   static belongsTo = Role
   /** Username */
   String username
   /** User Real Name*/
   String userRealName
   /** MD5 Password */
   String passwd
   /** enabled */
   boolean enabled

   String email
   boolean emailShow

   /** description */
   String description = ''

   /** plain password to create a MD5 password */
   String pass = '[secret]'

   static constraints = {
      username(blank: false, unique: true)
      userRealName(blank: false)
      passwd(blank: false)
      enabled()
   }

   public boolean isCredentialsNonExpired() {
         return true;
   }
}

Я добавил метод проверки истечения срока действия пароля для этого класса (isCredentialsNonExpired). Мне нужно, чтобы этот метод выполнялся при входе в систему. Прямо сейчас это не так.

Так что, похоже, я должен использовать подход Acegi. Какие-нибудь мысли? Я понимаю, что Acegi использует Spring Security, верно?

1 Ответ

3 голосов
/ 05 октября 2010

Вы используете плагин Acegi или настраиваете его напрямую?Если вы используете плагин Spring Security Core , это будет намного проще, поскольку он поддерживается сразу после установки.

Возможно, вы не хотите, чтобы ваш класс User был вашим классом UserDetailsService, поскольку ончасто имеет другой багаж, такой как сопоставленные коллекции и т. д. Это, безусловно, может работать, но создание простого класса данных - лучший подход.Это удобно для создания подкласса org.springframework.security.userdetails.User или org.springframework.security.core.userdetails.User в зависимости от версии Spring Security.если он будет сохраняться, то ему тоже нужен установщик.Если вы выводите значение и не хотите, чтобы это поле было в базе данных, вы можете добавить его в список переходных процессов:

static transients = ['accountNonExpired']
...