首页 > 其他分享 >shiro登录认证过程讲解

shiro登录认证过程讲解

时间:2023-01-13 11:35:28浏览次数:45  
标签:map realm 认证 token 讲解 password 方法 shiro

先粘出登录的代码

​@RequestMapping(value="/submitLogin",method = RequestMethod.POST)
@ResponseBody
public Map<String, Object> submitLogin(String username,String password){
System.out.println(username+"-----"+password);
String msg = "";
Map<String, Object> map = new HashMap<>();
try {
UsernamePasswordToken token = token = new UsernamePasswordToken(username, password);
char[] password1 = token.getPassword();
String s = password1.toString();

System.out.println("*******"+s);
SecurityUtils.getSubject().login(token);
token.setRememberMe(true);
map.put("status",200);
} catch (UnknownAccountException e) {
msg = "UnknownAccountException -- > 账号不存在:";
map.put("status",400);
} catch (IncorrectCredentialsException e){
msg = "IncorrectCredentialsException -- > 密码不正确:";
map.put("status",500);
}catch (Exception exception){
msg = "else >> "+exception;
System.out.println("else -- >" + exception);
}
return map;
}

可以看到已经获取到了username和password ,为了接下来的认证过程,我们需要获取subject对象,也就是代表当前登录用户,并且要将username和password两个变量设置到UsernamePasswordToken对象的token中, 调用SecurityUtils.getSubject().login(token)方法,将 token传入


接下来看看login方法的实现:

主要还是用到了securityManager安全管理器

shiro登录认证过程讲解_缓存

进入securityManager里边的login方法,看看他的实现:

shiro登录认证过程讲解_System_02


 在这个方法中定义了AuthenticationInfo对象来接受从Realm传来的认证信息

进入authenticate方法中


public AuthenticationInfo authenticate(AuthenticationToken token) throws AuthenticationException {

       return this.authenticator.authenticate(token);

   }


发现调用了authenticator的authenticate这个方法

进入this.authenticator.authenticate(token)这个方法中

shiro登录认证过程讲解_权限_03


在这个 类中调用了这个方法,再进去看他的实现

​protected AuthenticationInfo doAuthenticate(AuthenticationToken authenticationToken) throws AuthenticationException {

       this.assertRealmsConfigured();

       Collection<Realm> realms = this.getRealms();

       return realms.size() == 1?this.doSingleRealmAuthentication((Realm)realms.iterator().next(), authenticationToken):this.doMultiRealmAuthentication(realms, authenticationToken);

   }


在这里才是刚才前边的那个authenticator的实现, this.assertRealmsConfigured() 这个方法是判断realm是否存在,不存在则抛出异常,他会根据realm的个数来判断执行哪个方法,上篇中springboot整合shiro我只配置了一个realm,所以他只会执行this.doSingleRealmAuthentication((Realm)realms.iterator().next(), authenticationToken)这个方法,并且会将 realm和token作为参数传入,这里的realm其实就是自己定义的MyShiroRealm


接下来再进入doSingleRealmAuthentication这个方法中,

shiro登录认证过程讲解_System_04


在这里 他会先判断realm是否支持token

接下来执行else中的getAuthenticationInfo方法

shiro登录认证过程讲解_java_05


this.getCachedAuthenticationInfo(token)这个方法是从shiro缓存中读取用户信息,如果没有,才从realm中获取信息。如果是第一次登陆,缓存中肯定没有认证信息,所以会执行this.doGetAuthenticationInfo(token)这个方法。

查看this.doGetAuthenticationInfo(token)方法,会发现有这么几个类提供我们选择

shiro登录认证过程讲解_shiro_06


其中就有我们自定义的realm,进去

shiro登录认证过程讲解_缓存_07

 所以 ,上边的doGetAuthorizationInfo是 执行的我们自定义realm中重写的doGetAuthorizationInfo这个方法。这个方法就会从数据库中读取我们所需要的信息,最后封装成SimpleAuthorizationInfo返回去。


