前言
在做项目的过程中发现自己缺少使用安全框架,但是自己有没有学过,自己查阅资料和看很多教程,总结一套Shiro 的教程。
Shiro 中常用单词
- subject [ˈsʌbdʒekt] : 主体
- principal [ˈprɪnsəpəl] : 身份信息
- credential [krɪˈdɛnʃəl] : 凭证信息
- spring security [səˈkjʊrəti] : spring安全框架
- Authentication [ɔ:ˌθentɪ’keɪʃn] : 身份认证/登录
- Authorization [ˌɔ:θərəˈzeɪʃn] : 授权
- Cryptography [krɪpˈɑ:grəfi] : 加密
- Concurrency [kən’kʌrənsɪ] : 并发
- realms [relm] :领域
Shiro
Shiro 简介
Apache Shiro是Java的一个安全框架。目前,使用的人越来越多,因为它相当简单,对比Spring Security,功能就没那么强大,但是在实际工作时可能并不需要那么复杂的东西,所以使用小而简单的Shiro就足够了。这里我们就不纠结它俩哪个好哪个坏,能更简单的解决项目问题就好了。
Shiro 官网 http://shiro.apache.org
什么是 Apache Shiro
Apache Shiro(发音为“shee-roh”)是一个强大易用的 Java 安全框架,提供了认证、授权、加密和会话管理功能,可为任何应用提供安全保障 - 从命令行应用、移动应用到大型网络及企业应用。
Shiro可以做什么事情?
Authentication(认证), Authorization(授权), Session Management(会话管理), Cryptography(加密)被 Shiro 框架的开发团队称之为应用安全的四大基石。那么就让我们来看看它们吧:
-
Authentication(认证):身份认证/登录,验证用户是不是拥有相应的身份;
-
Authorization(授权): 即权限验证,验证某个已认证的用户是否拥有某个权限;即判断用户是否能做事情,常见的如:验证某个用户是否拥有某个角色。或者细粒度的验证某个用户对某个资源是否具有某个权限;
-
Session Manager(会话管理):即用户登录后就是一次会话,在没有退出之前,它的所有信息都在会话中;会话可以是普通JavaSE环境的,也可以是Web环境的;
-
Cryptography(加密):保护数据的安全性,如密码加密存储到数据库,而不是明文存储;
还有其他的功能来支持和加强这些不同应用环境下安全领域的关注点。特别是对以下的功能支持:
- Web Support:Web支持,可以非常容易的集成到Web环境;
- Caching:缓存,比如用户登录后,其用户信息、拥有的角色/权限不必每次去查,这样可以提高效率;
- Concurrency:shiro支持多线程应用的并发验证,即如在一个线程中开启另一个线程,能把权限自动传播过去;
- Testing:提供测试支持;
- Run As:允许一个用户假装为另一个用户(如果他们允许)的身份进行访问;
- Remember Me:记住我,这个是非常常见的功能,即一次登录后,下次再来的话不用登录了。
Shiro架构有三个主要概念 (外部):Subject,SecurityManager 和 Realms
既然已经描述了 Shiro 的好处,那就让我们看看它的 API,好让你能够有个感性认识。Shiro 架构有三个主要概念 - Subject,SecurityManager 和 Realms。
-
Subject:当前用户,Subject 可以是一个人,但也可以是第三方服务、守护进程帐户、时钟守护任务或者其它–当前和软件交互的任何事件。
-
SecurityManager :管理所有Subject,SecurityManager 是 Shiro 架构的核心,配合内部安全组件共同组成安全伞。
-
Realms:用于进行权限信息的验证,我们自己实现。Realm 本质上是一个特定的安全 DAO:它封装与数据源连接的细节,得到Shiro 所需的相关的数据。在配置 Shiro 的时候,你必须指定至少一个Realm 来实现认证(authentication)和/或授权(authorization)。
Shior 详细的架构(内部)
-
Subject(org.apache.shiro.subject.Subject)
当前与软件交互的实体(用户,第三方服务,cron作业等)的特定于安全性的“视图”。 -
SecurityManager(org.apache.shiro.mgt.SecurityManager)
如上所述,这SecurityManager是Shiro建筑的核心。它主要是一个“伞形”对象,协调其托管组件,以确保它们一起平稳运行。它还管理Shiro对每个应用程序用户的视图,因此它知道如何对每个用户执行安全操作。 -
认证器(org.apache.shiro.authc.Authenticator)
的Authenticator是,负责执行和反应以验证(注册)用户企图的组件。当用户尝试登录时,该逻辑由执行Authenticator。该Authenticator知道如何与一个或多个协调Realms存储有关用户/帐户信息。从这些数据中获取的数据Realms用于验证用户的身份,以保证用户确实是他们所说的人。 -
身份验证策略(org.apache.shiro.authc.pam.AuthenticationStrategy)
如果Realm配置了多个,AuthenticationStrategy则将协调领域以确定身份验证尝试成功或失败的条件(例如,如果一个领域成功但其他领域失败尝试是否成功?必须所有领域成功吗?只有第一个?)。 -
认证器(org.apache.shiro.authz.Authorizer)
的Authorizer是部件负责确定用户在该应用程序的访问控制。这种机制最终会说明是否允许用户做某事。与此类似Authenticator,它Authorizer也知道如何协调多个后端数据源以访问角色和权限信息。在Authorizer使用该信息来确定到底是否允许用户执行特定的操作。 -
SessionManager(org.apache.shiro.session.mgt.SessionManager)
将SessionManager知道如何创建和管理用户Session生命周期,提供在所有环境中的用户强大的会话体验。这是安全框架领域的一项独特功能 - 即使没有可用的Web / Servlet或EJB容器,Shiro也能够在任何环境中本地管理用户Sessions。默认情况下,Shiro将使用现有的会话机制(例如Servlet容器),但如果没有,例如在独立应用程序或非Web环境中,它将使用其内置的企业会话管理提供相同的编程经验。的SessionDAO存在允许任何数据源被用来坚持的会议。 -
SessionDAO(org.apache.shiro.session.mgt.eis.SessionDAO)
的SessionDAO执行Session代表的持久性(CRUD)操作SessionManager。这允许将任何数据存储插入会话管理基础结构。 -
CacheManager的(org.apache.shiro.cache.CacheManager)
的CacheManager创建和管理Cache其他四郎组件使用实例的生命周期。由于Shiro可以访问许多后端数据源以进行身份验证,授权和会话管理,因此缓存一直是框架中的一流架构功能,可在使用这些数据源时提高性能。任何现代开源和/或企业缓存产品都可以插入Shiro,以提供快速有效的用户体验。 -
密码学(org.apache.shiro.crypto。*)
密码学是企业安全框架的自然补充。Shiro的crypto软件包包含易于使用和理解的密码密码,哈希(aka摘要)和不同编解码器实现的表示。该软件包中的所有类都经过精心设计,易于使用且易于理解。使用Java本机加密支持的任何人都知道它可能是一个具有挑战性的驯服动物。Shiro的加密API简化了复杂的Java机制,使密码学易于用于普通的凡人。 -
领域(org.apache.shiro.realm.Realm)
如上所述,Realms充当Shiro与应用程序安全数据之间的“桥接”或“连接器”。当实际与安全相关数据(如用户帐户)进行交互以执行身份验证(登录)和授权(访问控制)时,Shiro会从为应用程序配置的一个或多个领域中查找许多这些内容。您可以根据Realms需要配置任意数量(通常每个数据源一个),Shiro将根据需要进行身份验证和授权协调。
什么是权限管理
- 基本上涉及到用户参与的系统都要进行权限管理,权限管理属于系统安全的范畴,权限管理实现对用户访问系统的控制,按照安全规则或者安全策略控制用户可以访问而且只能访问自己被授权的资源。权限管理包括用户身份认证和授权两部分,简称认证授权。
- 对于需要访问控制的资源用户首先经过身份认证,认证通过后用户具有该资源的访问权限方可访问。
- 权限管理包括 用户身份认证和授权两部分,简称认证授权。
总结
这篇文章主要讲解Shiro的基本概念,下一章我们讲解Shiro的认证。最后再给大家推荐一篇翻译的文章。