Apache Shiro的运行流程和权限控制方式分析
Shiro的架构有3个主要的概念:
Subject
SecurityManager
Realms
下面的关系图是关于这些组件是如何交互的高级概述。
我们接下来讨论下每一个概念。
Subjects:Subject实质上是一个当前执行用户的特定的安全“视图”。鉴于”User”一词通常意味着一个人,而一个Subject可以是一个人,也可以代表第三方服务,或者其他类似的任何东西–基本上是当前正在与软件进行交互的任何东西。所有Subject实例都被绑定到一个SecurityManager上,当你与一个Subject交互时,那些交互作用转化为与SecurityManager交互的特定subject的交互作用。
SecurityManager:SucerityManager是Shiro架构的心脏,并作为一种“保护伞”对象来协调内部的安全组件共同构成一个对象图。然而,一旦SecurityManager和它的内置对象图已经配置给一个应用程序,那么它单独留下来,且应用程序开发人员几乎使用他们所有的时间来处理Subject API.当你真该与一个Subject进行交互时,实质上是幕后的SecurityManager处理着所有 繁重的Subject安全操作。
Realms:Realms担当Shiro和你的应用程序的安全数据之间的“桥梁”或“连接器”。当它实际上与安全相关的数据,如用来执行身份验证(登录)及授权(访问控制)的用户账户交互时,Shiro从一个或多个为应用程序配置的Realm中寻找许多这样的东西。在这个意义上说,Realm本质上是一个特定安全的DAO:它封装了数据源的连接详细信息,使Shiro所需的相关的数据可用。当配置Shiro时,你必须指定至少一个Realm用来进行身份验证或授权。SecurityManager可以配置多个Realms,但至少有一个是必须的。
Application Code:也就是用户编写的代码。
用简明扼要的话总结一下:Subject就是Shiro管理的用户;SecurityManager是安全管理器,是Shiro权限控制核心对象,在编程时,只需要操作Subject方法,底层会调用SecurityManager方法,无需直接变成操作SecurityManager;Realm是应用程序和安全数据之间的连接器。 应用程序要进行权限控制,就 需要读取数据表中的数据,也许数据并不是存储在数据表中,可能存储在文件或 网络上,但不管怎样,都是需要读取数据的,那么就一定需要通过Realms对象来读取这些安全数据。以用户登录流程为例,应用程序首先是去调用Subject,Subject去调用SecurtyManager安全管理器 ,SecurtyManager去调用Realm,Realm再去读取安全数据。
Shiro进行权限控制
主要有四种主要的方式:
在程序中,通过Subject以编程方式进行权限控制。
通过配置Filter,实现URL级别粗粒度的权限控制 。
通过配置代理,基于注解实现细粒度的权限控制。
在页面中使用shiro自定义标签实现页面显示的权限控制。