GrailsSpringSecurity/Acegi。自定义用户+;密码过期管理
我正在从事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,它看起来非常像这样(): 我的用户类看起来也很像这样: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
/**
* 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节