[翻译-Shiro]-Apache Shiro 框架解析

译者:刘晓日 html

Apache Shiro设计理念是用直观、简单的方式来保证应用的安全。 web

软件设计一般是基于用户故事来实现的,也就是会根据用户如何与系统交互来设计用户接口或者服务API。好比这样一个用户故事,用户登陆后会显示一个查看我的帐户信息的按钮,若是用户未注册,则显示一个注册按钮。 算法

这个用户故事暗含了应用主要应完成的用户需求。即便这里的用户不是人而是第三方系统,在编码时也一样当作与系统交互的“用户”来处理。 数据库

Apache Shiro的这种理念反应在本身的设计中,经过将直观的概念暴露给开发人员,使得Apache Shiro在几乎全部的应用中都易于使用。 apache

概述

Shiro有三个主要的顶级概念:Subject、SecurityManager、Realms。下图描述了这几个概念之间的交互,下面也将一一作介绍。 编程

enter image description here

  • Subject:Subject是当前用户在安全领域的一个缩影。User一般暗含人的意思,而Subject能够是人,能够是第三方服务,守护帐户,corn做业。或者说是任何与系统交互的均可以叫作Subject。 全部的Subject实例都必须绑定到一个SecurityManager,这样当与Subject交互时,其实已经转化成与这个Subject相关联的SecurityManager进行交互。
  • SecurityManager:SecurityManager做为Shiro框架的核心,做为“保护伞”对象的形式存在,它协调其内部安全组件造成一个对象图。当在应用中完成SecurityManager和其内部对象的配置后,SecurityManager就退居二线,开发人员大部分时间都是在使用Subject的API。 随后会深刻讲解SecurityManager,再次强调:当与Subject交互时,其实是隐藏其背后的SecurityManager负责Subject繁重的安全操做。这点在上面的图中也有所体现。
  • Realms:Realms做为Shiro和应用中安全数据源之间的桥梁或者链接器。当须要获取用户帐户进行认证(登录)或受权(访问控制)时,Shiro就会在应用的配置中查找负责这项工做的Realm(一个或多个)来完成获取安全数据。 从这点上讲,Realm实质上就是一个与安全相关的Dao:它封装了数据源连接的详情,并根据Shiro的须要为其提供数据。配置Shiro时,要为认证和受权至少提供一个Reaml。可配置多个Realm,可是至少须要一个。 Shiro内置了能够链接大量安全数据源的Realm,如LDAP、关系数据库(JDBC)、相似INI的文本配置资源以及属性文件等。若是内置的Realm不能知足需求,你还可使用表明自定义数据源的本身的Realm实现。 和其余内部组件同样,SecurityManager管理Realm如何获取与Subject相关的安全和身份信息。

框架详解

下图展示了Shiro框架的核心概念,随后会一一对其做出简短说明: 缓存

enter image description here

Subject(org.apache.shiro.subject.Subject )

安全领域中用户的缩影,能够是人,第三方服务,corn做业等,负责与系统交互。 安全

SecurityManager(org.apache.shiro.mgt.SecurityManager)

就像上文提到的,SecurityManager是Shiro框架的核心。它充当“保护伞”对象的做用,内部协调各个组件,以确保它们顺利开展工做,并且还负责管理Subject,这样它也就获悉了每一个Subject怎么执行安全操做了。 session

Authenticator(org.apache.shiro.authc.Authenticator)

Authenticator负责发出和处理用户的认证请求。当用户登陆时,Authenticator负责处理登陆逻辑。Authenticator可经过一个或多个Realm获取用户信息,这些信息用来验证当前用户身份。 框架

验证策略(org.apache.shiro.authc.pam.AuthenticationStrategy)

若是配置了多个Realm,就须要AuthenticationStrategy协调Realms来决定在什么样的状况下一个认证的是成功的或失败的。(好比,一个realm认证成功,其余失败,那认证是否经过呢?)

Authorizer (org.apache.shiro.authz.Authorizer)

Authorizer负责应用中用户的访问控制。它是决定用户是否能够在应用中进行某件事的机制。和Authenticator同样,Authorizer能够经过Realm获取角色和权限信息,这样Authorizer就能够确切的知道是否容许用户完成其预期的操做。

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

SessionManager用来建立和管理用户Session的生命周期,在任何应用环境下,均可觉得用户提供稳定的Session。Shiro能够在任何应用环境下管理用户Session,不须要依附于WEB/Servlet或者EJB容器,这个特性在安全框架领域是惟一的。好比在Servlet容器环境下,默认使用容器自带的Session,若是像在独立应用或非web容器环境下,根本就没有session的存在,那么Shiro使用其内置的企业会话管理器提供一样的编程体验。SessionDao的存在使得任何数据源均可以用来持久session。

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

SessionDao为SecurityManager提供会话持久(CRUD)功能,这样就可以让任何数据源参与到会话管理基础设施中来。

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

CacheManager为Shiro的其余组件提供建立缓存实例和管理缓存生命周期的功能。由于Shiro的认证、受权、会话管理支持多种数据源,因此访问数据源时,使用缓存来提升访问效率是上乘的选择。当下主流开源或企业级缓存框架均可以继承到Shiro中,来获取更快更高效的用户体验。

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

Cryptography是企业级安全框架基本特征。Shiro的加密包中,包含了易于使用和理解的密码加密,哈希和其余不一样加密算法的实现。加密包下面的全部类都是通过精心设计的,来达到易于使用和理解的目的,以前使用过Java自带的加密API的会了解到,它是很难使用的。Shiro的加密API简化了Java复杂的加密机制,并且很容易使用。

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

上文中也提到过,Realms做为Shiro和应用中安全数据源之间的桥梁或者链接器。当须要获取用户帐户进行认证(登录)或受权(访问控制)时,Shiro就会在应用的配置中查找负责这项工做的Realm(一个或多个)来完成获取安全数据。能够配置多个Realm,大多状况是一个数据源一个Realm,Shiro会负责为认证和受权协调多个Realm一同工做。

SecurityManager简介

因为Shiro采用以Subject为中心的编程方式,因此几乎不多有机会直接与SecurityManager打交道(但与SecurityManager打交道对框架开发人员很重要),尽管如此,了解SecurityManager的做用也仍是很重要的,为应用配置SecurityManager的时候尤其重要。

设计

如上文所述,SecurityManager负责处理应用中的安全操做,管理全部应用用户的状态。Shiro中SecurityManager的默认实现包括以下:

  • Authentication
  • Authorization
  • Session Management
  • Cache Management
  • Realm coordination
  • Event propagation
  • "Remember Me" Services
  • Subject creation
  • Logout

等等。

可是让一个组件完成这么多功能,并且作到灵活可定制是很是困难的。为了简化配置和使配置更灵活,Shiro的各类实现采用了高度的模块化。模块化以后,SecurityManager实际上就做为一个轻量级“容器”,几乎全部的功能都委托给内部或包装组件实现。这种包装的设计方法在详细的框架图中也有所体现。

这些组件才是真正的功能实现者,SecurityManager知道如何以及什么时候协调这些组件作正确的事情便可。

原文连接:http://shiro.apache.org/architecture.html

相关文章
相关标签/搜索