Null springSecurityService导致Grails 2.0.1中的encodePassword失败

Null springSecurityService导致Grails 2.0.1中的encodePassword失败,grails,spring-security,Grails,Spring Security,我们正在使用Grails2.0.1和SpringSecurity开发一个新项目。由于用户域对象中的springSecurityService为null,创建用户上下文失败。奇怪的是,这只发生在我们的Linux文本框上,而在所有开发人员的windows框上它都可以正常工作。不确定这是否与环境有关,或者是其他原因。在linux机器上,这会持续失败 下面是我们正在使用的用户域类(插件生成的类,带有几个附加字段)。encodePassword正在由beforeInsert()、beforeUpdate(

我们正在使用Grails2.0.1和SpringSecurity开发一个新项目。由于用户域对象中的springSecurityService为null,创建用户上下文失败。奇怪的是,这只发生在我们的Linux文本框上,而在所有开发人员的windows框上它都可以正常工作。不确定这是否与环境有关,或者是其他原因。在linux机器上,这会持续失败

下面是我们正在使用的用户域类(插件生成的类,带有几个附加字段)。encodePassword正在由beforeInsert()、beforeUpdate()触发器处理

遇到这个线程,它讨论导致webflows中出现问题的瞬态引用,我假设这里没有使用这些引用,所以不确定这是否相关。

类用户{
临时安全服务
静态约束={
firstName空白:false,可空:false,大小:2..100
lastName空白:false,可空:false,大小:2..100
用户名空白:false,可空:false,唯一:true,电子邮件:true
密码空白:false,可空:false,大小:6..255
}
静态映射={
密码列:“`password`”
}
字符串用户名
字符串密码
布尔启用
布尔帐户已过期
布尔帐户锁定
布尔密码过期
/*用户详细信息*/
字符串名;
字符串lastName;
设置getAuthorities(){
UserRole.findallbyser(this.collect{it.role}作为集合
}
def beforeInsert(){
encodePassword()
}
def beforeUpdate(){
if(isDirty(‘密码’)){
encodePassword()
}
}
受保护的无效密码(){
password=springSecurityService.encodePassword(密码)
}
}

提前感谢

我知道在测试注入用户域类的SpringSecurity服务时存在一些问题。看看这个问题:.

springSecurityService
不能是暂时的。下面的代码应该可以工作

class User {

  def springSecurityService

  static transients = ["springSecurityService"]

  protected void encodePassword() {
      password = springSecurityService.encodePassword(password)
  }
}

如果您只想确保保存用户对象,而不关心测试的密码,那么可以使用Groovy的元编程来重写encodePassword方法

@TestFor(UserService)    
@Mock(User)
class UserServiceTest {
    void testMethod() {
        User.metaClass.encodePassword = { -> }

        service.invokeTestThatSavesUserDomainClass()
    }   
}

我不希望在用户域中使用encodePassword,而是在创建用户时使用:控制器、服务、测试:新用户(用户名:“root”,密码:springSecurityService.encodePassword('1'))我不认为这是一种解决方法或黑客攻击。然后有一些方法可以创建一个新的用户实例,而不需要对其密码进行编码,因为调用者不一定要使用密码。这一设计决策确保了当用户域被操纵时,密码总是被编码的,从安全的角度来看,这是更健壮的。这正是我所期待的,对测试和所有方面来说都是新的。我阅读了关于这个问题的其他解决方案以及其他关于这个问题的帖子,这是迄今为止最简单的解决方案!
@TestFor(UserService)    
@Mock(User)
class UserServiceTest {
    void testMethod() {
        User.metaClass.encodePassword = { -> }

        service.invokeTestThatSavesUserDomainClass()
    }   
}