Null springSecurityService导致在Grails 2.0.1中encodePassword失败

时间:2012-03-15 05:44:30

标签: grails spring-security

我们正在开发一个使用Grails 2.0.1和Spring Security的新项目。由于用户域对象中的springSecurityService为null,因此创建用户上下文失败。奇怪的是,这只发生在我们的Linux文本框中,而在所有开发人员的Windows框中它工作正常。不确定它是否与环境有关或是否与其他环境有关。在linux框中,这种情况始终如一。

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

遇到这个线程,它讨论了导致webflow问题的瞬态引用,我假设这里没有使用,所以不确定这是否相关。 http://grails.1312388.n4.nabble.com/Spring-Security-Plugin-1-of-the-time-springSecurityService-null-td4349941.html

class User {

    transient springSecurityService

    static constraints = {
        firstName blank: false, nullable: false, size: 2..100
        lastName blank: false, nullable: false, size: 2..100
        username blank: false, nullable: false, unique : true, email: true
        password blank: false, nullable: false, size: 6..255
    }

    static mapping = {
        password column: '`password`'
    }

    String username
    String password
    boolean enabled
    boolean accountExpired
    boolean accountLocked
    boolean passwordExpired

    /* user details */
    String firstName;
    String lastName;

    Set<Role> getAuthorities() {
        UserRole.findAllByUser(this).collect { it.role } as Set
    }

    def beforeInsert() {
        encodePassword()
    }

    def beforeUpdate() {
        if (isDirty('password')) {
            encodePassword()
        }
    }

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

提前致谢

3 个答案:

答案 0 :(得分:21)

如果您只想确保保存User对象并且不关心测试的密码,则可以使用Groovy的元编程来覆盖encodePassword方法。

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

        service.invokeTestThatSavesUserDomainClass()
    }   
}

答案 1 :(得分:3)

springSecurityService一定不能是短暂的。以下代码应该可以使用

class User {

  def springSecurityService

  static transients = ["springSecurityService"]

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

答案 2 :(得分:1)

我知道测试注入User域类的SpringSecurity服务存在一些问题。看一下这个问题:How to test unit test controllers that use SpringSecurity service