Shiro 安全框架1—简介、核心组件与架构

Shiro 安全框架1—简介、核心组件与架构

一、简介

1.1 概述

Apache Shiro(发音为“shee-roh”,日语“堡垒(Castle)”的意思)是一个强大易用的 Java 安全框架,可以干净地处理身份验证,授权,企业会话管理,单点登录和加密服务,可为任何应用提供安全保障 - 从命令行应用、移动应用到大型网络及企业应用。

1.2 特点

Apache Shiro的首要目标是易于使用和理解。安全有时可能非常复杂,甚至会很痛苦,但这不是必须的。框架应尽可能掩盖复杂性,并公开干净直观的API,以简化开发人员确保其应用程序安全的工作。

  • 易于使用 - 易用性是这个项目的最终目标。应用安全有可能会非常让人糊涂,令人沮丧,并被认为是“必要之恶”【译注:比喻应用安全方面的编程。】。若是能让它简化到新手都能很快上手,那它将不再是一种痛苦了。
  • 广泛性 - 没有其他安全框架可以达到 Apache Shiro 宣称的广度,它可以为你的安全需求提供“一站式”服务。
  • 灵活性 - Apache Shiro 可以工作在任何应用环境中。虽然它工作在 Web、EJB 和 IoC 环境中,但它并不依赖这些环境。Shiro 既不强加任何规范,也无需过多依赖。
  • Web 能力 - Apache Shiro 对 Web 应用的支持很神奇,允许你基于应用 URL 和 Web 协议(如 REST)创建灵活的安全策略,同时还提供了一套控制页面输出的 JSP 标签库。
  • 可插拔 - Shiro 干净的 API 和设计模式使它可以方便地与许多的其他框架和应用进行集成。你将看到 Shiro 可以与诸如 Spring、Grails、Wicket、Tapestry、Mule、Apache Camel、Vaadin 这类第三方框架无缝集成。
  • 支持 - Apache Shiro 是 Apache 软件基金会成员,这是一个公认为了社区利益最大化而行动的组织。项目开发和用户组都有随时愿意提供帮助的友善成员。像 Katasoft 这类商业公司,还可以给你提供需要的专业支持和服务。

1.3 主要功能

  • 验证用户身份以验证其身份
  • 对用户执行访问控制,例如:
    • 确定是否为用户分配了特定的安全角色确定是否允许用户执行某项操作
    • 即使在没有Web或EJB容器的情况下,也可以在任何环境中使用Session API。
  • 在身份验证,访问控制或会话的生存期内对事件做出反应。
  • 汇总1个或更多用户安全数据的数据源,并将其全部显示为单个复合用户“视图”。
  • 启用单点登录(SSO)功能
  • 启用“记住我”服务以进行用户关联,而无需登录
  • 以及更多-所有功能都集成到了易于使用的内聚性API中。

二、Shiro核心组件

shiro 组件
Shiro以Shiro开发团队所谓的“应用程序安全性的四个基石”为目标-身份验证,授权,会话管理和密码术:

  • Authentication,身份验证:有时称为“登录”,这是证明用户就是他们所说的身份的行为。
  • Authorization,授权:访问控制的过程,即确定“谁”有权访问“什么”。
  • Session Management,会话管理:即使在非Web或EJB应用程序中,也可以管理用户特定的会话。
  • Cryptography密码术:使用密码算法保持数据安全,同时仍然易于使用。

在不同的应用程序环境中,还具有其他功能来支持和加强这些问题,尤其是:

  • Web 支持:Shiro的网络支持API可帮助轻松保护网络应用程序。
  • Caching,缓存:缓存是Apache Shiro API的一线公民,可确保安全操作保持快速有效。
  • Concurrency,并发性:Apache Shiro的并发功能支持多线程应用程序。
  • Testing,测试:测试支持可帮助您编写单元测试和集成测试,并确保您的代码将按预期进行保护。
  • “Run As,运行方式”:一种功能,允许用户采用其他用户的身份(如果允许),有时在管理方案中很有用。
  • “Remember Me记住我”:记住用户在各个会话中的身份,因此他们只需要在必要时登录即可。

注意:shiro不会维护用户与权限,需要程序员自己维护并通过相应的接口注入给shiro。

三、Shiro架构

