转自:https://blog.csdn.net/qq_35981283/article/details/78634575
SimpleAuthenticationInfo 这里原理很简单,又有一些值得挖掘的东西。
//此处使用的是user对象,不是username
SimpleAuthenticationInfo authenticationInfo = new SimpleAuthenticationInfo(
user,
user.getPassword(),
getName()
);123456
这个东西是在 realm 中的,第一个参数 user,这里好多地方传的时候都是 user 对象,但是都在备注用户名。可是我如果传入 username,就会报类型转换问题。
经过 debug,确定了 subject.getPrincipal()获取的 Object 类型就和第一个参数相同
但是在开涛大神的博客中,无状态的 shiro 里,那边给出的例子是传 username。我自己测试的,可以传 username,也可以传 user 对象,仅限他那边一段代码。网上有文章说,这里其实是 user 和 username 的集合,后端是分两个字段接收的。由于时间的问题,没有深入里了解这块,传 user 对象是 OK 的。
第二个字段是 user.getPassword(),注意这里是指从数据库中获取的 password。
第三个字段是 realm,即当前 realm 的名称。
看了几篇文章介绍说,这块对比逻辑是先对比 username,但是 username 肯定是相等的,所以真正对比的是 password。从这里传入的 password(这里是从数据库获取的)和 token(filter 中登录时生成的)中的 password 做对比,如果相同就允许登录,不相同就抛出异常。
如果验证成功,最终这里返回的信息 authenticationInfo 的值与传入的第一个字段的值相同(我这里传的是 user 对象)。
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于