apache shiro_Apache Shiro:简化应用程序安全性

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概念

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

主题是正在使用系统的用户的运行时视图。 创建主题时,不会对其进行身份验证。 对于身份验证,必须调用login方法,并传递适当的凭据。

会话表示与已验证主题关联的会话。 会话具有会话ID。 应用程序可以在会话中存储任意数据。 该会话有效,直到用户注销或会话超时。

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

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

领域为Shiro提取您的用户,权限和角色元数据。 通过实现领域并将其插入Shiro,可以使此数据可用于Shiro。 典型的领域使用关系数据库或LDAP来存储用户数据。

讲解

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

  1. 阿帕克史郎
  2. 一个Java开发环境。 我使用Eclipse。 但是您也可以使用其他IDE或命令行工具。
  3. 您可以从simpleshiro.zip下载此示例的源代码。
步骤1:创建Shiro.ini配置文件

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

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

# Simple shiro.ini file
[users]
# user admin with password 123456 and role Administrator
admin = 123456, Administrator
# user mike with password abcdef and role Reader
mike = abcdef, Reader
# user joe with password !23abC2 and role Writer
joe = !23abC2, Writer
# -----------------------------------------------------------------------------
# Roles with assigned permissions
[roles]
# A permission is modeled as Resourcetype:actions:resourceinstances
# Administrator has permission to do all actions on all resources
Administrator = *:*:*
# Reader has permission to read all files
Reader = File:read:*
# Writer role has permission to read and write all files
Writer = File:read,write:*

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

步骤2:将BootStrap shiro插入您的应用程序
Factory factory = new IniSecurityManagerFactory("classpath:shiro.ini");
SecurityManager securityManager = factory.getInstance();
SecurityUtils.setSecurityManager(securityManager);

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

步骤3:登入
Subject usr = SecurityUtils.getSubject();
UsernamePasswordToken token = new UsernamePasswordToken("mike", "abcdef");
try {
    usr.login(token);
} 
catch (AuthenticationException ae) {
    log.error(ae.toString()) ;
    return ;
}
log.info("User [" + usr.getPrincipal() + "] logged in successfully.");

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

步骤4:检查使用者是否有权限
if (usr.isPermitted("File:write:xyz.doc")) {
    log.info(usr.getPrincipal() + " has permission to write xyz.doc ");
} else {
    log.info(usr.getPrincipal() + " does not have permission to write xyz.doc ");
}
if (usr.isPermitted("File:read:xyz.doc")) {
    log.info(usr.getPrincipal() + " has permission to read xyz.doc ");
} else {
    log.info(usr.getPrincipal() + " does not have permission to read xyz.doc ");
}

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

步骤5:登出
usr.logout();

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

在生产环境中,您不需要ini文件中的用户和角色。 您希望它们位于关系数据库或LDAP之类的安全存储库中。 在下一部分中,我将向您展示如何构建可以使用关系数据库中的用户,角色,权限元数据的Shiro领域。

参考: Apache Shiro:我们的JCG合作伙伴 Manoj在The Khangaonkar Report博客上简化了 应用程序安全性

相关文章:


翻译自: https://www.javacodegeeks.com/2011/10/apache-shiro-application-security-made.html

apache shiro

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值