Grails spring security / Acegi。自定义用户+密码过期管理

时间:2010-10-05 14:39:40

标签: grails spring-security credentials change-password

我正在研究grails遗留项目。存在名为User的域类。它包含密码,用户名,角色等。

该项目使用Spring Security进行角色管理。我想添加凭据到期(强制用户更新其密码)。

我修改了User类。它没有实现UserDetails interface

但是,当我启动服务器时,我收到此错误>

  

org.springframework.beans.factory.BeanCreationException:   使用名称创建bean时出错   'messageSource':初始化   豆子失败了;嵌套异常是   org.springframework.beans.factory.BeanCreationException:

     

使用名称创建bean时出错   'transactionManager':无法解决   bean'sessionFactory'的引用   设置bean属性时   '的sessionFactory';嵌套异常是   org.springframework.beans.factory.BeanCreationException:

     

使用名称创建bean时出错   'sessionFactory':调用init   方法失败;嵌套异常是   org.hibernate.PropertyNotFoundException:

     

找不到属性的setter   accountNonExpired在课堂上   com.company.app.user.User

我必须注册一些豆子吗?我发现错误很混乱,因为接口没有要求setter方法。

更新

在调查了一些之后,我遇到了我的SecurityConfig.groovy,看起来很像很多AcegiSecurity Plugin):

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

   active = true

   loginUserDomainClass = "User"
   authorityDomainClass = "Role"

 ....
}

我的用户类看起来像很多

/**
 * 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 个答案:

答案 0 :(得分:3)

您使用的是Acegi插件,还是直接配置?如果您使用Spring Security Core插件,这将更加容易,因为它支持开箱即用。

您可能不希望您的User类成为您的UserDetailsS​​ervice类,因为它经常有其他包袱,如映射集合等。它当然可以工作,但创建一个简单的数据类是一种更好的方法。根据Spring Security的版本,将org.springframework.security.userdetails.User或org.springframework.security.core.userdetails.User子类化是很方便的。

看起来你刚刚为accountNonExpired添加了一个getter,但如果它会被持久化,那么它也需要一个setter。如果您要获取该值并且不希望该字段位于数据库中,则可以将其添加到瞬态列表中:

static transients = ['accountNonExpired']