报错信息:
报错显示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是一个接口类型,进入实现类当中,如下图
可以看到一个两个实现类,两个都可以进去看一下,是内部采取不同的方式,但是拿存入的对象属性,源码就不再深入分析,有兴趣的可以深入看一下源码过程
在我看来,简单来说这就是一个存和取的过程,在认证时存入,随时都可以去取到存入的对象属性,在认证失效也就是退出登录的时候就清空数据,换认证信息登录后也是同样的道理,有认证对象属性存入,就能在认证之后取出利用,存可以根据需要存入,但是取,只能取存入的数据