Grails 3 Spring Security No Hibernate Session

时间:2016-09-23 12:43:56

标签: hibernate grails grails-plugin grails-3.1 grails-spring-security

我正在将grails 2.4.5应用程序迁移到grails 3.1.11。 Application有一个自定义authprovider,允许用户从db或ldap服务器进行身份验证。如果用户是ldap用户,则从ldap验证登录凭据,如果不是来自db。角色从数据库加载。这种情况在grails 2.4.5

中运行良好

当迁移到grails 3.1.11时,当我想要访问数据库时,在CustomLdapAuthenticationProvider中抛出“org.hibernate.HibernateException:找不到当前线程的会话”。如果我把@Transactional放在方法上,错误就会消失。我不知道这是正确的方法,因为我假设grails会在Web请求中处理会话。

我的代码就是那样

....
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 个答案:

没有答案