整篇文章是在学习了多篇其他作者的文章的一个结合,若有冒犯侵权,还请及时告知,但也是我对于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…