我正在研究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,对吗?
答案 0 :(得分:3)
您使用的是Acegi插件,还是直接配置?如果您使用Spring Security Core插件,这将更加容易,因为它支持开箱即用。
您可能不希望您的User类成为您的UserDetailsService类,因为它经常有其他包袱,如映射集合等。它当然可以工作,但创建一个简单的数据类是一种更好的方法。根据Spring Security的版本,将org.springframework.security.userdetails.User或org.springframework.security.core.userdetails.User子类化是很方便的。
看起来你刚刚为accountNonExpired添加了一个getter,但如果它会被持久化,那么它也需要一个setter。如果您要获取该值并且不希望该字段位于数据库中,则可以将其添加到瞬态列表中:
static transients = ['accountNonExpired']