Apache Shiro 安全框架的几个术语
在开始使用Shrio框架之前,了解几个专属的术语,有助于学习和理解框架的设计,对于我们使用框架也非常的重要。本文提及的几个概念在Shiro的文档会经常出现,只有理解了他们才能更好理解Shiro的架构和一般的安全框架的设计。提起安全,一般讲起来都显得过于复杂。开发出Shrio就是想让开发人员不要太苦逼,所以让我们一起明晰一些核心概念,看看Shiro是如何破解这些复杂的难题的。
一、Authentication
Authentication——认证,就是一个主体认证的过程。简单来说就,如果需要认证的主体是一个人,那么是需要主体来证明他就是他所说的那个人。如果申请认证通过,应用就可以认为这是一个授信的主体。
二、Authorization
Authorization——授权,一般理解为功能权限的控制,也就是这个主体能或不能使用某个功能,是不是具备这样的权限使用这个功能。Shrio里,授权一般通过区分用户的roles角色或是permissions许可来实现,判断为允许的,那么就可以访问请求的资源,反之则不能。
三、Cipher[ˈsaɪfɚ]
我们所说的Cipher就是操作加密或者解密的一个运算。它通常提取一小部分信息作为加密解密的关键信息,也就是我们成为的Key,因为无论加密还是解密都需以此Key为基础,不然就难以实现。Cipher运算有多种实现方法。分组密码也称块密码是将信息分组分块后进行密码运算,而另外一种称之为流密码也称序列密码则是针对一个连续的信息进行操作。对称加密算法加密解密用同样的密钥,而非对称加密则使用不同的密钥。在非对称加密中,密钥只能使用一个公开共享的公钥创建出成对的公/私密钥,而不能从一个私钥创建出另外一个来使用。
四、Credential 凭据
我们所说的凭据就是用来验证用户(主体)的一段信息内容。凭据发生在用户(主体)尝试验证认证的过程中,通常使用诸如密码或PGP密钥或者生物识别信息等类似机制获得特定信息,这些特定信息只有特定的人可以获取到或具备。对于一个用户(主体)来讲,用于证明他身份的信息凭据只有他自己才有。所以,如果当前用户(主体)提供的凭据与系统储存的一致,那么系统也可以根据凭据认定,当前的用户就是真实合法的用户。通过更安全的凭据方式也可以提升身份的授信程度(比方说生物信息凭据如指纹>密码)。
五、Cryptography
接下来我们讨论一下加密学,实际上它是一系列的操作方法。它通过将信息进行处理把信息变成“无意义”或是无法直接读取的,这样有些我们不想让他们看到信息的人就无法访问到信息的内容了。Shiro框架将重点放在两个加密学的核心元素上:用公钥或私钥处理数据的加密,如邮箱地址等,还有就是散列(认证和密钥的协商协议信息)不可以逆加密信息如密码等。
六、Hash
哈希,哈希就是一种对数据数据进行单向的不可逆的运算,有时称为message,也可以称作Hash编码值,或是消息的digest,它通常用于处理密码,数码指纹信息或是其他的基础形式的Byte数据。
七、Permission 许可 权限
许可,权限的概念,在shiro中我们是这样描述它的,它用于描述应用中具体功能的可用性,仅此而已。许可是最低层级的权限策略了。用它的定义来告诉应用那些功能能用。在许可的定义里我们不描述谁可以操作,仅关注能否操作。所以归结起来说,许可只是一个行为的描述,可以或者步行,仅此而已。
我们些例子来说明一下许可:
打开一个文件
比如像查看/usr/list这个web页面
打印一些文档
删除jsmith这个用户
八、Principal
Principal标识,就是用户(主体)用于区分于其他用户的关键属性。对于关键属性,不同的应用有不同的设定,可以是一个用户名,身份证号,用户编号等等都可以。Shrio中,我们通常叫做Subject的关键标识,也就是在整个应用中,能标记出这个Subject的唯一的标识。理想的标识可以是用户名、用户编号,这类在关系数据库中的主键。需要注意的是,在一个应用中,用户(主体)的标识只能有一个。
九、Realm
Realm 是shiro中的一个数据组件,在shiro中,使用它来访问存放用户、角色和权限的数据。按照以往的项目开发经验,你也可以理解为它是一个用于安全管理的特殊的DAO(数据访问对象)。Realm仅负责将应用指定的特殊设定的数据转换为可以被shiro识别并转换为可供shiro的API可以使用的数据形式。这样就规避了数据源的差别和应用程序自身的数据的特殊性。Realm必须指定一个也只能指定一个数据源,数据源可以是关系数据库、LDAP、文件或是其他的类似源。当然,使用JDBC或是IO文件或是用Hibernate、JPA或是其他的数据访问的接口,都需要根据实际情况去实现Realm提供的接口。
十、Role
角色的定义根据话语情境不同定义也千差万别。不少应用中根本没有明确的角色概念,好一点儿的会考虑一些安全策略。Shiro设计的非常明确,很简单,角色就是权限的集合。如果你愿意接纳 Shiro 框架对于安全策略的定义一定就会很快感受到它的威力。
十一、Session
Session 就是一个状态数据,它存放着一个用户(主体)在一个时间段内与应用交互的状态信息。应用可以根据需要对 Session 数据进行新增、读取、删除。如果用户(主体)在应用中主动操作了注销或者停止操作超出了一定的时间,那么 Session 也将结束。对于 Shiro 来讲,它的 Session 定义要更为宽泛,它不仅以为着 Http 环境下的 Session 也可以被用于没有 Servlet 容器和 EJB 容器的应用环境中。
十二、Subject
在安全领域有很多术语,Subject主体就是其中一个,简单来说对于一个软件应用来讲它代表的就是用户。
某种程度上讲,一个主体往往并不总是代表一个人,它泛指所有外界需要与应用进行交互的事物,有时候是用户也就是一个人,有时候可能是另外领域的一个系统的调用,比方说 cron 定时任务。主体这个概念代表了所有与应用程序交互的实例。