Shiro的初步认识

459 阅读9分钟

整篇文章是在学习了多篇其他作者的文章的一个结合,若有冒犯侵权,还请及时告知,但也是我对于Shiro的心得体会,如果有理解错误的地方也还请大家指点, 那么下面我们就步入正文

Shiro

Shiro是什么

官方给出的定义:Apache Shiro是一个功能强大且灵活的开源安全框架,可以干净地处理身份验证,授权,企业会话管理和加密。Apache Shiro的首要目标是易于使用和理解。Security 有时可能非常复杂,甚至会很痛苦,但这不是必须的。框架应尽可能掩盖复杂性,并公开简洁直观的API,以简化开发人员确保其应用程序安全的工作。

可以使用Apache Shiro进行以下操作:

  • 验证用户身份以验证其身份

  • 对用户执行访问控制,例如:

    • 确定是否为用户分配了特定的安全角色
    • 确定是否允许用户做某事
  • 即使在没有Web或EJB容器的情况下,也可以在任何环境中使用Session API。

  • 在身份验证,访问控制或会话的生存期内对事件做出反应。

  • 汇总1个或更多用户安全数据的数据源,并将其全部显示为单个复合用户“视图”。

  • 启用单点登录(SSO)功能

  • 启用“记住我”服务以进行用户关联,而无需登录

等等-所有这些都集成到一个易于使用的统一API中。 Shiro尝试在所有应用程序环境中实现这些目标-从最简单的命令行应用程序到最大的企业应用程序,而不必强加对其他第三方框架,容器或应用程序服务器的依赖。当然,该项目旨在尽可能地集成到这些环境中,但是可以在任何环境中直接使用它。

Shiro的架构

  • Subject:在Subject本质上是当前正在执行的用户的安全特定“视图”。“用户”一词通常表示一个人,而 Subject可以是一个人,但它也可以表示第三方服务,守护程序帐户或类似的东西-基本上是当前与该软件交互的任何东西。

    Subject实例都绑定到(并要求)SecurityManager。当您与互动时Subject,这些互动会转化为与主题相关的互动SecurityManager。

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

    当与Subject进行交互时,SecurityManager对于任何Subject安全操作而言,是幕后工作。这反映在上面的基本流程图中

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

    从这个意义上说,领域本质上是特定于安全性的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是负责执行用户的身份验证(登录)并对其作出反应的组件。当用户尝试登录时,该逻辑由Authenticator执行。Authenticator知道如何与一个或多个存储相关用户/帐户信息的领域进行协调。从这些Realms获得的数据用于验证用户的身份,以确保用户确实是他们所说的真实身份。

    • Authorizer(org.apache.shiro.authc.pam.AuthenticationStrategy)

    如果Realm配置了多个身份验证策略,则AuthenticationStrategy它将协调Realm以确定尝试成功或失败的条件(三种):

      AtLeastOneSuccessfulStrategy(默认)
      只要一个或者多个Realm认证通过,则整体身份认证就会视为成功。
      
      FirstSuccessfulStrategy
      只有第一个验证通过,才会视为整体认证通过。其他的会被忽略。
      
      AllSuccessfulStrategy
      只有所有的Realm认证成功,才会被视为认证通过。
    
  • Authorizer(org.apache.shiro.authz.Authorizer)

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

  • SessionManager(org.apache.shiro.session.mgt.SessionManager)

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

    • SessionDAO(org.apache.shiro.session.mgt.eis.SessionDAO)

      SessionDAO代表SessionManager执行会话持久性(CRUD)操作。 这允许将任何数据存储插入会话管理基础结构。

  • CacheManager的(org.apache.shiro.cache.CacheManager)

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

  • Cryptography (org.apache.shiro.crypto。*)

    公开密钥密码体制是现代密码学的最重要的发明和进展。一般理解密码学(Cryptography)就是保护信息传递的机密性。Shiro的加密软件包包含易于使用和理解的加密密码的表示, Hashes (aka digests)和不同编解码器实现的表示形式。该软件包中的所有类都经过精心设计,以使其易于使用和易于理解。使用Java的本机加密技术支持的大家都知道,使用它可能是具有挑战性的难度。 Shiro的加密API简化了复杂的Java机制,并使加密技术易于为我们使用。

  • Realms (org.apache.shiro.realm.Realm)

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

Shiro内置的过滤器

FilterName Class
anon org.apache.shiro.web.filter.authc.AnonymousFilter
authc org.apache.shiro.web.filter.authc.FormAuthenticationFilter
authcBasic org.apache.shiro.web.filter.authc.BasicHttpAuthenticationFilter
perms org.apache.shiro.web.filter.authz.PermissionsAuthorizationFilter
port org.apache.shiro.web.filter.authz.PortFilter
rest org.apache.shiro.web.filter.authz.HttpMethodPermissionFilter
roles org.apache.shiro.web.filter.authz.RolesAuthorizationFilter
ssl org.apache.shiro.web.filter.authz.SslFilter
user org.apache.shiro.web.filter.authc.UserFilter
logout org.apache.shiro.web.filter.authc.LogoutFilter

再细说一下:

FilterName 例子 解释
anon /admins/**=anon 没有参数,表示可以匿名使用
authc /admins/user/**=authc 表示需要认证(登录)才能使用,没有参数
roles /admins/user/**=roles[admin] 参数可以写多个,多个时必须加上引号,并且参数之间用逗号分割,当有多个参数时,例如admins/user/**=roles["admin,guest"], 每个参数通过才算通过,相当于hasAllRoles()方法
perms /admins/user/**=perms[user:add:*] 参数可以写多个,多个时必须加上引号,并且参数之间用逗号分割,例如/admins/user/**=perms["user:add:,user:modify:"],当有多个参数时必须每个参数都通过才通过,想当于isPermitedAll()方法
rest /admins/user/**=rest[user] #根据请求的方法,相当于/admins/user/**=perms[user:method] ,其中method为 post,get,delete等
port /admins/user/**=port[8081] 当请求的url的端口不是8081是跳转到schemal://serverName:8081?queryString,其中schmal是协议http或https等,serverName是你访问的host,8081是url配置里port的端口,queryString是你访问的url里的?后面的参数
authcBasic /admins/user/**=authcBasic 没有参数表示httpBasic认证
ssl /admins/user/**=ssl 没有参数,表示安全的url请求,协议为https
user /admins/user/**=user 没有参数表示必须存在用户,当登入操作时不做检查
logout /logout=logout 表示注销,可以当作固定配置

这里包括Shiro的使用(代码)和一些其他内容,就不再重复造轮子了(实际上是最近要学习的太多了[捂脸]):

Shiro配置文件ini详解: blog.csdn.net/u011781521/…

单点登录与权限管理本质(权限管理介绍): juejin.cn/post/684490…

关于Shiro框架的学习: juejin.cn/post/684490…

Shiro入门这篇就够了【Shiro的基础知识、回顾URL拦截】: juejin.cn/post/684490…

SpringBoot整合Shiro实现动态权限加载更新+Session共享+单点登录: juejin.cn/post/684490…