GrailsSpringSecurity/Acegi。自定义用户+;密码过期管理

GrailsSpringSecurity/Acegi。自定义用户+;密码过期管理,grails,spring-security,credentials,change-password,Grails,Spring Security,Credentials,Change Password,我正在从事grails遗留项目。存在名为User的域类。它包含密码、用户名、角色等 此项目使用Spring安全性进行角色管理。我想添加凭据过期(强制用户续订其密码) 我已经修改了用户类。不是它实现了 但是,当我启动服务器时,会出现以下错误> org.springframework.beans.factory.BeanCreationException: 创建名为的bean时出错 “messageSource”:的初始化 bean失败;嵌套异常是 org.springframework.beans

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

此项目使用Spring安全性进行角色管理。我想添加凭据过期(强制用户续订其密码)

我已经修改了用户类。不是它实现了

但是,当我启动服务器时,会出现以下错误>

org.springframework.beans.factory.BeanCreationException: 创建名为的bean时出错 “messageSource”:的初始化 bean失败;嵌套异常是 org.springframework.beans.factory.BeanCreationException:

创建名为的bean时出错 “transactionManager”:无法解析 对bean“sessionFactory”的引用 在设置bean属性时 “会话工厂”;嵌套异常是 org.springframework.beans.factory.BeanCreationException:

创建名为的bean时出错 “sessionFactory”:调用init 方法失败;嵌套异常是 org.hibernate.PropertyNotFoundException:

找不到属性的setter 会计在课堂上没有经验 com.company.app.user.user

我需要注册一些豆子吗?我发现这个错误相当混乱,因为接口不要求setter方法

更新 在进一步调查之后,我遇到了我的SecurityConfig.groovy,它看起来非常像这样():

我的用户类看起来也很像这样:

/**
 * 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安全性,对吗?

您是使用Acegi插件,还是直接配置它?如果你使用插件,这将是非常容易的,因为它的支持开箱即用

您可能不希望您的用户类成为您的UserDetailsService类,因为它通常还有其他负担,如映射集合等。它当然可以工作,但创建简单的数据类是更好的方法。根据Spring security的版本,可以方便地将org.springframework.security.userdetails.User或org.springframework.security.core.userdetails.User子类化

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

static transients = ['accountNonExpired']

您是在使用Acegi插件,还是直接配置它?如果你使用插件,这将是非常容易的,因为它的支持开箱即用

您可能不希望您的用户类成为您的UserDetailsService类,因为它通常还有其他负担,如映射集合等。它当然可以工作,但创建简单的数据类是更好的方法。根据Spring security的版本,可以方便地将org.springframework.security.userdetails.User或org.springframework.security.core.userdetails.User子类化

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

static transients = ['accountNonExpired']

是的,Acegi使用SpringSecutity2.0.x。正如我在回答中所说的,如果您添加了一个isAccountNoneExpired()方法,那么您需要添加一个setter使其持久化,或者如果您只是想从其他数据推断过期时间,则需要将其暂时化。是的,Acegi使用Spring Secutity 2.0.x。正如我在回答中所说的,如果您添加了isAccountNoneExpired()方法,那么您需要添加一个setter使其持久化,或者如果您只是想从其他数据推断过期时间,则需要将其暂时化。谢谢。如果我必须检查过期的凭据,它会是['passwordExpired']和isCredentialsNonExpired()方法吗?对。这在SpringSecurity核心插件btw中也得到了支持,请参阅《谢谢》中的第12.3节。如果我必须检查过期的凭据,它会是['passwordExpired']和isCredentialsNonExpired()方法吗?对。这在Spring安全核心插件btw中也得到了支持,请参见中的第12.3节