在登录成功后,我想取出当前登录的用户,就使用了
User user=User user=(User) SecurityUtils.getSubject().getPrincipal();
但是运行就会出错
严重: Servlet.service() for servlet [springDispatcherServlet] in context with path [/kygl] threw exception [Request processing failed; nested exception is java.lang.ClassCastException: java.lang.String cannot be cast to com.mqb.bean.User] with root cause
java.lang.ClassCastException: java.lang.String cannot be cast to com.mqb.bean.User
提示无法进行类型转换
把代码稍微改一下,通过调试发现
User user=User user=(User) SecurityUtils.getSubject().getPrincipal();
变成==>
Object o=SecurityUtils.getSubject().getPrincipal();
这个o的值只是我登录时的用户名,并不是整个实体user
百思不得其解
直到后面从头理了一遍代码,才发现错误原来是在自定义realm的验证方法
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
//获取账号密码
UsernamePasswordToken t = (UsernamePasswordToken) token;
String userName= token.getPrincipal().toString();
//获取数据库中的密码
User userInDB=userService.getByName(userName);
String passwordInDB=userInDB.getPassword();
String saltInDB=userInDB.getSalt();
SimpleAuthenticationInfo a = new SimpleAuthenticationInfo(userName,passwordInDB,ByteSource.Util.bytes(saltInDB),getName());
return a;
}
SimpleAuthentication的构造函数可以有4个参数
其中的principal作为身份的标识,既可以传用户名,也可以传实体,
我一开始就是因为传的principal就是userName,所以后面SecurityUtils.getSubject().getPrincipal()获得的也是userName,
当我把userName改成实体userInDB后,就没问题了
SimpleAuthenticationInfo a = new SimpleAuthenticationInfo(userInDB,passwordInDB,ByteSource.Util.bytes(saltInDB),getName());
————————————————
版权声明:本文为CSDN博主「丶黑白格」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_42672204/article/details/104182859