Apache Shiro
Apache Shiro是java的一个安全框架,帮助我们完成:认证,授权,加密,会话管理,与web集合,缓存。
Apache Shiro的首要目标是易于使用和理解。安全有时可能非常复杂,甚至是痛苦的,但并非必须如此。框架应尽可能掩盖复杂性,并提供简洁直观的API,以简化开发人员确保其应用程序安全的工作。
官方文档:http://shiro.apache.org/introduction.html
以下是Apache Shiro可以做的一些事情:
验证用户以验证其身份
为用户执行访问控制,例如:
确定是否为用户分配了某个安全角色
确定是否允许用户执行某些操作
在任何环境中使用Session API,即使没有Web容器或EJB容器也是如此。
在身份验证,访问控制或会话生命周期内对事件做出反应。
聚合用户安全数据的一个或多个数据源,并将其全部显示为单个复合用户“视图”。
启用单点登录(SSO)功能
无需登录即可为用户关联启用“记住我”服务
…
等等 - 全部集成到一个易于使用的内聚API中。
从功能角度看:
Apache Shiro是一个具有许多功能的综合应用程序安全框架
Authentication:身份认证/登录,验证用户是不是拥有相应的身份
Authorization:授权,即权限验证,验证某个已认证的用户是否拥有某个权限,去访问这个数据
SessionManagement:会话管理,即用户登录就是一次会话,在没有退出之前,所有的信息都会保存在会话中,会话不仅仅是web项目的会话,如果是一个普通SE,他也有会话这个概念,是shiro帮助我们维护出来的
Cryptography:加密,保护数据的安全性,不以明文存储
Web Support:web支持,可以是web环境的;
Caching:缓存,比如用户登录后,其用户信息,拥有的角色/权限不必每次去查,这样可以提高效率
Concurrency:shiro支持多线程应用的并发验证,即如在一个线程中开启另一个线程,能把权限自动传播过去
Testing:提供测试支持,测试支持的存在来帮助你编写单元测试和集成测试,并确保你能够如预期的一样安全
Run As: 允许一个用户假装另一个用户的身份去访问
Remember Me:在会话中记住用户的身份,所以他们只需要在强制要求时登录。
shiro的三个主要概念 Subject SecurityManager Realms
subject:访问系统的用户主体可以是用户,程序等,进行认证的都称为主体,
Subject一词是一个安全术语,其基本意思是”当前的操作用户”,它是一个抽象的概念,可以是人,也可以是第三方进程或其他类似事物。
在程序任意位置:Subject subject = SecurityUtils.getSubject();
一旦获得Subject,你就可以立即获得你希望用shiro为当前用户做的90%的事情,如登录·登录·访问会话·执行授权检查等。
SecurityManager
安全管理器,它是shiro功能实现的核心,负责与后边介绍的其他组件(认证器/授权器/缓存控制器)进行交互,实现subject委托的各种功能。
有点类似于springMvc中的DispartcherServlet 前端控制器
Realms
Realms充当了shiro与应用安全数据间的“桥梁”或者“连接器”。
可以把Realms看成DataSource,即安全数据源。
执行认证(登录)和授权(访问控制)时,shiro会从应用配置的Realm中查找相关的对比数据。以确认用户是否合法,操作是否合理
从系统结构上看shiro
- Subject(org.apache.shiro.subject.Subject)
当前与软件进行交互的实体(用户,第三方服务,cron job,等等)的安全特定“视图”。 - SecurityManager(org.apache.shiro.mgt.SecurityManager)
如上所述,SecurityManager 是 Shiro 架构的心脏。它基本上是一个“保护伞”对象,协调其管理的组件以确保它们能够一起顺利的工作。它还管理每个应用程序用户的 Shiro 的视图,因此它知道如何执行每个用户的安全操作。 - Authenticator(org.apache.shiro.authc.Authenticator)
Authenticator 是一个对执行及对用户的身份验证(登录)尝试负责的组件。当一个用户尝试登录时,该逻辑被 Authenticator 执行。Authenticator 知道如何与一个或多个 Realm 协调来存储相关的用户/帐户信息。从这些
Realm 中获得的数据被用来验证用户的身份来保证用户确实是他们所说的他们是谁。 - AuthenticationStrategy(org.apache.shiro.authc.pam.AuthenticationStrategy)
如果不止一个 Realm 被配置,则 AuthenticationStrategy 将会协调这些 Realm 来决定身份认证尝试成功或失败下的条件(例如,如果一个 Realm 成功,而其他的均失败,是否该尝试成功? 是否所有的 Realm 必须成功?或只有第一个成功即可?)。 - Authorizer(org.apache.shiro.authz.Authorizer)
Authorizer 是负责在应用程序中决定用户的访问控制的组件。它是一种最终判定用户是否被允许做某事的机制。与 Authenticator 相似,Authorizer 也知道如何协调多个后台数据源来访问角色恶化权限信息。Authorizer 使用该信息来准确地决定用户是否被允许执行给定的动作。 - SessionManager(org.apache.shiro.session.SessionManager)
SessionManager 知道如何去创建及管理用户 Session 生命周期来为所有环境下的用户提供一个强健的 Session 体验。这在安全框架界是一个独有的特色——Shiro 拥有能够在任何环境下本地化管理用户 Session 的能力, 即使没有可用的 Web/Servlet 或 EJB 容器,它将会使用它内置的企业级会话管理来提供同样的编程体验。
SessionDAO 的存在允许任何数据源能够在持久会话中使用。 - SessionDAO(org.apache.shiro.session.mgt.eis.SessionDAO)
SesssionDAO 代表 SessionManager 执行 Session 持久化(CRUD)操作。这允许任何数据存储被插入到会话管理的基础之中。 - CacheManager(org.apahce.shiro.cache.CacheManager)
CacheManager 创建并管理其他 Shiro 组件使用的 Cache 实例生命周期。因为 Shiro 能够访问许多后台数据源, 由于身份验证,授权和会话管理,缓存在框架中一直是一流的架构功能,用来在同时使用这些数据源时提高 性能。任何现代开源和/或企业的缓存产品能够被插入到 Shiro 来提供一个快速及高效的用户体验。 - Cryptography(org.apache.shiro.crypto.*)
Cryptography 是对企业安全框架的一个很自然的补充。Shiro 的 crypto 包包含量易于使用和理解的cryptographic Ciphers,Hasher(又名 digests)以及不同的编码器实现的代表。所有在这个包中的类都被精心地设计以易于使用和易于理解。任何使用 Java 的本地密码支持的人都知道它可以是一个难以驯服的具有挑战性的动物。Shiro 的 cryptoAPI 简化了复杂的 Java 机制,并使加密对于普通人也易于使用。 - Realms(org.apache.shiro.realm.Realm)
如上所述,Realms 在 Shiro 和你的应用程序的安全数据之间担当“桥梁”或“连接器”。当它实际上与安全相关的数据如用来执行身份验证(登录)及授权(访问控制)的用户帐户交互时,Shiro 从一个或多个为应用程序配置的 Realm 中寻找许多这样的东西。你可以按你的需要配置多个 Realm(通常一个数据源一个 Realm),且 Shiro 将为身份验证和授权对它们进行必要的协调。 - The SecurityManager
因为Shiro 的API 鼓励一个以Subject 为中心的编程方式,大多数应用程序开发人员很少,如果真有,与SecurityManager 直接进行交互(框架开发人员有时候会觉得它很有用)。即便如此,了解如何 SecurityManager 是如何工作的仍然是很重要的,尤其是在为应用程序配置一个 SecurityManager 的时候。
个人总结流程
待续