shiro快速入门

文章目录

      • 权限管理
        • 什么是权限管理?
        • 什么是身份认证?
        • 什么是授权?
      • 什么是shiro?
      • shiro的核心架构
        • shiro中的三个核心组件
      • shiro中的认证
      • shiro中的授权
      • shiro使用默认Ehcache实现缓存
      • shiro使用redis作为缓存实现

权限管理

什么是权限管理?

基本上涉及到用户参与的系统都需要进行权限管理,权限管理属于系统安全的范畴,权限管理实现对用户访问系统的控制,按照安全规则或者安全策略控制用户可以访问而且只能访问自己被授权的资源。

权限管理包括用户身份认证授权两部分,简称认证授权 ,对于需要访问控制的资源用户首先经过身份认证,认证过后用户具有该资源的访问权限即可访问。

什么是身份认证?

身份认证,就是判断一个用户是否为合法用户的处理过程,最常用的简单身份认证方式是系统通过核对用户输入的用户名和口令,看其是否与系统中存储的该用户的用户名和口令一致,来判断用户身份是否正确。对于采用指纹等系统,则出示指纹;对于硬件key等刷卡系统,则需要刷卡。

什么是授权?

授权,即访问控制,控制谁能访问哪些资源。主体进行身份认证后需要分配权限方可访问系统的资源,对于某些资源没有权限是无法访问的。

什么是shiro?

Apache Shiro是一个强大且易用的Java安全框架,执行身份验证、授权、密码和会话管理。使用Shiro的易于理解的API,您可以快速、轻松地获得任何应用程序,从最小的移动应用程序到最大的网络和企业应用程序。

shiro是apache旗下一个开源框架,它将软件系统的安全认证相关的功能抽取出来,实现用户身份认证、权限授权、加密、会话管理等功能,组成了一个通用的安全认证框架。

shiro的核心架构

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LkhwGfkT-1690989234372)(/1594116621447.png)]

  • Subject(主体)
    当前与软件进行交互的实体(用户,第三方服务,计划任务等)的特定于安全性的“视图”。

  • SecurityManager(安全管理器)
    SecurityManager是Shiro体系结构的核心。它主要是一个“伞”对象,用于协调其托管组件以确保它们能够顺利协同工作。它还管理Shiro对每个应用程序用户的视图,因此它知道如何对每个用户执行安全性操作。

  • Authenticator(认证者)
    Authenticator是负责执行用户的身份验证(登录)并对其作出反应的组件。 当用户尝试登录时,该逻辑由身份验证器执行。 身份验证器知道如何与存储相关用户/帐户信息的一个或多个Realms协调。 从这些领域获得的数据用于验证用户的身份,以确保用户确实是他们所说的真实身份。

    • Authentication Strategy(身份验证策略)

      如果Realm配置了多个身份验证策略,则AuthenticationStrategy它将协调领域以确定身份验证尝试成功或失败的条件(例如,一个领域成功但其他领域失败) ,尝试是否成功?所有领域都必须成功吗?只有第一个?)。

  • Authorizer(授权者)
    授权者是负责确定应用程序中用户访问控制的组件。 它是最终表明是否允许用户做某事的机制。 与身份验证器一样,授权者也知道如何与多个后端数据源进行协调以访问角色和权限信息。 授权者使用此信息来确定是否允许用户执行给定的操作。

  • SessionManager(会话管理器)
    SessionManager知道如何创建和管理用户会话生命周期,以便为所有环境中的用户提供可靠的会话体验。 这是安全框架领域中的一项独特功能-Shiro能够在任何环境中本机管理用户会话,即使没有Web / Servlet或EJB容器也可以。 默认情况下,Shiro将使用现有的会话机制(例如Servlet容器)(如果可用),但是如果没有这种机制(例如在独立应用程序或非Web环境中),它将使用其内置的企业会话管理来 提供相同的编程经验。 SessionDAO的存在是为了允许使用任何数据源来保留会话。

    • SessionDAO
      SessionDAO代表SessionManager执行会话持久性(CRUD)操作。 这允许将任何数据存储插入会话管理基础结构。
  • CacheManager
    CacheManager创建和管理其他Shiro组件使用的Cache实例生命周期。 由于Shiro可以访问许多后端数据源以进行身份验证,授权和会话管理,因此缓存一直是框架中的一流架构功能,可以在使用这些数据源时提高性能。 可以将任何现代的开源和/或企业缓存产品插入Shiro,以提供快速有效的用户体验。

  • Cryptography(密码学)

    密码术是企业安全框架的自然补充。 Shiro的加密软件包包含易于使用和理解的加密密码,哈希(又名摘要)和不同编解码器实现的表示形式。 该软件包中的所有类都经过精心设计,以使其易于使用和理解。 使用Java的本机加密技术支持的任何人都知道,驯服它可能是具有挑战性的动物。 Shiro的加密API简化了复杂的Java机制,并使加密技术易于为普通凡人使用。

  • Realms(领域)
    如上所述,领域充当Shiro与您应用程序的安全数据之间的“桥梁”或“连接器”。 当真正需要与安全性相关的数据(例如用户帐户)进行交互以执行身份验证(登录)和授权(访问控制)时,Shiro会从一个或多个为应用程序配置的领域中查找许多此类内容。 您可以根据需要配置任意多个领域(通常每个数据源一个),并且Shiro会根据需要与它们进行协调,以进行身份验证和授权。

