在Custom AuthenticationProvider中找不到当前线程的会话

时间:2015-07-07 16:51:31

标签: hibernate session grails javabeans

我是Grails的新手,我正在尝试为安全核心插件创建自己的AuthenticationProvider,问题是我在尝试返回令牌时遇到了跟随错误

无法获取当前的Hibernate会话;嵌套异常是org.hibernate.HibernateException:找不到当前线程的会话

这是我的AuthenticationProvider代码:

@Component
public class MyCustomAuthenticationProvider implements AuthenticationProvider {

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

    String name = authentication.getName();
    String password = authentication.getCredentials().toString()
    def User user
    User.withTransaction {
        status ->user = User.findByUsername(name);
        if(! user.springSecurityService.isPasswordValid(user.getPassword(),password,null)){
            throw new BadCredentialsException("Bad Credentials");
        }

        // Here comes the problem when I try to 
        return  new UsernamePasswordAuthenticationToken(user, user.getPassword(), user.getAuthorities1()) ;
    }
}




    @Override
    public boolean supports(Class<?> authentication) {
       return authentication.equals(UsernamePasswordAuthenticationToken.class);
    }
}

我的bean声明(在resources.groovy文件中)是:

beans = {
    myCustomAuthenticationProvider (com.security.MyCustomAuthenticationProvider)    {

 }
}

1 个答案:

答案 0 :(得分:0)

非常确定,user.getAuthorities1()调用是在会话之外延迟加载的。

您需要在会话结束前对其进行初始化。一种解决方案是使用另一种初始化此属性的方法替换User.findByUsername(name)调用。