Shiro 介绍及术语

Posted by jiangydev on December 6, 2017

[TOC]

Get Start with Apache Shiro 1

介绍

有效、灵活的开源 Java 安全框架,直观和详尽地处理身份认证、授权、企业会话管理和密码技术。

  1. 验证用户身份

  2. 用户访问控制(用户安全角色、允许的操作判别)

  3. 在没有 web 和 EJB 容器的情况下,在任何环境中使用 会话 API

  4. 在认证、访问控制或在会话的生命周期中对事件作出反应

  5. 将用户的安全数据聚合为 1 个或多个数据源并以单个可分解的用户视图呈现

  6. 能实现单点登录功能(Single Sign On)

  7. 能实现“记住我”服务,不用登录的用户联想

  8. More …

Apache Shiro Features

Shiro Features 图

应用安全的四大基石(Cornerstone)

  1. Authentication(身份认证):提供用户存在的行为,例如登录;

  2. Authorization(授权):访问控制的进程,例如决定谁有访问权限

  3. Session Management(会话管理):管理特定用户的会话,即使在非 web 或 EJB 应用中

  4. Cryptography(密码技术):在方便使用的同时,使用加密学算法保持数据安全

有许多额外的功能支持并加强在不同应用环境下的关注度

  1. Web 支持:Shiro 的 APIs 帮助简单的使 web 应用安全;

  2. 缓存:缓存在 Shiro APIs 中是重点(一线公民),确保安全操作快速和有效;

  3. 一致性:支持多线程应用;

  4. 测试:存在测试支持,帮助编写单元和集成测试,并确保代码能像预期的那样被保护;

  5. Run As:一个允许用户假定其他用户的身份(如果被允许)的功能,有时在管理方案中很有用;

  6. Remember Me:通过 Sessions 记住用户的身份,所以只需要在强制登录时登录。


Apache Shiro Terminology(术语)

阐述一些核心概念,你会明白 Shiro API 非常漂亮地慎重考虑它们(它们指下面的术语)。

  1. Authentication

身份认证是验证一个主体(Subject)身份的过程。当一个身份认证尝试成功时,应用程序可以信任该主体保证是应用程序期望的。

  1. Authorization

授权(也称为访问控制)是确定是否允许用户/主体执行某项操作的过程。它通常是通过检查和解释一个主体的角色和权限来完成的(见下文),然后允许或拒绝访问请求的资源或功能。

  1. Ciper

密码(Ciper)是执行加密或解密的一个算法。这个算法通常依赖称为 key 的一条信息。加密因 key 而异,没有它,解密极为困难。

密码有不同的变体:块密码通常在固定大小的符号块上工作,而流密码则在连续的符号流中工作。对称密码使用相同的密钥加密、解密,而非对称密码使用不同的密钥。如果非对称密码中的 某个键不能从另一个密码中派生,则可以公开地共享创建公钥/私钥对。

  1. Credential

凭据(Credential)是验证用户/主体的一条信息。在身份认证尝试中,一个(或多个)凭据与主体一起提交,以验证提交他们的用户/主体实际上是关联的用户。凭据通常是非常机密的,只有特定的用户/主体才会知道,例如密码、 PGP 密钥、生物特征属性或类似的机制。

这个想法是,对于一个主体,只有一个人知道正确的凭证与主体配对。如果当前用户/主体提供正确的凭证与系统中存储的相匹配,则系统可以假定并信任当前用户/主体是本人。信任度随着更安全的凭据类型增加(例如生物识别签名 > 密码)。

  1. Cryptography

加密是通过隐藏或将信息转换成无意义的内容来保护信息避免不需要的访问。

Shiro 关注加密的两个要素:

  • 密码:加密数据,像使用公钥或私钥的电子邮件;
  • 哈希:也称消息摘要,不可逆地加密数据。
  1. Hash

哈希函数是一种输入源不可逆转换的方式,有时称为编码哈希值消息或消息摘要。它通常用于密码、数字指纹、或基于字节数组的数据。

  1. Permission

Shiro 对权限的解释是,是一个描述应用程序中原始功能的语句,仅此而已。权限是安全策略中最低等级的结构,它们只定义应用程序可以做什么,但不描述谁能够执行这些操作。

  1. Principal

主体是一个应用程序用户的任何标识属性。标识属性可以是任何对你的应用有意义的,如用户名、用户ID等。

Shiro 也提到我们所说的 Subject 的主体(Principal)。主要的主体在整个应用程序中唯一标识一个 Subject。理想的主要主体像是一个 RDBMS 用户表主键的用户 ID 或用户名之类的东西。应用程序中,一个 Subject 只有一个主要的主体。

例如:Subject1 (primary principal, principal2, principal3, principal4);

  1. Realm

域是一个可以访问特定应用程序的安全数据 (如用户、角色和权限) 的组件。它可以被看作是一个特定于安全的 DAO (数据访问对象)。该域将此应用程序特定的数据转换为 Shiro 理解的格式, 因此, 无论有多少数据源存在或应用程序特定的数据, Shiro 都可以提供单一易懂的 Subject 编程 API。

域通常与数据源(如关系型数据库、LDAP 目录、文件系统或其他类似资源)有一对一的相关性。因此,域接口的实现使用特定数据源的 API 来发现授权数据(角色、权限等), 如 JDBC、文件 IO、休眠或 JPA 或任何其他数据访问 API。

  1. Role

角色的定义因你想交流的对象而异。Shiro 更喜欢将角色简单地解释为权限集合的命名。

这比许多应用程序使用的隐式定义更具体。如果你选择让你的数据模型反映 shiro 的假设, 你会发现你在控制安全策略方面将有更大的权力。

  1. Session

会话是与单个用户/Subject(在一段时间内与一个软件系统交互)相关的有状态上下文。当 Subject 使用应用程序时,可以在会话中添加/读取/删除数据,并且应用程序可以在以后有必要的时候使用数据。当用户/Subject 从应用程序中推出或由于不活动而超时时,会话终止。

对于那些熟悉 HttpSession 的人来说, 一个 Shiro 的会话服务于相同的目的, 除了 Shiro 在任何环境中都可以使用, 即使没有 Servlet 容器或 EJB 容器。

  1. Subject

Subject 基本上意味着一个应用程序用户的特定安全的视图。Subject 并不总是需要反映一个人,但它可以代表一个外部进程调用您的应用程序, 或者可能是一个守护程序系统帐户, 在一段时间内间歇性地执行某件事 (如 cron 作业)。它基本上是任何实体(应用程序正在做的东西)的表示。