我们正在开发一个使用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)
}
}
提前致谢
答案 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。