shiro架构的入门介绍

本文涉及的产品
密钥管理服务KMS,1000个密钥,100个凭据,1个月
简介: shiro是apache的一个开源框架,是一个权限管理的框架,实现 用户认证、用户授权。 spring中有spring security (原名Acegi),是一个权限框架,它和spring依赖过于紧密,没有shiro使用简单。 shiro不依赖于spring,shiro不仅可以实现 web应用的权限管理,还可以实现c/s系统, 分布式系统权限管理,shiro属于轻量框架,越来越多企业项目开始使用shiro。
  1. 什么是shiro
    shiro是apache的一个开源框架,是一个权限管理的框架,实现 用户认证、用户授权。
    spring中有spring security (原名Acegi),是一个权限框架,它和spring依赖过于紧密,没有shiro使用简单。
    shiro不依赖于spring,shiro不仅可以实现 web应用的权限管理,还可以实现c/s系统,
    分布式系统权限管理,shiro属于轻量框架,越来越多企业项目开始使用shiro。
  2. 在应用程序角度来观察如何使用Shiro完成工作(图01)

01 在应用程序角度来观察如何使用Shiro完成工作.png
Subject:主体,代表了当前“用户”,这个用户不一定是一个具体的人,与当前应用交互的任何东西都是Subject,如网络爬虫,机器人等;即一个抽象概念;所有Subject 都绑定到SecurityManager,与Subject的所有交互都会委托给SecurityManager;可以把Subject认为是一个门面;SecurityManager才是实际的执行者;
SecurityManager:安全管理器;即所有与安全有关的操作都会与SecurityManager 交互;且它管理着所有Subject;可以看出它是Shiro 的核心,它负责与后边介绍的其他组件进行交互,如果学习过SpringMVC,你可以把它看成DispatcherServlet前端控制器;
Realm:域,Shiro从从Realm获取安全数据(如用户、角色、权限),就是说SecurityManager要验证用户身份,那么它需要从Realm获取相应的用户进行比较以确定用户身份是否合法;也需要从Realm得到用户相应的角色/权限进行验证用户是否能进行操作;可以把Realm看成DataSource,即安全数据源。

  1. shiro架构(图02)

02 shiro架构.png
3.1 subject:主体,可以是用户也可以是程序,主体要访问系统,系统需要对主体进行认证、授权。
3.2 securityManager:安全管理器,主体进行认证和授权都是通过securityManager进行。securityManager是一个集合,

                   真正做事的不是securityManager而是它里面的东西。

3.3 authenticator:认证器,主体进行认证最终通过authenticator进行的。
3.4 authorizer:授权器,主体进行授权最终通过authorizer进行的。
3.5 sessionManager:web应用中一般是用web容器(中间件tomcat)对session进行管理,shiro也提供一套session管理的方式。

                  shiro不仅仅可以用于web管理也可以用于cs管理,所以他不用web容器的session管理。

3.6 SessionDao: 通过SessionDao管理session数据,针对个性化的session数据存储需要使用sessionDao

                (如果用tomcat管理session就不用SessionDao,如果要分布式的统一管理session就要用到SessionDao)。

3.7 cache Manager:缓存管理器,主要对session和授权数据进行缓存(权限管理框架主要就是对认证和授权进行管理,

                 session是在服务器缓存中的),比如将授权数据通过cacheManager进行缓存管理,
                 和ehcache整合对缓存数据进行管理(redis是缓存框架)。

3.8 realm:域,领域,相当于数据源,通过realm存取认证、授权相关数据(原来是通过数据库取的)。

         注意:authenticator认证器和authorizer授权器调用realm中存储授权和认证的数据和逻辑。

3.9 cryptography:密码管理,比如md5加密,提供了一套加密/解密的组件,方便开发。比如提供常用的散列、加/解密等功能。比如 md5散列算法(md5只有加密没有解密)。

