apache shiro
在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应用程序,该应用程序执行一些身份验证和授权。 对于本教程,您将需要:
- 阿帕克史郎
- 一个Java开发环境。 我使用Eclipse。 但是您也可以使用其他IDE或命令行工具。
- 您可以从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博客上简化了 应用程序安全性
相关文章:
- 任何软件开发公司应存在的服务,实践和工具,第2部分
- 使用Spring Security保护GWT应用程序的安全
- Java EE中的配置管理
- 2011年最危险的25个软件错误
- Spring MVC拦截器示例
- Java中的Google ClientLogin实用程序
翻译自: https://www.javacodegeeks.com/2011/10/apache-shiro-application-security-made.html
apache shiro