shiro中的三个核心组件

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YDtmj89t-1690989234373)(/1594118706808.png)]

三个核心组件:Subject, SecurityManager 和 Realms.

Subject:即“当前操作用户”。但是,在Shiro中,Subject这一概念并不仅仅指人,也可以是第三方进程、后台帐户(Daemon Account)或其他类似事物。它仅仅意味着“当前跟软件交互的东西”。
  Subject代表了当前用户的安全操作,SecurityManager则管理所有用户的安全操作。
  SecurityManager:它是Shiro框架的核心,典型的Facade(外观)模式,Shiro通过SecurityManager来管理内部组件实例,并通过它来提供安全管理的各种服务。
  Realm: Realm充当了Shiro与应用安全数据间的“桥梁”或者“连接器”。也就是说,当对用户执行认证(登录)和授权(访问控制)验证时,Shiro会从应用配置的Realm中查找用户及其权限信息。
  从这个意义上讲,Realm实质上是一个安全相关的DAO:它封装了数据源的连接细节,并在需要时将相关数据提供给Shiro。当配置Shiro时,你必须至少指定一个Realm,用于认证和(或)授权。配置多个Realm是可以的,但是至少需要一个。
  Shiro内置了可以连接大量安全数据源(又名目录)的Realm,如LDAP、关系数据库(JDBC)、类似INI的文本配置资源以及属性文件等。如果缺省的Realm不能满足需求,你还可以插入代表自定义数据源的自己的Realm实现。

shiro中的认证

在这里插入图片描述

认证流程图:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BjG0KVEO-1690989234374)(/1594118964312.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nQ0CTKKx-1690989234374)(/1594119924681.png)]

认证流程

  1. 系统调用subject主体的login(登录)方法将用户信息token(令牌-代表一定的身份)提交(请求)给SecurityManager对象(shiro安全框架的核心对象-负责调配各个组件-处理请求的入口)认证
  2. SecurityManager将认证操作委托给认证器对象Authenticator(认证管理器),认证管理器里有认证策略Authentication Strategy(认证方式),Authenticator将身份信息传递给Realm(完成数据的加载和封装)。
  3. Realm访问数据库获取用户信息然后对信息进行封装并返回给认证管理器Authenticator。
  4. Authenticator 对realm返回的信息进行身份认证(把用户输入的和数据库里查询到的信息做比对)。

shiro中的授权

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fCCNliYY-1690989234374)(/1594119807010.png)]

授权流程图:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XccgvG9d-1690989234375)(/1594119368615.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lIOjnhrm-1690989234375)(/1594119873785.png)]

授权流程

  1. 系统调用subject主体对象相关方法将用户权限信息(例如isPermitted)递交给SecurityManager。
  2. SecurityManager将权限检测操作委托给Authorizer授权管理器对象。
  3. Authorizer授权管理器将用户信息委托给realm。
  4. Realm访问数据库获取用户权限信息(有没有权限,有什么样的权限)并封装。
  5. Authorizer对用户授权信息进行判定(判断用户访问资源时需要什么权限,假如用户所具有的权限包含这个资源访问时所需要的权限,那么用户就可以访问这个资源了)。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tP8UIwEk-1690989234375)(/1594120003321.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-r0uk7X5L-1690989234376)(/1594120222340.png)]

shiro使用默认Ehcache实现缓存

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QqBFEv0T-1690989234376)(/1594120279192.png)]

本地缓存,每次断电重启,还是会查数据库

<dependency>
    <groupId>org.apache.shiro</groupId>
    <artifactId>shiro-ehcache</artifactId>
    <version>1.5.2</version>
