hibernate - 在Custom AuthenticationProvider中找不到当前线程的 session

标签 hibernate session grails javabeans

我是Grails的新手,正在尝试为安全性核心插件创建自己的AuthenticationProvider,问题是尝试返回 token 时出现跟随错误

无法获取当前的休眠 session ;嵌套的异常是org.hibernate.HibernateException:当前 session 找不到 session

这是我的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)    {

 }
}

最佳答案

可以肯定的是,user.getAuthorities1()调用是在 session 外部延迟加载的。

您需要在 session 关闭之前对其进行初始化。一种解决方案是用另一种方法初始化您的属性来替换User.findByUsername(name)调用。

关于hibernate - 在Custom AuthenticationProvider中找不到当前线程的 session ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31274771/

相关文章:

java - 监控数据库的连接数

javascript - 在客户端访问服务器变量时获取空字符串

java - 为什么我的单向 @ManyToOne 关系中的表没有加入 Spring Data findAll() 查询?

java - Spring + hibernate : Unknown entity

Laravel 5.1 随机丢弃 session 数据

grails - 无法在 Grails 中创建新的域对象

grails - Grails HttpSecurity-允许POST

java - 优化两个列表比较

java - Hibernate、fetch、HQL 和 hashCode()

java - 如何通过登录和 session 处理来保护 Java Web 服务