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博客上简化了 应用程序安全性

相关文章:

  • 任何软件开发公司应存在的服务,实践和工具,第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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/374355.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Maven 导出依赖Jar,生成source.jar,javadoc.jar

下载最新版的Maven http://maven.apache.org/download.cgi 解压到本地文件夹新建环境变量 MAVEN_HOME maven解压目录在path加入 %MAVEN_HOME%/bin;需要确保已经有Java环境变量 (打开cmd java -version,javac -version两个命令看正常不)一、导出到默认目…

python提取包含特定字符串的行_python语言----txt中搜索特定字符串所在行

打开IDLE(python),并新创建一个py文件,编辑内容为: 本示例演示如何在一个txt文件中搜索特定的字符串,并将其行显示# 1. 打开文件# 2. 读取行信息# 3. 判断是否包含关键词# 4. 不包含则循环操作,包含的话将行显示并退出…

asp.net 分布式应用开发

Net Framework推出的许多新技术为上述任务的实现提供了相对简单的解决方案。其中,基于SOAP的Web Service在处理分布式应用时具有比传统的DCOM/CORBA明显的优点,结合基于Web的ASP.NET页面开发技术和SQL Server数据存储技术(或Xml文档&#xff…

Spring Data JPA的持久层

1.概述 本文将重点介绍Spring 3.1,JPA和Spring Data的持久层的配置和实现。 有关使用基于Java的配置和项目的基本Maven pom设置Spring上下文的分步介绍,请参阅本文 。 持久性与春天 系列 : 第1部分 – 具有Spring 3.1和Hibernate的持久层 …

C语言开发笔记(三)自加和自减

看到一段代码&#xff0c;被坑了。 #include <stdio.h>int main(void) {int a 7;printf("%d\n", a);printf("%d\n", a--);printf("%d\n", -a);printf("%d\n", -a--);printf("%d\n", a);return 0; } 结果为 -a的逻辑…

求解数独回溯算法

实现的java代码如下&#xff08;该算法只是将结果打印输出&#xff0c;并没有对原数组实现更改&#xff09;&#xff1a; //判断a[i][j]取值val是否有效public boolean isValid(int[][] a, int i, int j, int val){//判断是否跟同行冲突for(int j10;j1<9;j1){if(a[i][j1]val…

python语言属于哪一种语言_Python与Java:你应该学习哪种语言,他们有什么区别?...

在企业招聘中&#xff0c; Python和Java经常是需求最大的编程语言。这两种编程功能强大&#xff0c;灵活且面向对象的语言&#xff0c;通常在组织中和各种其他设置中使用。这可能会导致我们提出一个不可避免的问题&#xff1a;哪个更好&#xff1f; 这是一个复杂的问题&#xf…

关于手机端CSS Sprite图标定位的一些领悟

今天在某个群里面闲逛&#xff0c;看见一个童鞋分享了一个携程的移动端的页面。地址这里我也分享下吧&#xff1a;http://m.ctrip.com/html5/在手机端我都很少用雪碧图合并定位图标&#xff0c;用的比较多就是用字体图标来代替&#xff0c;有些图标不多的时候就自己单个的切出来…

将Java向前推进? 一个定义。 一年回顾。

这篇文章是许多其他“年终”博客文章和评论之一。 但这并不是这样。 我正在尝试总结我在2011年所学到的有关Oracle和Java的知识&#xff0c;还试图解释“将Java向前推进”对我的意义以及我认为应该更好或更简单地改变的东西。 感谢您全年关注我的博客&#xff0c;也感谢您在Twi…

c语言程序源代码_程序的编译、链接和执行

同学们总是抱怨每次见到一道面试题都很难把它转化为程序源代码。然而不幸的是&#xff0c;即使是程序源代码对于计算机来说也还是太高级了。要想让计算机执行一段程序&#xff0c;我们必须把它翻译成最底层的机器指令才行。这其中要经历很多步骤。幸运的是有很多现成的工具可以…

Ubuntu下tftp服务器的搭建

参考博客&#xff1a;http://blog.chinaunix.net/uid-26495963-id-3206829.html1. 安装$ apt-get install tftp-hpa tftpd-hpa2. 建立目录$ mkdir /tftpboot # 这是建立tftp传输目录。$ sudo chmod 777 /tftpboot$ sudo touch test.txt # test.txt文件最好输入内容以便区分3. 配…

【程序员眼中的统计学(1)】信息图形化:第一印象

信息图形化&#xff1a;第一印象 作者 白宁超 2015年10月13日23:23:13 摘要&#xff1a;程序员眼中的统计学系列是作者和团队共同学习笔记的整理。首先提到统计学&#xff0c;很多人认为是经济学或者数学的专利&#xff0c;与计算机并没有交集。诚然在传统学科中&#xff0c;其…

JBoss AS 7.0.2“ Arc”发布–使用绑定选项

有关JBoss AS7方面的更多好消息。 JBoss AS 7.0.2.Final“ Arc”已经发布&#xff01; 自AS 7.0.1发布以来已经过去了一个月。 在这短时间内&#xff0c;已修复了许多错误&#xff0c;并实现了更多功能和改进。 所有这些错误修复和功能已包含在此7.0.2版本中。 此新版本主要包…

C语言开发笔记(五)字符串常量

#include <stdio.h> #include <string.h>int main(void) {char *str "sting";strcpy(str, "hello");printf("%s\n", str);return 0; } 代码为什么会运行错误&#xff0c;异常退出&#xff1f; 这段代码是新手常见错误之一。 定义…

不属于python标准库的是_python标准库和扩展库

Tkinter ———— Python 默认的图形界面接口。 Tkinter 是一个和 Tk 接口的模块&#xff0c; Tkinter 库提供 了对 Tk API 的接口&#xff0c;它属于 Tcl/Tk 的 GUI 工具组。 Tcl/Tk 是由 John Ousterhout 发展的书写和 图形设备。 Tcl( 工具命令语言 ) 是个宏语言&#xff0c…

Android N 新特性 + APP开发注意事项

1. 多窗口MultiWindow 多窗口MultiWindow&#xff0c;这是Android N里对开发者影响比较大的特性&#xff0c;也是大家疑问比较多的地方。站在开发者的角度其实不必太担心这个特性会导致我们需要修改很多代码来适配系统。Google的工程师们也不希望这个特性导致很多应用出现问题&…

C语言开发笔记(六)实参和形参

举例说明 #include <stdio.h>void swap(int x, int y) {int temp 0;temp x;x y;y temp; }int main(void) {int a 1, b 2;swap(a, b);printf("a%d, b%d\n", a, b);return 0; }结果为 在函数调用时&#xff0c;a的值传给x&#xff0c;b的值传给y。执行完…

Spring Singleton,请求,会话Bean和线程安全

由众多有用框架组成的Spring框架生态系统已成为许多Java EE应用程序的基础。 但是在所有Spring产品的核心中&#xff0c;我们仍然拥有Spring DI / IOC框架&#xff0c;该框架将Spring推向了新的高度。 随着越来越多的人将Spring MVC或JSF-Spring集成用于他们的应用程序&#xf…

some fragments

1.fullpage 2.one page.js 3.scrollReveal.js 4.wow.js 5.浏览器前缀&#xff1a; -webkit- &#xff1a; Safari&#xff0c;Chrome -o- &#xff1a; Opera -moz- &#xff1a; Firefox -ms- &#xff1a; IE   6.css3过渡动画&#xff1a;transitio…

面试之ajax原理(转载)

总结1 总结2 AJAX全称为“Asynchronous JavaScript and XML”&#xff08;异步JavaScript和XML&#xff09;&#xff0c;是一种创建交互式网页应用的网页开发技术&#xff0c; 是几种原有技术的结合体。它由下列技术组合而成。 1.使用CSS和XHTML来表示。 2. 使用DOM模型来交互和…