</dependency>
//3.创建自定义Realm
@Bean(name = "realm")   //指定别名
public Realm getRealm(){
    //创建密码匹配器
    HashedCredentialsMatcher matcher = new HashedCredentialsMatcher();
    //设置匹配算法
    matcher.setHashAlgorithmName("md5");
    //设置散列次数
    matcher.setHashIterations(1024);
    UserRealm realm = new UserRealm();
    realm.setCredentialsMatcher(matcher);

    //设置缓存,开启缓存管理器  EhCacheManager 是shiro提供的
    realm.setCacheManager(new EhCacheManager());
    //开启全局缓存
    realm.setCachingEnabled(true);
    //开启认证缓存
    realm.setAuthenticationCachingEnabled(true);
    //设置认证缓存的名字,不设置有默认名字
    realm.setAuthenticationCacheName("authenticationCache");
    //开启授权缓存
    realm.setAuthorizationCachingEnabled(true);
    //设置授权缓存的名字
    realm.setAuthorizationCacheName("authorizationCache");
    return realm;
}

shiro使用redis作为缓存实现

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/58592.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

31.利用linprog 解决 投资问题(matlab程序)

1.简述 语法&#xff1a;[X,FVAL] linprog(f,a,b,Aeq,Beq,LB,UB,X0)&#xff1b; X 为最终解 &#xff0c; FVAL为最终解对应的函数值 *注意&#xff1a;求最大值时&#xff0c;结果FVAL需要取反* f 为决策函数的系数矩阵。 *注意&#xff1a;当所求为最大值…

SpringBoot实现数据库读写分离

SpringBoot实现数据库读写分离 参考博客https://blog.csdn.net/qq_31708899/article/details/121577253 实现原理&#xff1a;翻看AbstractRoutingDataSource源码我们可以看到其中的targetDataSource可以维护一组目标数据源(采用map数据结构)&#xff0c;并且做了路由key与目标…

LeetCode 26 题:删除有序数组的重复项

思路 在写这一个题时&#xff0c;我突然想到了Python中的 set&#xff08;&#xff09;函数可能会有大用处&#xff0c;便选择了用Python写。 set&#xff08;&#xff09;函数可以将列表转化为集合&#xff0c;集合会保证元素的单一性&#xff0c;所以会自动删去相同字符。 …

sqlserver命令插入另一个数据库的数据主键自增

1、数据情况 两个数据库字段是一致的&#xff0c;其中OBJECTID是主键字段&#xff0c;而且两个表都是从1自增排序 2、需求 现在需要将另一个数据库中的数据&#xff0c;通过sqlserver语句的方法&#xff0c;来插入数据&#xff0c;保持自增字段是自增的 解决方法 sqlserv…

基于边缘无线协同感知的低功耗物联网LPIOT技术:赋能智慧园区方案以及数字工厂领域

回到2000年左右&#xff0c;物联网的底层技术支撑还是“ZigBee”&#xff0c;虽然当时ZigBee的终端功耗指标其实也并不庞大&#xff0c;但是&#xff0c;“拓扑复杂导致工程实施难度大”、“网络规模小导致的整体效率低下”都成为限制其发展的主要因素。 LPWAN&#xff0c;新一…

推荐两款github敏感信息搜集工具(gsil、gshark)

推荐两款github敏感信息搜集工具&#xff08;gsil、gshark&#xff09; - 云社区 - 腾讯云 (tencent.com) github敏感信息泄露是很多企业时常忽视的一个问题&#xff0c;国外有一份研究报告显示&#xff0c;在超过24,000份的GitHub公开数据中&#xff0c;发现有数千个文件中可能…

ChatGPT已打破图灵测试,新的测试方法在路上

生信麻瓜的 ChatGPT 4.0 初体验 偷个懒&#xff0c;用ChatGPT 帮我写段生物信息代码 代码看不懂&#xff1f;ChatGPT 帮你解释&#xff0c;详细到爆&#xff01; 如果 ChatGPT 给出的的代码不太完善&#xff0c;如何请他一步步改好&#xff1f; 全球最佳的人工智能系统可以通过…

在windows配置redis的一些错误及解决方案

目录 Unable to connect to Redis; nested exception is io.lettuce.core.RedisConnectionException:用客户端Redis Desktop Manager一样的密码端口&#xff0c;是可以正常连接的&#xff0c;但是运行java程序之后使用接口请求就会报错 Unable to connect to Redis; nested e…

使用正则表达式 移除 HTML 标签后得到字符串

