gpt4 book ai didi

Grails Spring 安全/Acegi。自定义用户+密码过期管理

转载 作者:行者123 更新时间:2023-12-02 15:03:17 25 4
gpt4 key购买 nike

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

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

我已经修改了 User 类。不是它实现了 UserDetails interface .

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

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'messageSource': Initialization of bean failed; nested exception is org.springframework.beans.factory.BeanCreationException:

Error creating bean with name 'transactionManager': Cannot resolve reference to bean 'sessionFactory' while setting bean property 'sessionFactory'; nested exception is org.springframework.beans.factory.BeanCreationException:

Error creating bean with name 'sessionFactory': Invocation of init method failed; nested exception is org.hibernate.PropertyNotFoundException:

Could not find a setter for property accountNonExpired in class com.company.app.user.User



我必须注册一些bean吗?我发现这个错误非常令人困惑,因为该界面不要求使用 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,对吗?

最佳答案

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

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

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

static transients = ['accountNonExpired']

关于Grails Spring 安全/Acegi。自定义用户+密码过期管理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3864749/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com