SSM整合shiro的bug - 登录后授权失败:源码分析

报错信息:

报错显示string对象无法转换为一个domain类对象

错误原因所在:
我在登录授权之后,自定义realm当中,给实例化的SimpleAuthenticationInfo传值错误,导致后面无法接受当前认证用户的信息,只能拿到我传入的用户名

修改方法

认证完成后,给SimpleAuthenticationInfo实例化传值的时候第一个值传入当前认证用户信息
如下:在这里插入图片描述

大概总结原因:
大概看一下源码过程:
先进入 SimpleAuthenticationInfo 类里面
在这里插入图片描述
我采用的是传三个参数值,即实例化调用的是上面图片中的构造器,该构造器三个参数前两个为对象类型,第三个为string类型,分别为:认证对象,凭证信息,realm名称。对应到我们自定义的realm中,就需要分别传入以下信息:认证对象属性,凭证信息(密码),自定义realm名称(this.getName()),我的bug是因为我传入的是第一个参数username,所以我获取的用户信息只能是string类型的用户名,得不到我想要的用户全部信息,所以就会出现string不能强转为domain类的错误
构造器调用后,看到构造器里面又有调用,第二句就不说了,就是把凭证信息设置为当前类的凭证信息,第一句实例化了一个SimplePrincipalCollection;
现在进入SimplePrincipalCollection类源码看一下:
在这里插入图片描述
实例化时调用的是上述构造器,可以看到,他对认证对象属性做了判断,判断是否为集合,否则就是单个属性,比如username或者id之类的,开始我传入的是string类型,就不会强转,所以这里也能看到存入如果是string类型的username这里不会转为集合,依然是原来类型
进入addAll方法,可以看了先判断,如果为空就会抛出异常,就是常见的空指针异常,如果不为空就会调用其他方法
在这里插入图片描述
接下来到这里存入对象时的源码就不一一分析了,再大概看一下取的过程
在这里插入图片描述
可以看到上图,重写的方法传入的参数为PrincipalCollection,通俗说就是对象属性集合,调用其中的getPrimaryPrincipal方法就可以获取认证对象存入的所有属性,即是上面分析的存入时的第一个参数,再看源码,PrincipalCollection是一个接口类型,进入实现类当中,如下图
在这里插入图片描述
可以看到一个两个实现类,两个都可以进去看一下,是内部采取不同的方式,但是拿存入的对象属性,源码就不再深入分析,有兴趣的可以深入看一下源码过程

在我看来,简单来说这就是一个存和取的过程,在认证时存入,随时都可以去取到存入的对象属性,在认证失效也就是退出登录的时候就清空数据,换认证信息登录后也是同样的道理,有认证对象属性存入,就能在认证之后取出利用,存可以根据需要存入,但是取,只能取存入的数据

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值