这是this question的分支。分支出来是因为该问题的最初目的是另外的。
我正在寻找检查密码是否过期的最简单方法。如果密码超过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功能或什么。
提前致谢。
答案 0 :(得分:3)
我会在自定义UserDetailsService中执行此操作 - 请参阅http://www.grails.org/AcegiSecurity+Plugin+-+Custom+UserDetailsService
当您从数据库加载用户并填充UserDetails时,您有机会设置凭据expired = true(和/或启用,accountLocked和accountExpired)。
您可能通过向User域类添加“Date lastPasswordUpdate”字段来执行此操作,该字段在每次用户更改密码时都会更新。将该日期与今天的日期进行比较,如果超过N天,则将其设置为false。
答案 1 :(得分:1)
我认为执行此操作的正确方法是让您的身份验证提供程序确定密码是否已过期。