Null springSecurityService приводит к ошибке encodePassword в Grails 2.0.1
Мы работаем над новым проектом с Grails 2.0.1 и Spring Security. Сбой контекста создания пользователя из-за того, что функция SpringSecurityService в объекте домена пользователя равна нулю. Странно, что это происходит только в нашем текстовом поле Linux, а на всех окнах окон разработчика он отлично работает. Не уверен, имеет ли он какое-либо отношение к окружающей среде или что-то другое. В окне linux это происходит неуспешно.
Класс домена пользователя, который мы используем, ниже (класс с плагином с несколькими дополнительными полями). Кодирование encodePassword обрабатывается триггерами beforeInsert(), beforeUpdate().
Перешел через этот поток, который говорит о переходных ссылках, вызывающих проблемы в веб-потоках, которые, как я полагаю, не используются здесь, поэтому не уверен, что это актуально.
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)
}
}
Заранее спасибо
Ответы
Ответ 1
Вы можете использовать мета-программирование Groovy, чтобы переопределить метод encodePassword, если вы хотите только убедиться, что объект User сохранен, и вам не нужен пароль для вашего теста.
@TestFor(UserService)
@Mock(User)
class UserServiceTest {
void testMethod() {
User.metaClass.encodePassword = { -> }
service.invokeTestThatSavesUserDomainClass()
}
}
Ответ 2
springSecurityService
НЕ должен быть временным. Следующий код должен работать
class User {
def springSecurityService
static transients = ["springSecurityService"]
protected void encodePassword() {
password = springSecurityService.encodePassword(password)
}
}
Ответ 3
Я знаю, что есть некоторые проблемы с тестированием службы SpringSecurity, которая вводится в класс домена пользователя. Взгляните на этот вопрос: Как протестировать контроллеры unit test, которые используют службу SpringSecurity.