-- 帐号/密码认证

  1. Shiro身份验证(shiro.ini)
    https://www.w3cschool.cn/shiro/andc1if0.html

    小结:身份验证的步骤
    1 收集用户身份 / 凭证,即如用户名 / 密码;
    2 调用 Subject.login 进行登录,如果失败将得到相应的 AuthenticationException 异常,根据异常提示用户错误信息;否则登录成功;
    3 最后调用 Subject.logout 进行退出操作。

-- zs/ls/ww/admin能有一样的操作权限吗?

  1. Shiro权限认证(支持三种方式的授权)
    5.1 编程式:通过写if/else授权代码块完成

     Subject subject = SecurityUtils.getSubject();
     if(subject.hasRole("admin")) {
       //有权限
     } else {
       //无权限
     }
     
    

    5.2 注解式:通过在执行的Java方法上放置相应的注解完成,另外,没有权限将抛出相应的异常

     @RequiresRoles("admin")
     public void hello() {
       //有权限
     }
    
     作业1:shiro常用注解及作用?
    

    5.3 JSP/GSP标签:在JSP/GSP页面通过相应的标签完成

     <shiro:hasRole name="admin">
     <!— 有权限 —>
     </shiro:hasRole>
    
    
  2. 授权
    6.1 基于角色的访问控制(shiro-role.ini|粗颗粒度)

     规则:“用户名=密码,角色1,角色2”
     方法: hasRole/hasRoles/hasAllRoles和checkRole/checkRoles
      
     注1:hasXxx和checkXxx区别,hasXxx会返回boolean类型的数据,用来判断,而checkXxx不会返回任何东西,
          如果验证成功就继续处理下面的代码,否则会抛出一个异常UnauthorizedException
    

    6.2 基于资源的访问控制(shiro-permission.ini|细颗粒度)

     即:首先根据用户名找到角色,然后根据角色再找到权限 
     规则1:“用户名=密码,角色1,角色2”
     规则2:“角色=权限1,权限2”     
     规则3:“资源标识符:操作:对象实例ID” 即对哪个资源的哪个实例可以进行什么操作
             注:每个部分可以不填写,默认就是*
             user:*:*
             tea:*:*
             stu:*:*
             
    
     方法: isPermitted/checkPermissions   
    
     注1:permission:许可,权限
     注2:create,update,delete,view这些是可以自行定义的
    
    
  3. shiro集成web(shiro-web.ini)
    7.1 配置shiro-web.ini文件

    7.2 通过监听器EnvironmentLoaderListener读取配置文件,来创建相应的WebEnvironment

     注1:可通过shiroConfigLocations参数,指定shiro的配置文件
     注2:shiroConfigLocations 默认是“/WEB-INF/shiro.ini”,IniWebEnvironment默认是先从/ WEB-INF/shiro.ini加载,
          如果没有就默认加载 classpath:shiro.ini。
    

    7.3 配置过滤器ShiroFilter

     注1:放在web.xml文件的最前面
    

    7.4 开发中不断修改配置文件

  4. 其它
    8.1 不足之处

     1. 用户名/密码硬编码在ini配置文件,以后需要改成如数据库存储,且密码需要加密存储;
     2. 用户身份Token可能不仅仅是用户名/密码,也可能还有其他的,如登录时允许用户名/邮箱/手机号同时登录。

    8.2 JUnit4:Test注解的两个属性:expected和timeout

     expected属性:用来指示期望抛出的异常类型,抛出指定的异常类型,则测试通过 。
     timeout属性:用来指示时间上限,当测试方法的时间超过这个时间值时测试就会失败(注意超时了报的是Errors,如果是值错了是Failures)
    
  5. 配置文件
    xml
    properties
    ini

    [node]
    key=value   
