Apache-Shiro:应用程序安全变得简单

考虑到JAVA已经有超过10年的历史,应用程序开发人员需要在其应用程序中构建身份验证和授权的选项数量惊人地低。

在JAVA和J2EE中,JAAS规范试图解决安全问题。虽然JAAS适用于身份验证,但授权部分的使用过于繁琐。EJB和Servlet规范在方法和资源级别提供粗粒度授权。但是这些太粗糙了,不适用于真实世界的应用。对于Spring用户,Spring Security是另一种选择。但使用起来有点复杂,尤其是授权模式。大部分应用程序最终都会构建自己的解决方案以进行身份​​验证和授权。

Apache Shiro是一个开源的JAVA安全框架,可以解决这个问题。这是一个优雅的框架,可让您轻松地将认证,授权和会话管理添加到您的应用程序中。

Shiro的亮点是:

它是一个纯粹的Java框架。它适用于各种JAVA应用程序:J2SE,J2EE,Web,独立或分布式。

它可以轻松地与各种存储库进行集成,这些存储库可以托管用户和权限元数据,如RDBM,LDAP。

它有一个简单而直观的权限模型,可以应用于各种问题域。这是一种模式,可让您专注于问题领域,而不会陷入框架。

它建立在对会话管理的支持上。

它内置了对缓存元数据的支持。

它非常容易与Spring集成。同样适用于任何J2EE应用程序服务器。

最重要的是,它非常易于使用。大多数情况下,为了集成Shiro,您需要做的就是实施一个将Shiro与您的用户和权限元数据关联的REALM。

Shiro Concepts

SecurityManager封装了使用Shiro的应用程序的安全配置。

主题是使用该系统的用户的运行时视图。当主题被创建时,它不被认证。对于身份验证,必须调用登录方法,并传入正确的凭据。

会话表示与经过验证的主题相关的会话。会话有一个会话ID。应用程序可以在会话中存储任意数据。会话有效直到用户注销或会话超时。

许可表示主题可以在应用程序中的资源上执行什么操作。开箱即用Shiro支持以冒号分隔标记表示的权限。每个标记都有一些逻辑意义。例如,我的应用程序可能会将权限定义为ResourceType:actions:ResourceInstance。更具体地说File:read:contacts.doc代表读取文件contacts.doc的权限。权限必须与用户相关联,才能将该权限授予用户。

角色是可能代表执行一些组织功能的权限的集合。角色使用户和权限之间的关联更易于管理。

Realm抽象您的用户,Shiro的权限和角色元数据。通过实施一个领域并将其插入Shiro,您可以将这些数据提供给Shiro。典型的领域使用关系数据库或LDAP来存储用户数据。

教程

让我们构建一个简单的java应用程序,它执行一些验证和授权。对于本教程,您将需要:

  1. Apache Shiro
  2. 一个Java开发环境。我使用Eclipse。但是您也可以使用其他IDE或命令行工具。
  3. 你可以在simpleshiro.zip下载这个例子的源代码

步骤1:创建一个Shiro.ini配置文件

我们将使用Shiro附带的默认文件基础领域。这将从shiro.ini文件中读取用户/权限元数据。在随后的教程中,我将演示如何构建从关系数据库获取数据的领域。

在Ini文件中,让我们定义一些用户并将一些角色关联到他们。

在上面的shiro.ini中,我们定义了3个用户和3个角色。权限被建模
为冒号分隔的令牌。每个标记可以有多个逗号分隔的部分。每个域和部分都将权限授予某个特定于应用程序的域。

第2步:BootStrap shiro进入你的应用程序


 

IniSecurityManagerFactory从shiro.ini加载配置并为该应用程序创建一个单例SecurityManager。为了简单起见,我们的shiro.ini采用默认的SecurityManager配置,该配置使用基于Text的领域并从shiro.ini文件获取用户,权限和角色元数据。

第3步:登录


 

SecurityUtils是获取现有主题或创建新主题的工厂类。凭证使用AuthenticationToken传入。在这种情况下,我们希望传入用户名和密码,并因此使用UsernamePasswordToken。然后我们调用身份验证令牌中传递的Subject的登录方法。

第4步:检查用户是否有权限


 

Subject有一个isPermitted方法,它将权限字符串作为参数并返回true / false。

第5步:注销

注销方法将用户注销。
要熟悉Shiro,请尝试更改UsernamePasswordToken并以其他用户身份登录。检查一些其他权限。修改Shiro.ini文件以创建具有不同权限的新用户和角色。用不同的元数据和不同的输入运行程序几次。

在生产环境中,您不会希望在ini文件中使用用户和角色。您希望它们位于像关系数据库或LDAP这样的安全存储库中。在下一部分中,我将向您展示如何构建一个Shiro Realm,该Shiro Realm可以使用来自关系数据库的用户,角色和权限元数据。

原创于 【模棱博客】