【问题标题】:Grails spring security / Acegi. Custom User + Password expired managementGrails 弹簧安全/Acegi。自定义用户+密码过期管理
【发布时间】:2011-04-21 08:30:28
【问题描述】:

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

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

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

但是,当我启动服务器时,我得到了这个错误>

org.springframework.beans.factory.BeanCreationException: 创建具有名称的 bean 时出错 'messageSource':初始化 豆失败;嵌套异常是 org.springframework.beans.factory.BeanCreationException:

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

使用名称创建 bean 时出错 'sessionFactory':初始化的调用 方法失败;嵌套异常是 org.hibernate.PropertyNotFoundException:

找不到属性的设置器 accountNonExpired 在类 com.company.app.user.User

我必须注册一些 bean 吗?我发现这个错误非常令人困惑,因为接口不要求设置方法。

更新

在调查了更多之后,我遇到了我的 SecurityConfig.groovy,它看起来很多像这样 (AcegiSecurity Plugin):

security {
   // see DefaultSecurityConfig.groovy for all settable/overridable properties

   active = true

   loginUserDomainClass = "User"
   authorityDomainClass = "Role"

 ....
}

我的 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() {
         return true;
   }
}

我添加了一个方法来检查这个类(isCredentialsNonExpired)的密码是否应该过期。我需要这个方法在登录时执行。现在,它不是。

所以看起来这是我应该采用的 Acegi 方法。有什么想法吗?我的理解是 Acegi 使用 Spring Security,对吗?

【问题讨论】:

  • 是的,Acegi 使用 Spring Secutity 2.0.x。正如我在回答中所说,如果您添加了 isAccountNonExpired() 方法,那么您需要添加一个设置器以使其持久化,或者如果您只想从其他数据推断过期,则将其设置为瞬态。

标签: grails spring-security credentials change-password


【解决方案1】:

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

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

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

static transients = ['accountNonExpired']

【讨论】:

猜你喜欢
  • 2013-10-15
  • 2011-04-21
  • 2011-06-30
  • 2012-04-21
  • 1970-01-01
  • 2015-07-09
  • 1970-01-01
  • 1970-01-01
  • 2014-05-30
相关资源
最近更新 更多