我是Grails的新手,我正在尝试为安全核心插件创建自己的AuthenticationProvider,问题是我在尝试返回令牌时遇到了跟随错误
这是我的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) {
}
}
答案 0 :(得分:0)
非常确定,user.getAuthorities1()
调用是在会话之外延迟加载的。
您需要在会话结束前对其进行初始化。一种解决方案是使用另一种初始化此属性的方法替换User.findByUsername(name)
调用。