【Shiro】一、Apache Shiro安全框架简介

一、Shiro简介

Apache Shiro(发音为“ shee-roh”,日语为“ castle”)是一种功能强大且易于使用的Java安全框架,可执行身份验证,授权,加密和会话管理,可用于保护任何应用程序的安全-从命令行应用程序,移动应用程序到最大的Web和企业应用程序。

Shiro提供了用于执行以下方面的应用程序安全性API(我喜欢将它们称为应用程序安全性的4个基石):

  • 身份验证-证明用户身份,通常称为用户“登录”。
  • 授权-访问控制
  • 密码术-保护或隐藏数据以防被撬
  • 会话管理-每个用户的时间敏感状态

Shiro还支持一些辅助功能,例如Web应用程序安全性,单元测试和多线程支持,但它们的存在是为了加强上述四个主要方面。

 

二、Shiro框架的优点

在2008年加入Apache Software Foundation之前,Shiro已有5年的历史,以前被称为JSecurity项目,该项目始于2003年初。2003年,Java应用程序开发人员的通用安全替代品并不多-我们很漂亮Java身份验证和授权服务(也称为JAAS)非常困难。JAAS有很多缺点-尽管其身份验证功能尚可忍受,但授权方面却令人困惑且难以使用。而且,JAAS与虚拟机级别的安全问题紧密相关,例如,确定是否应允许在JVM中加载类。作为应用程序开发人员,我更关心应用程序最终用户可以做什么,而不是我的代码可以在JVM中做什么。

由于我当时使用的应用程序,我还需要访问一个干净的,与容器无关的会话机制。当时游戏中唯一的会话选择是需要使用Web容器的HttpSessions或需要EJB容器的EBJ 2.1状态会话Bean。我需要可以与容器分离的东西,可以在我选择的任何环境中使用。

最后,还有密码学的问题。有时候我们都需要保持数据安全,但是除非您是加密专家,否则很难理解Java密码体系结构。该API充满了受检查的异常,使用起来很麻烦。我希望有一个更干净的即用型解决方案,可以根据需要轻松地加密和解密数据。

因此,从2003年初的安全形势来看,您可以很快意识到,在一个单一的,统一的框架中,没有什么可以满足所有这些要求的。因此,JSecurity和后来的Apache Shiro诞生了。

自2003年以来,框架环境发生了很大变化,因此今天仍然有充分的理由使用Shiro。实际上有很多原因。Apache Shiro是:

  • 易于使用-易于使用是该项目的最终目标。应用程序安全性可能非常令人困惑和沮丧,并被认为是“必不可少的恶魔”。如果您使它易于使用,以使新手程序员可以开始使用它,那么就不必再痛苦了。
  • 全面-Apache Shiro声称没有其他具有范围广度的安全框架,因此它很可能是满足安全需求的“一站式服务”。
  • 灵活-Apache Shiro可以在任何应用程序环境中工作。尽管它可以在Web,EJB和IoC环境中运行,但并不需要它们。Shiro也不要求任何规范,甚至没有很多依赖关系。
  • 具有Web功能-Apache Shiro具有出色的Web应用程序支持,允许您基于应用程序URL和Web协议(例如REST)创建灵活的安全策略,同时还提供了一组JSP库来控制页面输出。
  • 可插拔-Shiro干净的API和设计模式使它易于与许多其他框架和应用程序集成。您会看到Shiro与Spring,Grails,Wicket,Tapestry,Mule,Apache Camel,Vaadin等框架无缝集成。
  • 支持-Apache Shiro是Apache Software FoundationApache软件基金会)的一部分,该组织被证明以其社区的最大利益为出发点。项目开发和用户群体友好的公民随时可以提供帮助。如果需要,像Katasoft这样的商业公司也可以提供专业的支持和服务。

三、Shiro中的三大核心概念

Shiro的体系结构具有三个主要概念:Subject(主体,即用户),SecurityManager(安全管理器)和Realms(域,Shiro 从从 Realm 获取安全数据(如用户、角色、权限))。

3.1 Subject(主体)

在保护应用程序安全时,可能要问自己最相关的问题是:“当前用户是谁?” 或“是否允许当前用户执行X”?在编写代码或设计用户界面时,我们通常会问自己以下问题:应用程序通常是基于用户故事构建的,并且您希望基于每个用户来表示(和保护)功能。因此,对于我们来说,在应用程序中考虑安全性的最自然的方法是基于当前用户。Shiro的API从根本上代表了这种思维方式。

更确切地说,“主体”一词是一个安全术语,基本上表示“当前正在执行的用户”。它只是不被称为“用户”

因为“用户”一词通常与人类相关联。在安全的世界,术语“主体”可以指一个人,但也有3次会谈进程,守护进程帐户,或任何类似。它仅表示“当前正在与软件交互的事物”。但是对于大多数意图和目的,您可以将其视为Shiro的“用户”概念。您可以在代码中的任何位置轻松获取Shiro主体,代码如下:

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

