What is Apache Shiro?

in Review with 0 comment

What is Apache Shiro?

这是一篇 Shiro 官网的介绍文章

What is Apache Shiro?

什么是 Apache Shiro?

Shiro 是一个可以用作命令行端应用,手机应用,大型 web 应用和企业级应用的 Java 安全框架,可以提供身份验证,密码和 session 管理等功能。

##为什么要创造 Apache Shiro?

Shiro 诞生在 2003 年,它的前身是 JAAS ,一个特别依赖 java 虚拟机的认证服务。当我作为开发者时,我并不关心代码是如何在虚拟机中运行的,而是在乎如何去验证当前用户。

而且它很依赖 web 容器,当时唯一的 session 选择是 HttpSessions,但是它特别依赖容器,比如 EBJ2.1 有状态的 session 对象。

最后,如果你不是一个密码专家的话,很难去理解 java 的密码加密解密架构。需要一个开箱即用的密码解决方案去保护数据是很有必要的。

在 2003 年之前很难有这么一个框架可以解决上述问题,所以 shiro 就应用而生了。

为什么你今天还会去使用 Shiro?

实际上这里有很多原因:

核心概念:Subject,SecurityManager,Realms

Subject

当你相对自己的应用进行安全验证时,大多数问题可能会问自己,“谁是当前用户?这个用户要去干嘛?”

Subject 就相当于“当前用户”这个概念,那你也会问,为什么不使用 “user” 这个词呢,其实 "Subject" 在安全领域并不单一指 "人" 这个概念,很可能指其它比如第三方登录或者任何类似的东西

获取 Subject

import org.apache.shiro.subject.Subject;
import org.apache.shiro.SecurityUtils;
...
Subject currentUser = SecurityUtils.getSubject();

一旦你获得了当前用户,你就有 90% 的权限去做任何事情,比如 登录,登出,获取它们的 session,执行认证检查。这就是 shiro 强大之处,它反映了任何开发者对于当前用户的操作,它可以在代码的任何地方去使用。

SecurityManager

Subject 的背后便是 SecurityManager,当 Subject 代表当前用户,SecurityManage 便管理着所有用户的安全操作。这是 Shiro 架构的核心。一旦 SecurityManager 被设置好之后,开发者更多的操作便只是在 Subject 上面。

所以如何设置 SecurityManager 呢?这取决于你的应用环境,如果你想指定通过 Shiro Servlet Filter 的方式设置在 web 容器的 web.xml 中,这边设置好了 SecurityManager。如果你设置在其他独立的容器中,那你也可以设置在其他位置。

你可以通过任何兼容 POJO 的配置机制机制进行配置,例如普通 java 代码,Spring XML,YAML, .properties 和 .ini 文件等。

下面的简单例子使用 ini 配置。

通过 INI 方式设置 Shiro

[main]
cm = org.apache.shiro.authc.credential.HashedCredentialsMatcher
cm.hashAlgorithm = SHA-512
cm.hashIterations = 1024
# Base64 encoding (less text):
cm.storedCredentialsHexEncoded = false

加载 shiro.ini 配置文件

import org.apache.shiro.SecurityUtils;
import org.apache.shiro.config.IniSecurityManagerFactory;
import org.apache.shiro.mgt.SecurityManager;
import org.apache.shiro.util.Factory;

...
//1. Load the INI configuration
Factory<SecurityManager> factory =
new IniSecurityManagerFactory("classpath:shiro.ini");

//2. Create the SecurityManager
SecurityManager securityManager = factory.getInstance();

//3. Make it accessible
SecurityUtils.setSecurityManager(securityManager);

Realms

Realms 相当于你的应用与 shiro 之间沟通安全数据的桥梁或通道。这些相关的安全信息比如是登录的认证信息和权限的控制信息,shiro 从一个或多个 Realms 中查找这些信息。

Realms 实际上是一个指定的 DAO:它封装了如何联系数据源并且提供给 Shiro 需要的数据的方法细节。你可以指定一个或多个的 Realm 去用作认真或者授权。但是至少需要一个

Shiro 提供开箱即用的 Realms 去连接安全数据源,比如 LDAP,JDBC,文本设置 如 INI, .properties 文件。如果默认的 Realms 无法满足你的需求,你可以插入自己的 Realm 实现自定义数据源

通过 LDAP 数据存储类型的方式配置代码

[main]
ldapRealm = org.apache.shiro.realm.ldap.JndiLdapRealm
ldapRealm.userDnTemplate = uid={0},ou=users,dc=mycompany,dc=com
ldapRealm.contextFactory.url = ldap://ldapHost:389
ldapRealm.contextFactory.authenticationMechanism = DIGEST-MD5