热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Shiro授权认证原理和流程

先来张图:这是一张shiro的功能图:Authentication:身份认证登录,验证用户是否拥有相应的身份Authorization:授权权限验证,验证某个已认证的用户是否拥有某

先来张图:

技术分享图片

这是一张shiro的功能图:

  • Authentication: 身份认证/登录,验证用户是否拥有相应的身份
  • Authorization: 授权/权限验证,验证某个已认证的用户是否拥有某个权限,包括验证用户是否拥有某个角色,或拥有某个操作权限
  • Session Management: 会话管理,shiro拥有自己的session(不需要web环境下就能使用)
  • Cryptography: 加密
  • Web Support: web支持,针对web应用提供一些功能
  • Caching: 缓存
  • Concurrency: shiro支持多线程应用的并发验证,即在一个线程中开启另一个线程,能把权限自动传播过去
  • Testing: 测试支持
  • Run As: 允许一个用户假装成为另一个用户(如果允许)的省份进行访问
  • Remember Me: 记住用户身份

再来一张图:

技术分享图片

  • Subject: 与应用交互的用户,Subject在shiro中是一个接口,定义了很多认证授权的方法,外部程序通过Subject进行认证授权,而Subject通过SecurityManager进行认证授权
    注意: Subject只是一个门面,SecurityManager才是实际的执行者
  • SecurityManager: 安全管理器,所有与安全有关的操作都会与SecurityManager交互,且管理着所有的Subject,是shiro的核心,负责与shiro其他组件进行交互,如通过Authenticator进行认证通过Authorizer进行授权通过SessionManager进行会话管理
    补充: SecurityManager是一个接口,继承了Authenticator,Authorizer,SessionManager三个接口
  • Realm: Shiro从Realm获取安全数据(如用户,角色,权限);也就是说SecurityManager要验证用户身份或操作权限,需要从Realm获取相应数据来判断(用户是否能登录,是否拥有什么权限等)
    注意: realm也是由SecurityManager控制

再来一张图:

技术分享图片

  • Subject: 与应用交互的用户
  • SecurityManager: 相当于SpringMVC中的DispatcherServlet,所有具体的交互都由SecurityManager控制;它管理着所有的Subject,且负责进行认证,授权,会话和缓存的管理
  • Authenticator: 认证器, 对用户身份进行验证;Authenticator是一个接口,shiro提供ModularRealmAuthenticator实现类,也可以自定义
  • Authorizer: 授权器,决定用户是否有权限进行某种操作,控制着用户能访问应用中的哪些功能
  • Realm: 安全实体数据源,可以有1个或多个
  • SessionManager: 管理session的生命周期(可以实现单点登录)
  • CacheManager: 缓存管理器
  • Cryptography: 密码管理模块

认证流程

技术分享图片

  1. 创建token令牌,token中有用户提交的认证信息即帐号和密码
  2. 执行Subject.login(token),最终由SecurityManager通过Authenticator进行认证
  3. Authenticator通过实现类ModularRealmAuthenticator调用Realm从数据源(如数据库)获得的真实账号和密码
  4. Realm通过token中的账号去数据源(数据库)中查找该账号,如果找不到,则给ModularRealmAuthenticator返回null,如果找到则匹配密码,密码相同则认证成功

补充: 认证失败后抛出的一些异常:

  • UnknownAccountException  帐号不存在
  • IncorrectCredentialsException  密码错误
  • DisabledAccountException   帐号被禁用
  • LockedAccountException  帐号被锁定
  • ExcessiveAttemptsException  登录失败次数过多
  • ExpiredCredentialsException  凭证过期

自定义Realm

shiro自带的Realm接口,CachingRealm负责缓存处理AuthenticationRealm负责认证AuthorizingRealm负责授权等,但是通常情况下,正确的用户信息都是从数据库中取出,所以需要自定义realm,通常自定义的realm继承AuthorizingRealm,认证是重写doGetAuthenticationInfo(AuthenticationToken token)方法,授权是重写doGetAuthorizationInfo(PrincipalCollection principals)方法

授权流程

技术分享图片

Shiro授权认证原理和流程


推荐阅读
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • 预备知识可参考我整理的博客Windows编程之线程:https:www.cnblogs.comZhuSenlinp16662075.htmlWindows编程之线程同步:https ... [详细]
  • 本文介绍了操作系统的定义和功能,包括操作系统的本质、用户界面以及系统调用的分类。同时还介绍了进程和线程的区别,包括进程和线程的定义和作用。 ... [详细]
  • 本文介绍了OkHttp3的基本使用和特性,包括支持HTTP/2、连接池、GZIP压缩、缓存等功能。同时还提到了OkHttp3的适用平台和源码阅读计划。文章还介绍了OkHttp3的请求/响应API的设计和使用方式,包括阻塞式的同步请求和带回调的异步请求。 ... [详细]
  • 本文介绍了C#中数据集DataSet对象的使用及相关方法详解,包括DataSet对象的概述、与数据关系对象的互联、Rows集合和Columns集合的组成,以及DataSet对象常用的方法之一——Merge方法的使用。通过本文的阅读,读者可以了解到DataSet对象在C#中的重要性和使用方法。 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • 本文介绍了在SpringBoot中集成thymeleaf前端模版的配置步骤,包括在application.properties配置文件中添加thymeleaf的配置信息,引入thymeleaf的jar包,以及创建PageController并添加index方法。 ... [详细]
  • 本文讲述了作者通过点火测试男友的性格和承受能力,以考验婚姻问题。作者故意不安慰男友并再次点火,观察他的反应。这个行为是善意的玩人,旨在了解男友的性格和避免婚姻问题。 ... [详细]
  • 本文详细介绍了Linux中进程控制块PCBtask_struct结构体的结构和作用,包括进程状态、进程号、待处理信号、进程地址空间、调度标志、锁深度、基本时间片、调度策略以及内存管理信息等方面的内容。阅读本文可以更加深入地了解Linux进程管理的原理和机制。 ... [详细]
  • 本文介绍了Composer依赖管理的重要性及使用方法。对于现代语言而言,包管理器是标配,而Composer作为PHP的包管理器,解决了PEAR的问题,并且使用简单,方便提交自己的包。文章还提到了使用Composer能够避免各种include的问题,避免命名空间冲突,并且能够方便地安装升级扩展包。 ... [详细]
  • Java和JavaScript是什么关系?java跟javaScript都是编程语言,只是java跟javaScript没有什么太大关系,一个是脚本语言(前端语言),一个是面向对象 ... [详细]
  • Todayatworksomeonetriedtoconvincemethat:今天在工作中有人试图说服我:{$obj->getTableInfo()}isfine ... [详细]
  • 篇首语:本文由编程笔记#小编为大家整理,主要介绍了软件测试知识点之数据库压力测试方法小结相关的知识,希望对你有一定的参考价值。 ... [详细]
author-avatar
帅气小子勇哥
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有