在Grails 2.0.1中,springSecurityService为空会导致encodePassword失败

bfrts1fy  于 2023-02-04  发布在  Spring
关注(0)|答案(4)|浏览(125)

我们正在使用Grails 2.0.1和Spring Security开发一个新项目。由于User域对象中的springSecurityService为null,创建用户上下文失败。奇怪的是,这种情况只发生在Linux文本框中,而在所有开发人员窗口框中,它都工作正常。不确定它是否与环境有关,或者是否是其他原因。在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)
    }
}

先谢了

ppcbkaq5

ppcbkaq51#

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

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

        service.invokeTestThatSavesUserDomainClass()
    }   
}
pwuypxnk

pwuypxnk2#

springSecurityService不能是 transient 的。下面的代码应该有效

class User {

  def springSecurityService

  static transients = ["springSecurityService"]

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

7vux5j2d3#

我知道在测试注入到User域类中的SpringSecurity服务时会遇到一些问题。看看这个问题:如何测试使用SpringSecurity服务的单元测试控制器。

nafvub8i

nafvub8i4#

在用户域类中添加以下内容:

static mapping = {
   autowire true
}

:)

相关问题