我是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/