日期:2014-05-18  浏览次数:20625 次

Acegi缓存用户信息问题
修改用户信息之后我都要将用户信息放入缓存,但是每次调用
UserDetails   userDetail   =   userCache.getUserFromCache(user.getUserCode());
(userCache是通过spring注入的)为什么detail老是null
并且我不明白这句话
userCache.putUserInCache(userDetail);
到底起到了什么作用?
还有我觉得acegi在验证登陆用户访问受保护资源时,总是通过SecurityContextHolder来获取登陆用户认证信息的,因为得到下面的打印没有任何变化
Authentication   auth   =   SecurityContextHolder.getContext()
.getAuthentication();
if   (auth   !=   null   &&   auth.getPrincipal()   !=   null
&&   auth.getPrincipal()   instanceof   UserDetails)   {
UserDetails   details   =   (UserDetails)   auth.getPrincipal();
log.info( "下面是缓存前的用户信息: ");
log.info( "密码: "   +   details.getPassword());
log.info( "认证权限: ");
GrantedAuthority[]   oldAuthorities   =   details.getAuthorities();
for   (int   i   =   0;   i   <   oldAuthorities.length;   i++)   {
log.info(oldAuthorities[i].getAuthority());
}
}
我的理解是acegi验证登陆用户的访问权限是通过SecurityContextHolder来获取的,userCache的userCache.putUserInCache(userDetail);不对SecurityContextHolder起作用,不能与数据库同步。
我在修改用户信息后,比如用户密码,如果我不对用户userCache.putUserInCache(userDetail);进行缓存,那么我退出系统之后,用原来的密码仍然可以登陆,
但是如果
userDetail=new   org.acegisecurity.userdetails.User(user.getUserCode(),user.getUserPassword(),   false,   true,   true,   true,authorities);
userCache.putUserInCache(userDetail);
我把用户的enable设置成false了,结果退出系统之后,就不能登陆了,我不明白缓存到底咋回事?
请高人赐教!多谢!

------解决方案--------------------
我的理解是acegi验证登陆用户的访问权限是通过SecurityContextHolder来获取的,userCache的userCache.putUserInCache(userDetail);不对SecurityContextHolder起作用,不能与数据库同步,对否?