shiro-SecurityUtils.getSubject().getPrincipal()获取的值无法强制类型转换

在登录成功后,我想取出当前登录的用户,就使用了

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

 

 

 

 

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值