译者:刘晓日 html
Apache Shiro设计理念是用直观、简单的方式来保证应用的安全。 web
软件设计一般是基于用户故事来实现的,也就是会根据用户如何与系统交互来设计用户接口或者服务API。好比这样一个用户故事,用户登陆后会显示一个查看我的帐户信息的按钮,若是用户未注册,则显示一个注册按钮。 算法
这个用户故事暗含了应用主要应完成的用户需求。即便这里的用户不是人而是第三方系统,在编码时也一样当作与系统交互的“用户”来处理。 数据库
Apache Shiro的这种理念反应在本身的设计中,经过将直观的概念暴露给开发人员,使得Apache Shiro在几乎全部的应用中都易于使用。 apache
Shiro有三个主要的顶级概念:Subject、SecurityManager、Realms。下图描述了这几个概念之间的交互,下面也将一一作介绍。 编程
下图展示了Shiro框架的核心概念,随后会一一对其做出简短说明: 缓存
安全领域中用户的缩影,能够是人,第三方服务,corn做业等,负责与系统交互。 安全
就像上文提到的,SecurityManager是Shiro框架的核心。它充当“保护伞”对象的做用,内部协调各个组件,以确保它们顺利开展工做,并且还负责管理Subject,这样它也就获悉了每一个Subject怎么执行安全操做了。 session
Authenticator负责发出和处理用户的认证请求。当用户登陆时,Authenticator负责处理登陆逻辑。Authenticator可经过一个或多个Realm获取用户信息,这些信息用来验证当前用户身份。 框架
若是配置了多个Realm,就须要AuthenticationStrategy协调Realms来决定在什么样的状况下一个认证的是成功的或失败的。(好比,一个realm认证成功,其余失败,那认证是否经过呢?)
Authorizer负责应用中用户的访问控制。它是决定用户是否能够在应用中进行某件事的机制。和Authenticator同样,Authorizer能够经过Realm获取角色和权限信息,这样Authorizer就能够确切的知道是否容许用户完成其预期的操做。
SessionManager用来建立和管理用户Session的生命周期,在任何应用环境下,均可觉得用户提供稳定的Session。Shiro能够在任何应用环境下管理用户Session,不须要依附于WEB/Servlet或者EJB容器,这个特性在安全框架领域是惟一的。好比在Servlet容器环境下,默认使用容器自带的Session,若是像在独立应用或非web容器环境下,根本就没有session的存在,那么Shiro使用其内置的企业会话管理器提供一样的编程体验。SessionDao的存在使得任何数据源均可以用来持久session。
SessionDao为SecurityManager提供会话持久(CRUD)功能,这样就可以让任何数据源参与到会话管理基础设施中来。
CacheManager为Shiro的其余组件提供建立缓存实例和管理缓存生命周期的功能。由于Shiro的认证、受权、会话管理支持多种数据源,因此访问数据源时,使用缓存来提升访问效率是上乘的选择。当下主流开源或企业级缓存框架均可以继承到Shiro中,来获取更快更高效的用户体验。
Cryptography是企业级安全框架基本特征。Shiro的加密包中,包含了易于使用和理解的密码加密,哈希和其余不一样加密算法的实现。加密包下面的全部类都是通过精心设计的,来达到易于使用和理解的目的,以前使用过Java自带的加密API的会了解到,它是很难使用的。Shiro的加密API简化了Java复杂的加密机制,并且很容易使用。
上文中也提到过,Realms做为Shiro和应用中安全数据源之间的桥梁或者链接器。当须要获取用户帐户进行认证(登录)或受权(访问控制)时,Shiro就会在应用的配置中查找负责这项工做的Realm(一个或多个)来完成获取安全数据。能够配置多个Realm,大多状况是一个数据源一个Realm,Shiro会负责为认证和受权协调多个Realm一同工做。
因为Shiro采用以Subject为中心的编程方式,因此几乎不多有机会直接与SecurityManager打交道(但与SecurityManager打交道对框架开发人员很重要),尽管如此,了解SecurityManager的做用也仍是很重要的,为应用配置SecurityManager的时候尤其重要。
如上文所述,SecurityManager负责处理应用中的安全操做,管理全部应用用户的状态。Shiro中SecurityManager的默认实现包括以下:
等等。
可是让一个组件完成这么多功能,并且作到灵活可定制是很是困难的。为了简化配置和使配置更灵活,Shiro的各类实现采用了高度的模块化。模块化以后,SecurityManager实际上就做为一个轻量级“容器”,几乎全部的功能都委托给内部或包装组件实现。这种包装的设计方法在详细的框架图中也有所体现。
这些组件才是真正的功能实现者,SecurityManager知道如何以及什么时候协调这些组件作正确的事情便可。