需求分析 后台返回的数据是 这样式的 需要讲html 标签替换 high_light_text: "<span stylecolor:red>OPPO</span> <span stylecolor:red>OPPO</span> 白色 01"使用正则表达式 function stripHTMLTags(htmlString) {return htmlString.rep…

【腾讯云Cloud Studio实战训练营】使用Cloud Studio迅捷开发一个3D家具个性化定制应用

目录 前言&#xff1a; 一、腾讯云 Cloud Studio介绍&#xff1a; 1、接近本地 IDE 的开发体验 2、多环境可选&#xff0c;或连接到云主机 3、随时分享预览效果 4、兼容 VSCode 插件 5、 AI代码助手 二、腾讯云Cloud Studio项目实践&#xff08;3D家具个性化定制应用&…

WPF中自定义Loading图

纯前端方式&#xff0c;通过动画实现Loading样式&#xff0c;如图所示 <Grid Width"35" Height"35" HorizontalAlignment"Center" VerticalAlignment"Center" Name"Loading"><Grid.Resources><DrawingBrus…

程序员之马上结束任务

计算机系的男同学追班里一女同学&#xff0c;结果此女总是躲躲闪闪。 男的看没戏&#xff0c;就另找了一个去追&#xff0c;结果这女的不满意了&#xff0c;质问这男的为啥抛弃她。 男的问&#xff1a;“请教一个电脑问题&#xff0c;如果你点击一个程序&#xff0c;总是提示…

[openCV]基于赛道追踪的智能车巡线方案V1

import cv2 as cv import os import numpy as npimport time# 遍历文件夹函数 def getFileList(dir, Filelist, extNone):"""获取文件夹及其子文件夹中文件列表输入 dir&#xff1a;文件夹根目录输入 ext: 扩展名返回&#xff1a; 文件路径列表""&quo…

ffmpeg.c源码与函数关系分析

介绍 FFmpeg 是一个可以处理音视频的软件&#xff0c;功能非常强大&#xff0c;主要包括&#xff0c;编解码转换&#xff0c;封装格式转换&#xff0c;滤镜特效。FFmpeg支持各种网络协议&#xff0c;支持 RTMP &#xff0c;RTSP&#xff0c;HLS 等高层协议的推拉流&#xff0c…

docker创建镜像并上传云端服务器

docker创建镜像并上传云端服务器 docker容器与镜像的关系1.基本镜像相关文件创建1.1 创建dockerfile文件1.2.创建do.sh文件1.3 创建upload_server_api.py文件1.4 创建upload_server_webui.py文件1.5 文件保存位置 2. 创建镜像操作2.1 创建镜像2.3 创建容器2.2 进入环境容器2.3 …

Jenkins工具系列 —— 启动 Jenkins 服务报错

错误显示 apt-get 安装 Jenkins 后&#xff0c;自动启动 Jenkins 服务报错。 排查原因 直接运行jenkins命令 发现具体报错log&#xff1a;Failed to start Jetty或Failed to bind to 0.0.0.0/0.0.0.0:8080或Address already in use 说明&#xff1a;这里提示的是8080端口号…

LNMP及论坛搭建(第一个访问,单节点)

LNMP&#xff1a;目前成熟的一个企业网站的应用模式之一&#xff0c;指的是一套协同工作的系统和相关软件 能够提供静态页面服务&#xff0c;也可以提供动态web服务&#xff0c;LNMP是缩写 L&#xff1a;指的是Linux操作系统。 N&#xff1a;指的是nginx&#xff0c;nginx提…

【Vue3项目实战】vue3项目基于el-menu封装左侧菜单栏组件

文章目录 概述一、先看效果1.1 静态效果1.2 动态效果 二、核心思路三、全量代码3.1 文件目录结构3.2 /sidebar/index.vue 中3.3 /sidebar/sidebarItem.vue 中3.4 路由表结构 四、代码讲解五、SVG组件六、系列文章友链1、[配置husky、stylelint、commitlint&#xff0c;实现git提…

HadoopWEB页面上传文件报错Couldn‘t upload the file course_info.txt

HadoopWEB页面上传文件报错Couldn’t upload the file course_info.txt 右键F2检查发现&#xff1a;文件上传PUT操作的IP地址是节点IP别名识别不到导致 解决方法&#xff1a;在WEB页面访问浏览器所在机器上面配置hosts映射地址(注意:配置的是浏览器访问的地址不是hadoop节点所在…

使用Golang实现一套流程可配置,适用于广告、推荐系统的业务性框架——组合应用

在《使用Golang实现一套流程可配置&#xff0c;适用于广告、推荐系统的业务性框架——简单应用》中&#xff0c;我们看到了各种组合Handler的组件&#xff0c;如HandlerGroup和Layer。这些组件下面的子模块又是不同组件&#xff0c;比如LayerCenter的子组件是Layer。如果此时我…