Spring自动登录问题

Spring自动登录问题,spring,spring-security,Spring,Spring Security,我试图实现下面的spring自动登录,但是我的authenticationManager实例抛出下面的异常,并且不是自动连接的。如何手动从Spring获取它的实例?我没有使用spring控制器,而是使用JSF请求范围的bean。当容器尝试自动连接authenticationManager时,我在运行时遇到以下异常。requestCache很好。我应该在UserDetailsService实现(userManager)上使用方法吗?我没有看到UserDetailsService公开的采用Usern

我试图实现下面的spring自动登录,但是我的authenticationManager实例抛出下面的异常,并且不是自动连接的。如何手动从Spring获取它的实例?我没有使用spring控制器,而是使用JSF请求范围的bean。当容器尝试自动连接authenticationManager时,我在运行时遇到以下异常。requestCache很好。我应该在UserDetailsService实现(userManager)上使用方法吗?我没有看到UserDetailsService公开的采用UsernamePasswordAuthenticationToken对象的适当方法。有什么想法吗? 配置:

@范围(“请求”) 公开课报名 {


这是因为Spring Security在内部声明了第二个
AuthenticationManager
,因此您有两个。您需要使用
别名选择其中一个:

<authentication-manager alias = "am">
    ...
</authentication-manager>

@c12如果您使用自定义的基于角色的授权,则您的用户详细信息的内部权限集合可能未填充在用户管理器类的loadUserByUsername方法中;如果是这种情况,您将需要关联特定的将角色手动添加到权限集合中。请查看下面的代码段(理想情况下,它应该是loadUserByUsername方法体的一部分);假定。。。 a) MyUser是您自己的用户对象 b) MyUserRole是您自己的角色对象 c) userDetails是您将从loadUserByUsername方法返回的内容

MyUser myUser = userDao.getUserByUsername(username);
Set<GrantedAuthority> grantedAuthSet = new HashSet<GrantedAuthority>();
Set<MyUserRole> myUserRoleSet = myUser.getRoleSet();

for (Iterator<MyUserRole> iterator = myUserRoleSet.iterator(); iterator.hasNext();) {
    MyUserRole userRole = (MyUserRole) iterator.next();
    grantedAuthSet.add(new SimpleGrantedAuthority(userRole.getName()));
}

List<GrantedAuthority> grantedAuthList = new ArrayList<GrantedAuthority>(grantedAuthSet);
myUser.setAuthorities(grantedAuthList);
UserDetails userDetails = new User(myUser.getUsername(), myUser.getPassword(), true, true, true, true, myUser.getAuthorities());
MyUser-MyUser=userDao.getUserByUsername(用户名);
Set grantedAuthSet=new HashSet();
设置myUserRoleSet=myUser.getRoleSet();
for(迭代器迭代器=myUserRoleSet.Iterator();迭代器.hasNext();){
MyUserRole=(MyUserRole)迭代器.next();
添加(新的SimpleGrantedAuthSet权限(userRole.getName());
}
List grantedAuthList=新的ArrayList(grantedAuthSet);
myUser.setAuthorities(grantedAuthList);
UserDetails UserDetails=新用户(myUser.getUsername(),myUser.getPassword(),true,true,true,myUser.getAuthorities());

希望这有帮助!

根据例外情况,您有两个身份验证管理器。您需要告诉Autowire您要使用哪一个身份验证管理器。感谢您的帮助。我想我只需要在自动登录时将角色与用户关联,但我不确定如何执行此操作。我仍然会被重定向到我的登录页面(添加自动登录代码后)当我在SecurityContextHolder.getContext().setAuthentication(authenticatedUser)之后请求/registered/home.html时;调用。我在上面添加了我的拦截URL。有什么想法吗?@c12:身份验证提供程序应该将角色与身份验证令牌本身关联起来,所以我不知道为什么它不起作用。是的,很奇怪,身份验证对象说我已通过身份验证,并且我的主体是correct@c12:实际上,这可能是由于安全内容xt未保存在会话中。通常,它是由
拦截url
上的
过滤器=无
引起的,但您没有它。而且
getSession()
看起来可疑。我更改了一点代码,不再调用getSession,但它仍然没有将其存储在会话中
 @Inject
 RequestCache requestCache;

 @Inject
 protected AuthenticationManager authenticationManager;

 public String login(){
authenticateUserAndSetSession(utilities.getLoggedInUser(), (HttpServletRequest)        FacesUtils.getExternalContext().getRequest());
    return "/home.html";
}
 private void authenticateUserAndSetSession(Users user,
            HttpServletRequest request)
        {
     UserDetails details = userManager.loadUserByUsername(user.getUsername());
  UsernamePasswordAuthenticationToken usernameAndPassword = 
      new UsernamePasswordAuthenticationToken(
          user.getUsername(), "pwd", details.getAuthorities());

  // Authenticate, just to be sure
  Authentication auth = authenticationManager.authenticate(usernameAndPassword);

  // Place the new Authentication object in the security context.
  SecurityContextHolder.getContext().setAuthentication(auth);
}
<authentication-manager alias = "am">
    ...
</authentication-manager>
@Inject @Named("am")
protected AuthenticationManager authenticationManager;  
MyUser myUser = userDao.getUserByUsername(username);
Set<GrantedAuthority> grantedAuthSet = new HashSet<GrantedAuthority>();
Set<MyUserRole> myUserRoleSet = myUser.getRoleSet();

for (Iterator<MyUserRole> iterator = myUserRoleSet.iterator(); iterator.hasNext();) {
    MyUserRole userRole = (MyUserRole) iterator.next();
    grantedAuthSet.add(new SimpleGrantedAuthority(userRole.getName()));
}

List<GrantedAuthority> grantedAuthList = new ArrayList<GrantedAuthority>(grantedAuthSet);
myUser.setAuthorities(grantedAuthList);
UserDetails userDetails = new User(myUser.getUsername(), myUser.getPassword(), true, true, true, true, myUser.getAuthorities());