Grails 3 Spring Security - нет спящего режима

Я мигрирую приложение Grails 2.4.5 в Grails 3.1.11. Приложение имеет пользовательский поставщик аутентификации, который позволяет пользователям проходить аутентификацию с БД или с сервера ldap. Если пользователь является пользователем ldap, учетные данные проверяются из ldap, если не из db. Роли загружаются из базы данных. Этот сценарий прекрасно работает в Grails 2.4.5

При переносе в Grails 3.1.11, "org.hibernate.HibernateException: не найден сеанс для текущего потока", выбрасывается в CustomLdapAuthenticationProvider, когда я хочу получить доступ к базе данных. Если я положу @Transactional на метод, ошибка исчезнет. Я не знаю, что это правильный путь, потому что я предположил, что Grails будет обрабатывать сеанс уже в веб-запросе.

Мой код такой

....
class CustomLdapAuthenticationProvider extends LdapAuthenticationProvider {

def ldapAuthProvider
def daoAuthenticationProvider
def springSecurityService
def userDetailsService
def dataSource
def grailsApplication

CustomLdapAuthenticationProvider(LdapAuthenticationProvider ldapAuthenticationProvider) {
    super(ldapAuthenticationProvider.authenticator, ldapAuthenticationProvider.authoritiesPopulator)
}

@Override
public Authentication authenticate(Authentication authentication) throws AuthenticationException {
    String username = authentication.principal?.toString()?.toLowerCase()
    String password = authentication.credentials
    Boolean isExistingLdapUser = User.withCriteria {
                        eq("personUsername", username)
                        eq("personIsldap", true)
                    }[0] as Boolean
                    if (isExistingLdapUser) {
                        authentication = ldapAuthProvider.authenticate(authentication)
                        springSecurityService.loggedIn ? Person.findByPersonUsername(authentication.principal.username) : null
                        .....
                        .....
                        .....

}
}

Какие-либо предложения? Нужно ли управлять сессией вручную?

редактировать:

Добавление аннотации @Transactional к методу аутентификации для версии Grails 3 решило мою проблему.

@Override
@Transactional
public Authentication authenticate(Authentication authentication) throws AuthenticationException {

0 ответов

Другие вопросы по тегам