Grails Acegi: как проверить срок действия пароля

Это ответвление от этого вопроса. Разветвленный, потому что первоначальная цель этого вопроса была другой.

Я ищу самый простой способ проверить, не истек ли срок действия пароля. Срок действия пароля истечет, если он старше N дней, где N — значение, хранящееся в другой таблице.

Мой пользовательский класс выглядит так:

Security config:
loginUserDomainClass = "com.emp.app.user.User"

/**
 * 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() {

          //Check for the N value
         return true;
   }
}

Я добавил isCredentialsNonExpired(), надеясь, что он будет вызываться при входе в систему, когда учетные данные проверяются, но это не так. Есть ли способ сделать это?

Я очень запутался в этом, не уверен, что мне нужно написать собственный код, чтобы заменить некоторые функции acegi или что-то в этом роде.

Заранее спасибо.


person Tom    schedule 05.10.2010    source источник


Ответы (2)


Я бы сделал это в пользовательской службе UserDetailsService — см. http://www.grails.org/AcegiSecurity+Plugin+-+Custom+UserDetailsService

Пока вы загружаете пользователя из базы данных и заполняете UserDetails, у вас есть возможность установить учетные данные expired = true (и/или включено, accountLocked и accountExpired).

Вероятно, вы бы сделали это, добавив поле Date lastPasswordUpdate в класс домена пользователя, которое обновляется каждый раз, когда пользователь меняет пароль. Сравните эту дату с сегодняшней и, если она была больше N дней назад, установите для нее значение false.

person Burt Beckwith    schedule 05.10.2010
comment
Получил работу, спасибо. Теперь, чтобы узнать, как перенаправить на пользовательскую страницу. - person Tom; 06.10.2010

Я думаю, что правильный способ сделать это — попросить поставщика аутентификации решить, истек ли срок действия пароля.

person hvgotcodes    schedule 05.10.2010