shiro(1)- 初识Shiro

shiro安全控制目录

1. 什么是 Apache Shiro

Apache Shiro(日语“堡垒”)是一个强大易用的Java安全框架,提供了认证、授权、加密和会话管理的功能。

Shiro为应用安全四要素提供了以下API:

  1. 认知:用户身份识别,常被称为用户“登录”;
  2. 授权:访问控制;
  3. 密码加密:保护或隐藏数据防止被偷窥;
  4. 会话管理:用户相关事件敏感的状态;

2. Shiro的核心概念

Shiro架构有三个主要概念——Subject、SecurityManager和Realms。

2.1 Subject

Subject一词是一个安全术语,其基本意思为“当前操作的用户”。称之为“用户”并不确切。在安全领域,术语Subject可以是人、也可以是第三方进程、后台账户或其类似事物。它仅仅意味着“当前跟软件交互的东西”。在代码的任何地方,都可以轻易的获取Shiro Subject。

import org.apache.shiro.subject.Subject;
import org.apache.shiro.SecurityUtils;
...
Subject currentUser = SecurityUtils.getSubject();

一旦获取Subject,你就可以立即获取你希望用Shiro为当前用户做的90%的事情,如登录、登出、访问会话、执行权限检查。同时在代码的任何地方都能轻松地访问Subject,允许在任何需要的地方进行安全控制。

Subject实例绑定在SecurityManager上,当你和Subject交互时,SecurityManager把交互转化为subject领域的交互。

2.2 SecurityManager

Subject代表了当前用户的安全操作,SecurityManager则管理所有用户的安全操作。它是Shiro的核心,充当“保护伞”,引用多个内部嵌套安全组件,它们形成对象图。但是一旦SecurityManager及其内部对象图配置好,它就会退居幕后,而应用开发人员几乎会把它们所有的时间都花在Subject API的调用上。

Web应用通常可以在Web.xml中指定一个Shiro Servlet Filter,这会创建SecurityManager应用。

一个应用几乎总是只有一个SecurityManager实例,他实际上是应用的Singleton。跟Shiro其他组件一样,SecurityManager缺省实现是POJO,故可以是Spring XML、YAML、.properties和.ini文件进行配置。

2.3 Realms

Realm充当了Shiro与应用安全数据间的“桥梁”或者“连接器”,也就是说,当我们与应用的安全数据(例如查询订单详情)进行交互。其本身需要执行认证(登录)和授权(访问控制)。Shiro会从程序配置好的一个或多个Realm查询数据。

Realm实际上是一个安全相关的DAO:它封装了数据源的连接细节,并在需要时将相关数据提供给Shiro。当配置Shiro时,必须指定一个Realm,用于认证和授权。

而Shiro的SecurityManager管理如何使用Realm来获取Subject实例安全和身份信息。

Shiro核心概念.png

3. Shiro的架构

shiro的架构图.png
  • Subject
    应用代码直接交互的对象就是Subject,也就是说Shiro的对外API的核心便是Subject,但是所有的Subject都绑定到SecurityManager,与Subject交互的都会委托给SecurityManager,可以理解为Subject是一个门面,而实际的执行者便是SecurityManager。

  • SecurityManager
    SecurityManager是Shiro架构的核心,来协调它所管理的其他组件,确保他们之间的配合,同时管理Shiro视角的每一个Subject(用户),他知道如何进行每个用户的安全操作。(实际上,你可以理解为它使用了模板方法模式,保证了总体算法结构的同时,预留出钩子方法,供应用人员实现)。

  • Authenticator
    Authenticator组件负责执行用户的登录操作,当用户尝试登录时,Authenticator会执行登录逻辑。Authenticator知道怎么和存储用户账户信息的一个或多个Realm协调工作。

  • Authentication Strategy
    如果配置了多个Realm,Authentication Strategy将会协调Realm来确定条件判断认证是否成功或者失败(例如,如果一个Realm成功,其他失败,那么算登录成功码?必须所有的Realm都成功,还是只是第一个?)

  • Authorizer
    Authorizer组件负责确保用户的访问控制。

  • SessionManager
    SessionManager负责创建和管理用户的Session生命周期,在任何环境下都可以提供用户健壮的session体验,Shiro在任何环境,甚至没有Web/Servlet或者EJB环境中,都具有原生的管理用户的session能力。默认情况下,Shiro会尽可能使用已经存在的session机制(比如Servlet Container),但是如果没有存在的session机制,它会使用内置的企业session管理来提供同样的session体验。亦可以实现SessionDAO允许任何数据源持久化session。

  • SessionDAO
    SessionManager来操作SessionDAO来执行session持久化的接口。允许任何数据源持久化Session。

  • CacheManager
    CacheManager创建和管理其他Shiro组件使用的缓存实例生命周期,因为Shiro认证,授权,Session管理中可以访问多种后端数据源,而使用缓存便可以提高这些数据的访问性能。

  • Cryptography
    Cryptography包含了易于使用和理解的密码工具,Hash(也称为摘要)和多种多样的编程实现。

  • Realm
    Realms在Shiro和应用间扮演着桥梁的作用,当发生一次真实的安全数据交互,比如用户登录和鉴权,Shiro会从程序配置好的一个或多个Realm中查询很多次数据。可以配置你需要的任意数量的Realm,Shiro在授权和认证时都会协调使用它们。

4. SecurityManager设计理念

正如上面所说,程序的SecurityManager执行安全操作,并且管理所有的系统用户状态。Shiro在默认实现中,包含如下操作:

  • 认证
  • 授权
  • session管理
  • cache管理
  • Realm管理
  • 事件传播
  • Remeber Me服务
  • Subject创建
  • 登出

但是一个组件尝试管理这么多功能,并且还要这些东西可扩展可定制化,把这些东西如果放到一个单独的实现类中,这是非常难的。

为了简化配置并且使得配置可插拔,可扩展,Shiro的实现全部设计为高度模块化。实际上所谓的模块化,其实就是SecurityManager的实现并没有做太多的事情,而几乎将全部的行为授权给了内部/包装好的组件。而真正在组件执行逻辑时,SecurityManager知道如何去正确的协调组件。

推荐阅读

让 Apache Shiro 保护你的应用

Apache Shiro架构

你可能感兴趣的:(shiro(1)- 初识Shiro)