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 {