rg.crazycake.shiro.exception.PrincipalInstanceException: class java.util.HashMap must has getter for field: id
We need a field to identify this Cache Object in Redis. So you need to defined an id field which you can get unique id to identify this principal. For example, if you use UserInfo as Principal class, the id field maybe userId, userName, email, etc. For example, getUserId(), getUserName(), getEmail(), etc.
Default value is "id", that means your principal object has a method called "getId()"java
shiro与redis整合过程当中出现以上的问题:根据错误的信息,是信息认证明体中须要id的getter信息。根据官方文档配置相应的模块:redis
cacheManager.principalIdFieldName = <your id field name of principal object>spring
在spring boot 中的非xml配置以下:缓存
/**
* cacheManager 缓存 redis实现
* 使用的是shiro-redis开源插件
*
* @return
*/
public RedisCacheManager cacheManager() {
RedisCacheManager redisCacheManager = new RedisCacheManager();
redisCacheManager.setRedisManager(redisManager());
redisCacheManager.setPrincipalIdFieldName("id");
return redisCacheManager;
}
在shiro realm中修改认证的信息配置以下:
@Override
public AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
String useranme = (String) token.getPrincipal();
System.out.println("登陆方法:" + useranme);
User user = new User();
user = userService.getCredential(useranme);
SimpleAuthenticationInfo info = new SimpleAuthenticationInfo(user, user.getPassword(), ByteSource.Util.bytes(user.getSalt()), getName());
Session session = SecurityUtils.getSubject().getSession();
session.setAttribute("username", useranme);
return info;
}
调整以后能够正常进入受权啦~~