Null springSecurityService приводит к сбою encodePassword в Grails 2.0.1 - PullRequest
11 голосов
/ 15 марта 2012

Мы работаем над новым проектом с Grails 2.0.1 и Spring Security.Сбой создания пользовательского контекста из-за того, что springSecurityService в объекте домена User имеет значение null.Странно, что это происходит только в нашем текстовом поле Linux, в то время как на всех окнах разработчика это работает нормальноНе уверен, имеет ли это какое-либо отношение к окружающей среде или это что-то еще.В Linux это не помогает постоянно.

Класс пользовательского домена, который мы используем, находится ниже (класс сгенерированный плагином с парой дополнительных полей).CodedePassword обрабатывается триггерами 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)
    }
}

Заранее спасибо

Ответы [ 3 ]

21 голосов
/ 20 марта 2012

Вы можете использовать метапрограммирование Groovy для переопределения метода encodePassword, если вы хотите только убедиться, что объект User сохранен, и вам не нужен пароль для вашего теста.

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

        service.invokeTestThatSavesUserDomainClass()
    }   
}
3 голосов
/ 15 марта 2012

springSecurityService НЕ должно быть кратковременным. Следующий код должен работать

class User {

  def springSecurityService

  static transients = ["springSecurityService"]

  protected void encodePassword() {
      password = springSecurityService.encodePassword(password)
  }
}
1 голос
/ 15 марта 2012

Я знаю, что есть некоторые проблемы с тестированием сервиса SpringSecurity, который внедряется в класс домена пользователя.Взгляните на этот вопрос: Как протестировать контроллеры модульного тестирования, использующие сервис SpringSecurity .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...