shiro架构图
在最高概念级别上,Shiro的体系结构具有3个主要概念:Subject(主题),SecurityManager(安全管理器)和Realms(领域)。

  • **Subject **: **Subject **本质上是当前执行用户的特定于安全性的“视图”。 “用户”一词通常表示一个人,而 **Subject **可以是一个人,但它也可以表示第三方服务,守护程序帐户,cron作业或任何类似的东西-基本上是当前与该软件交互的任何东西。 **Subject **实例都绑定到(并需要)SecurityManager。 与 **Subject **进行交互时,这些交互会转换为与SecurityManager特定的 **Subject **交互。

  • SecurityManagerSecurityManager是Shiro体系结构的核心,并充当一种“伞”对象,该对象协调其内部安全组件,这些安全组件共同构成一个对象图。 但是,一旦为应用程序配置了SecurityManager及其内部对象图,通常就不理会它,并且应用程序开发人员几乎将所有时间都花在**Subject **的API上。

    重要的是要认识到,当您与Subject进行交互时,实际上是在幕后的SecurityManager会对任何 Subject安全操作进行所有繁重的工作。

  • RealmsRealms充当Shiro与应用程序的安全数据之间的“桥梁”或“连接器”。 当真正需要与安全性相关的数据(如用户帐户)进行交互以执行身份验证authentication (登录)和授权authorization (访问控制)时,Shiro会从为应用程序配置的一个或多个Realms中查找许多此类内容。

    从这个意义上说,领域本质上是特定于安全性的DAO:它封装了数据源的连接详细信息,并根据需要使关联数据可供Shiro使用。 在配置Shiro时,您必须至少指定一个领域用于身份验证和/或授权。 SecurityManager可以配置有多个领域,但至少需要一个。

    Shiro提供了开箱即用的领域,可以连接到许多安全数据源,例如LDAP,关系数据库(JDBC),文本配置源(例如INI和属性文件)等。 如果默认的Realms不能满足您的需求,那么您可以插入自己的Realm实现以表示自定义数据源。

    像其他内部组件一样,Shiro SecurityManager管理领域如何用于获取要表示为Subject实例的安全性和身份数据。

四、详细架构

详细架构图

  • Subject (org.apache.shiro.subject.Subject)
    当前与软件进行交互的实体(用户,第三方服务,计划任务等)的特定于安全性的“视图”。
  • SecurityManager (org.apache.shiro.mgt.SecurityManager)
    SecurityManager是Shiro架构的核心。 它主要是一个“伞”对象,用于协调其托管组件以确保它们能够顺利协作。 它还管理Shiro对每个应用程序用户的视图,因此它知道如何对每个用户执行安全操作。
  • Authenticator (org.apache.shiro.authc.Authenticator)
    Authenticator是负责执行用户的身份验证(登录)并对其作出反应的组件。 当用户尝试登录时,该逻辑由身份验证器执行。 身份验证器知道如何与存储相关用户/帐户信息的一个或多个领域协调。 从这些领域获得的数据用于验证用户的身份,以确保用户确实是他们所说的真实身份。
    • Authentication Strategy (org.apache.shiro.authc.pam.AuthenticationStrategy)
      如果配置了多个Realm ,则AuthenticationStrategy会协调Realm 以确定身份验证尝试成功或失败的条件(例如,如果一个Realm 成功而其他Realm 失败,则尝试成功吗?必须所有Realm 都成功吗? 第一?)。
  • Authorizer (org.apache.shiro.authz.Authorizer)
    Authorizer 授权者是负责确定应用程序中用户访问控制的组件。 它是最终表明是否允许用户做某事的机制。 与身份验证器一样,授权者也知道如何与多个后端数据源进行协调以访问角色和权限信息。 授权者使用此信息来确定是否允许用户执行给定的操作。
  • SessionManager (org.apache.shiro.session.mgt.SessionManager)
    SessionManager知道如何创建和管理用户会话生命周期,以便为所有环境中的用户提供可靠的会话体验。 这是安全框架领域中的一项独特功能-Shiro能够在任何环境中本地管理用户会话,即使没有Web / Servlet或EJB容器也可以。 默认情况下,Shiro将使用现有的会话机制(例如Servlet容器)(如果可用),但是如果没有这种机制(例如在独立应用程序或非Web环境中),它将使用其内置的企业会话管理来 提供相同的编程经验。 SessionDAO的存在是为了允许使用任何数据源来保留会话。
  • CacheManager (org.apache.shiro.cache.CacheManager)
    CacheManager创建和管理其他Shiro组件使用的Cache实例生命周期。 因为Shiro可以访问许多后端数据源以进行身份验证,授权和会话管理,所以缓存一直是框架中的一流架构功能,可以在使用这些数据源时提高性能。 可以将任何现代的开源和/或企业缓存产品插入Shiro,以提供快速有效的用户体验。
  • Cryptography (org.apache.shiro.crypto.*)
    密码术是企业安全框架的自然补充。 Shiro的加密软件包包含易于使用和理解的加密密码,哈希(又名摘要)和不同编解码器实现的表示形式。 该软件包中的所有类都经过精心设计,以使其易于使用和理解。 使用Java的本机加密技术支持的任何人都知道,驯服它可能是具有挑战性的动物。 Shiro的加密API简化了复杂的Java机制,并使加密技术易于为普通凡人使用。
  • Realms (org.apache.shiro.realm.Realm)
    领域充当Shiro与应用程序的安全数据之间的“桥梁”或“连接器”。 当真正需要与安全性相关的数据(如用户帐户)进行交互以执行身份验证(登录)和授权(访问控制)时,Shiro会从为应用程序配置的一个或多个Realms中查找许多此类内容。 您可以根据需要配置任意多个领域(通常每个数据源一个),并且Shiro将根据需要与它们进行协调,以进行身份验证和授权。

五、参考

https://shiro.apache.org

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章