相关文章
|
6月前
|
存储 测试技术 数据库
谈谈代码:降低复杂度,从放弃三层架构到DDD入门
最近我发现团队某项目的复杂度越来越高(典型的三层架构),具体表现为: - 代码可读性较差:各个服务之间调用复杂,流程不清晰 - 修改某服务业务代码导致大量无关服务的测试用例失败,单个功能开发者很难迅速定位相关问题 - 测试用例特别难编写,需要mock大量数据来拉起整块服务
217 4
谈谈代码:降低复杂度,从放弃三层架构到DDD入门
|
6月前
|
Python API 网络架构
Django实践-10RESTful架构和DRF入门
Django实践-10RESTful架构和DRF入门
Django实践-10RESTful架构和DRF入门
|
6月前
|
SQL 分布式计算 Hadoop
Azkaban【基础 01】核心概念+特点+Web界面+架构+Job类型(一篇即可入门Azkaban工作流调度系统)
【2月更文挑战第6天】Azkaban【基础 01】核心概念+特点+Web界面+架构+Job类型(一篇即可入门Azkaban工作流调度系统)
467 0
|
6月前
|
Java Docker 容器
美团大牛精心整理SpringBoot学习笔记,从Web入门到系统架构
近期慢慢复工,为了准备面试,各路码友们都开始磨拳擦脚,背面试题、知识点。小编最近得一良友赠送了一份关于SpringBoot的学习笔记,简直不要好用,理论解析言简意赅,每一步操作都有图片展示。这么好的东西肯定不能私藏,为了感谢大家在2019年里的支持,我现在将这份笔记赠送给大家,祝大家前程似锦,Offer不断!
|
17天前
|
Kubernetes 关系型数据库 MySQL
Kubernetes入门:搭建高可用微服务架构
【10月更文挑战第25天】在快速发展的云计算时代,微服务架构因其灵活性和可扩展性备受青睐。本文通过一个案例分析,展示了如何使用Kubernetes将传统Java Web应用迁移到Kubernetes平台并改造成微服务架构。通过定义Kubernetes服务、创建MySQL的Deployment/RC、改造Web应用以及部署Web应用,最终实现了高可用的微服务架构。Kubernetes不仅提供了服务发现和负载均衡的能力,还通过各种资源管理工具,提升了系统的可扩展性和容错性。
51 3
|
23天前
|
存储 前端开发 测试技术
Android kotlin MVVM 架构简单示例入门
Android kotlin MVVM 架构简单示例入门
28 1
|
28天前
|
消息中间件 关系型数据库 Java
‘分布式事务‘ 圣经:从入门到精通,架构师尼恩最新、最全详解 (50+图文4万字全面总结 )
本文 是 基于尼恩之前写的一篇 分布式事务的文章 升级而来 , 尼恩之前写的 分布式事务的文章, 在全网阅读量 100万次以上 , 被很多培训机构 作为 顶级教程。 此文修改了 老版本的 一个大bug , 大家不要再看老版本啦。
|
15天前
|
监控 API 持续交付
后端开发中的微服务架构:从入门到精通
【10月更文挑战第26天】 在当今的软件开发领域,微服务架构已经成为了众多企业和开发者的首选。本文将深入探讨微服务架构的核心概念、优势以及实施过程中可能遇到的挑战。我们将从基础开始,逐步深入了解如何构建、部署和管理微服务。无论你是初学者还是有经验的开发者,这篇文章都将为你提供有价值的见解和实用的建议。
34 0
|
1月前
|
Unix 应用服务中间件 Linux
Nginx入门--初识Nginx的架构
Nginx入门--初识Nginx的架构
40 0
|
3月前
|
运维 Cloud Native Android开发
云原生之旅:容器化与微服务架构的融合之道安卓应用开发入门指南
本文将深入探讨云原生技术的核心要素——容器化和微服务架构,并揭示它们如何共同推动现代软件的开发与部署。通过实际案例分析,我们将看到这两种技术如何相辅相成,助力企业实现敏捷、可扩展的IT基础设施。文章旨在为读者提供一条清晰的道路,指引如何在云原生时代利用这些技术构建和优化应用。 本文将引导初学者了解安卓应用开发的基本概念和步骤,从安装开发环境到编写一个简单的“Hello World”程序。通过循序渐进的讲解,让读者快速掌握安卓开发的核心技能,为进一步深入学习打下坚实基础。
50 1