获取主体后,您可以立即访问当前用户想要使用Shiro进行的所有操作的90%,例如登录,注销,访问其会话,执行授权检查等,但稍后会介绍更多。这里的关键是Shiro的API在很大程度上是直观的,因为它反映了开发人员在“每用户”安全控制中进行思考的自然趋势。在代码中的任何地方访问主体也很容易,从而可以在需要的地方进行安全操作。

3.2 SecurityManager(安全管理器)

主体的“幕后”对应对象是SecurityManager。主题代表当前用户的安全操作,而SecurityManager管理所有用户的安全操作。它是Shiro体系结构的核心,并充当一种“伞”对象,引用了许多内部嵌套的安全组件,这些安全组件构成了一个对象图。但是,一旦配置了SecurityManager及其内部对象图,通常就不理会它,应用程序开发人员几乎将所有时间都花在Subject API上。

那么如何设置SecurityManager?这取决于您的应用程序环境。例如,Web应用程序通常将在web.xml中指定Shiro Servlet过滤器,这将设置SecurityManager实例。如果您运行的是独立应用程序,则需要以其他方式对其进行配置。但是有许多配置选项。

每个应用程序几乎总是只有一个SecurityManager实例。它本质上是一个应用程序单例(尽管它不必是静态单例)。像Shiro中的几乎所有内容一样,默认的SecurityManager实现是POJO,并且可以使用任何与POJO兼容的配置机制-常规Java代码,Spring XML,YAML,.properties和.ini文件等进行配置。可以使用类和与JavaBeans兼容的调用方法。

为此,Shiro通过基于文本的INI配置提供了默认的“公共分母”解决方案。INI易于阅读,易于使用,并且几乎不需要依赖项。您还将看到,通过简单地了解对象图导航,可以有效地使用INI来配置简单的对象图,例如SecurityManager。请注意,Shiro还支持Spring XML配置和其他替代方案,但我们将在此处介绍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

iniRealm.credentialsMatcher = $cm

[users]
jdoe = TWFuIGlzIGRpc3Rpbmd1aXNoZWQsIG5vdCBvbmx5IGJpcyByZWFzb2
asmith = IHNpbmd1bGFyIHBhc3Npb24gZnJvbSBvdGhlciBhbXNoZWQsIG5vdCB

上面展示了用于配置SecurityManager实例的INI配置示例。INI有两个部分:[main]和[users]。

[main]部分是配置SecurityManager对象和/或SecurityManager使用的任何对象(如领域)的地方。在此示例中,我们看到两个对象被配置:

  1. cm对象,它是Shiro的HashedCredentialsMatcher类的实例。如您所见,cm实例的各种属性是通过“嵌套点”语法配置的,该语法由清单3所示的IniSecurityManagerFactory用来表示对象图导航和属性设置。
  2. iniRealm对象,是SecurityManager用来表示以INI格式定义的用户帐户的组件。

在[用户]部分中,您可以指定用户帐户的静态列表-方便简单的应用程序或测试时使用。

下面展示如何加载用户配置信息文件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);

在这个简单的示例中,我们看到了一个三步过程:

  1. 加载将配置SecurityManager及其组成组件的INI配置。
  2. 根据配置(使用代表工厂方法设计模式的Shiro的Factory概念)创建SecurityManager实例。
  3. 使SecurityManager单例可被应用程序访问。在这个简单的示例中,我们将其设置为VM静态单例,但这通常不是必需的-您的应用程序配置机制可以确定是否需要使用静态内存。

3.3 Realms(域)

Shiro中的第三个也是最后一个核心概念是。域充当Shiro与应用程序的安全数据之间的“桥梁”或“连接器”。也就是说,当需要真正与安全性相关的数据(例如用户帐户)进行交互以执行身份验证(登录)和授权(访问控制)时,Shiro会从为应用程序配置的一个或多个Realms中查找其中的许多内容。

从这个意义上说,域本质上是特定于安全性的DAO:它封装了数据源的连接详细信息,并根据需要使关联数据可用于Shiro。在配置Shiro时,您必须至少指定一个领域用于身份验证和/或授权。可以配置多个Realm,但至少需要一个。

Shiro提供了开箱即用的域,可以连接到许多安全数据源(又名目录),例如LDAP,关系数据库(JDBC),文本配置源(例如INI和属性文件)等。如果默认的Realms不能满足您的需求,那么您可以插入自己的Realm实现以表示自定义数据源。下面的代码是配置Shiro(通过INI)以将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 

四、总结

Apache Shiro™是一个功能强大且易于使用的Java安全框架,它执行身份验证,授权,加密和会话管理。使用Shiro易于理解的API,您可以快速轻松地保护任何应用程序-从最小的移动应用程序到最大的Web和企业应用程序。

本文中主要介绍了Shiro的基本知识以及三大核心概念。下文中将详细介绍它的使用方法。

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值