现在获取到认证信息了,接下来就是shiro怎么去进行认证,我们返回去看

shiro登录认证过程讲解_缓存_08

获取 完信息之后就是进行密码匹配,进入assertCredentialsMatch方法中看一下,

shiro登录认证过程讲解_java_09

首先 获取一个CredentialsMatcher对象,译为凭证匹配器,这个类的主要作用就是将用户输入的密码一某种计算加密。

再看一下cm.doCredentialsMatch(token,info)


shiro登录认证过程讲解_shiro_10

这里会用到equals方法对token中加密的密码和从数据库中取出来的info中的密码进行对比,如果认证相同就返回true,失败就返回false,并抛出AuthenticationException,将info返回到defaultSecurityManager中,到此认证过程结束。

标签:map,realm,认证,token,讲解,password,方法,shiro
From: https://blog.51cto.com/u_15941034/6005849

相关文章

  • 带绳窗帘出亚马逊做什么认证呢?
    美国消费品安全委员会于2022年11月2日通过了一项新的联邦安全标准。该标准适用于定制窗帘的操作绳,目的是降低带绳窗帘导致儿童窒息死亡和严重危及生命的伤害的风险。委员会......
  • 2023最新软考高级信息系统项目管理师 学习课程视频+考试资料讲解+论文收集
    课程简介名称:2023最新软考高级信息系统项目管理师学习课程视频+考试资料讲解+论文收集类型:考级培训课时:没数,估计有一两百课时下载地址点击前往原文底部进行下载......
  • 【微信小程序入门到精通】— button 超详细讲解
    对于目前形式,微信小程序是一个热门,那么我们该如何去学习并且掌握之后去做实际项目呢?为此我特意开设此专栏,在我学习的同时也将其分享给大家!本文主要给大家介绍一下button......
  • Linux之select、poll、epoll讲解
    目录1select、poll、epoll1.1引言1.2IO和Linux内核发展1.2.1整体概述1.2.2阻塞IO1.2.3非阻塞IO1.2.4select1.2.5共享空间1.2.6零拷贝1.3select1.3.1简介1.3.2s......
  • 亚马逊小家电深圳市面包机CE认证办理EMC和LVD指令
    面包机CE认证办理,相信还是有不少家庭都有这个电器吧,可能在欧盟比较常见,因为那边很多家庭都是自己做早餐,面包机可能是不能或缺的机器,一份美美的早餐让面包机在欧盟市场的占有......
  • 欧盟电动滑板车CE认证,EN17128测试标准详情
    电动滑板车是继传统滑板之后的又一新型滑板运动产品。电动滑板车节约能源,充电快速且续航能力强。整车造型美观、可以折叠,操作方便,驾驶更安全。电动滑板车起源于德国,发展于欧......
  • SpringBoot不同环境的配置文件讲解
    前言​ 源于工作中发现项目中的的application.yml有多样的application.yml,如下图所示:​ 了解过后发现是因为测试环境和生产环境一些配置可能会有差异,比如数据库的地址、......
  • CH573 CH582 CH579蓝牙从机(peripheral)例程讲解六(蓝牙设置白名单)
    蓝牙从机设置白名单,可以只扫描应答(白名单中列出的)设备,只允许(白名单中列出的)设备连接。蓝牙主机设置白名单,可以只扫描、连接特定的蓝牙设备(白名单中列出的)。一.蓝牙从机白......
  • aws saa是什么缩写?aws saa认证考察什么?
    目前,AWS在全球云计算市场占有最高的市场份额,很多大型的跨国企业都在使用AWS提供的云服务。在一些以AWS为主力云平台的企业,甚至对技术人员提出了必须要通过AWS认证考试......
  • Asp-Net-Core权限认证
    title:Asp.NetCore权限认证date:2022-10-2716:17:52tags:-.NET翻了很多的博客,文档,发现asp.netcore自带的权限认证还是比较复杂的,极少有哪篇文章把整个体系涉及......