您可以捐助,支持我们的公益事业。

1元 10元 50元





认证码:  验证码,看不清楚?请点击刷新验证码 必填



  求知 文章 文库 Lib 视频 iPerson 课程 认证 咨询 工具 讲座 Model Center   Code  
会员   
   
 
     
   
 订阅
  捐助
Apache Shiro 10分钟入门教程
 
作者:尘_竹
  1396  次浏览      15
2020-5-21
 
编辑推荐:
本文主要介绍了Apache Shiro能做什么?开发人员如何在其应用程序中使用Shiro,希望对您的学习有所帮助。
本文来自于简书,由火龙果软件Alice编辑、推荐。

1.简介

欢迎来到Apache Shiro的10分钟教程!

通过阅读这个快速简单的教程,您将充分了解开发人员如何在其应用程序中使用Shiro。而且你应该可以在10分钟内做到这一点。

2.概览

什么是Apache Shiro?

Apache Shiro是一个功能强大且易于使用的Java安全框架,为开发人员提供了一个直观而全面的解决方案,用于身份验证、授权、加密和会话管理。

实际上,它实现了管理应用程序安全性的所有方面,同时尽可能避免出现问题。它建立在完善的接口驱动设计和面向对象的原则之上,可以在任何你想象得到的地方实现自定义行为。但是,对于所有事情来说,默认情况下都是合理的,这与应用程序安全性是一样的。至少这是我们所追求的。

Apache Shiro能做什么?

很多。但我们不想扩张“快速入门”的内容。如果您想了解它可以为您做什么,请查看我们的功能页面。此外,如果您对我们如何开始以及为什么存在感到好奇,请参阅Shiro History and Mission页面。

ok,现在我们来做一些事情吧!

注意:

Shiro可以在任何环境下运行,从最简单的命令行应用程序到最大的企业Web和集群应用程序,但是我们将在这个快速入门(QuickStart)中使用一个简单的"main"方法来完成一个最简单的例子,以便可以获得对API的感受。

3.下载

1)确保您安装了JDK1.6+和Maven 3.0.3+。

2)从下载页面下载最新的Shiro"源代码分发"包。在这个例子中,我们使用1.3.2发行版本。

3)解压源代码包

$ unzip shiro-root-1.3.2-source-release.zip

4)进入quickstart目录

$ cdshiro-root-1.3.2/samples/quickstart

5)运行QuickStart

$mvn compile exec:java

这个目标只会打印出一些日志消息,让你知道发生了什么,然后退出——(主要Maven构建项目的过程,包括下载一些有关的组件,下载后,下次运行就不再次下载了)。在阅读本快速入门指南时,请随时查看samples / quickstart / src / main / java / Quickstart.java下的代码。根据需要随时更改该文件并运行上述mvn

compile exec:java命令。

【注:】

我这里在windows8下运行的,JDK1.8+maven3.5;步骤同上。

为了知道运行结果,我在源代码退出前位置加了一行代码,以观测效果:

log.info("\n====This is Quikstart

Exampel.It is done!====");//增加代码行

结果示意图:

4.Quickstart.java

上面引用的Quickstart.java文件包含了所有可以帮助您熟悉API的代码。现在让我们把它分成大块,这样你就可以很容易地理解发生了什么。

几乎在所有环境中,您都可以通过以下调用获取当前正在执行的用户:

Subject currentUser =SecurityUtils.getSubject();

使用SecurityUtils.getSubject(),我们可以获得当前正在执行的Subject。主体只是应用程序用户的特定安全"视图"。我们实际上想称它为'User(用户)',因为这"有道理",但我们决定不这么干:太多的应用程序都有现存的API,它们已经拥有自己的User类/框架,我们不想与这些API冲突。另外,在安全领域,术语Subject实际上是公认的命名法。 ok,继续...

独立应用程序中的getSubject()调用,可能会根据特定于应用程序的位置中的用户数据以及服务器环境(例如Web应用程序)返回相应Subject,并根据与当前线程或传入请求关联的用户数据而获取Subject? 。

现在你有一个主题,你可以用它做什么?

如果您想在应用程序的当前会话期间向用户提供可用的内容,则可以获得他们的会话:

Session session = currentUser.getSession();
session.setAttribute( "someKey", "aValue" );

Session是一个Shiro特定的实例,它给你提供了大多数习惯的常规HttpSession实例,但有一些额外的好处和一个很大的区别:它不需要HTTP环境!

如果在Web应用程序内部署,默认情况下会话将基于HttpSession。但是,在非Web环境中,就像这个简单的快速入门一样,Shiro默认会自动使用它的企业会话管理。这意味着无论部署环境如何,您都可以在应用程序中的任何层中使用相同的API。这将打开一个全新的应用程序世界,因为任何需要会话的应用程序都不需要强制使用HttpSession或EJB Stateful Session Beans。而且,任何客户端技术现在都可以共享会话数据。

所以现在你可以获得一个Subject和他们的Session。那些真正有用的东西比如检查是否允许他们做事情,比如检查角色和权限?

那么,我们只能对已知的用户进行这些检查。上面的Subject实例代表当前用户,但谁是当前用户?其实,他们是匿名的 - 也就是说,直到他们登录至少一次。所以,让我们这样做:

if ( !currentUser.isAuthenticated() ) {
//以gui特定方式收集用户主体和凭证-principalsand credentials
//如html表单的用户名/密码,X509证书,OpenID等。
//我们将在这里使用用户名/密码示例,因为它是最常见的。
//(你知道这是什么电影吗?;)
UsernamePasswordToken token = newUsernamePasswordToken("lonestarr", "vespa");
//this isall you have to do to support 'remember me' (no config - built in!):
//这就是你需要做的所有事情以便来支持'记住我'(没有配置 - 内置!)
token.setRememberMe(true);
currentUser.login(token);
}

附上述代码截图(清晰些:)

风格化代码截图

就这样!没有比这更容易了。

但是,如果他们的登录尝试失败呢?你可以捕捉各种具体的例外情况,告诉你到底发生了什么,并允许你相应地处理和做出反应:

try {
currentUser.login( token );
//如果没有例外,就是这样,搞定!
} catch ( UnknownAccountException uae ) {
//用户名不在系统中,如何向他们显示错误消息?
} catch ( IncorrectCredentialsException ice) {
//密码不匹配,是否再试?
} catch ( LockedAccountException lae ) {
//该用户名的帐户被锁定 - 无法登录。如何显示一条消息?
}
...更多类型的异常检查——如果你想要...
} catch ( AuthenticationException ae ) {
//意外情况 - 怎么处理?
}

附上述代码截图

风格和代码截图

您可以检查许多不同类型的例外情况,或者抛出Shiro可能无法解释的自定义异常情况。有关更多信息,请参阅AuthenticationException JavaDoc。

提示:

安全最佳做法是为用户提供通用登录失败消息提示,因为您不希望帮助攻击者试图进入系统。

ok,到现在为止,我们有一个登录用户。我们还能做什么?

让我们看看他们是谁:

//打印他们的标识主体(在这种情况下是用户名)
log.info( "User [" +currentUser.getPrincipal() + "] logged in successfully." );
我们也可以测试它们是否具有特定的角色:
if ( currentUser.hasRole( "schwartz" ) ) {
log.info("May the Schwartz be with you!" );
} else {
log.info("Hello, mere mortal." );
}
我们还可以看到他们是否有权对某种类型的实体采取行动:
if ( currentUser.isPermitted("lightsaber:weild" ) ) {
log.info("You may use a lightsaber ring.? Use it wisely.");
} else {
log.info("Sorry, lightsaber rings are for schwartz mastersonly.");
}

另外,我们可以执行非常强大的实例级权限检查 - 查看用户是否有权访问特定类型实例的功能

if ( currentUser.isPermitted("winnebago:drive:eagle5" ) ) {
log.info("You are permitted to 'drive' the 'winnebago' with licenseplate (id) 'eagle5'.? " +
"Here are the keys - have fun!");
} else {
log.info("Sorry, you aren't allowed to drive the 'eagle5'winnebago!");
}

 

小菜一碟,对吧?

最后,当用户完成使用应用程序时,他们可以注销:

currentUser.logout(); //删除所有标识信息并使其会话无效。

那么,这就是在应用程序开发人员级别使用Apache Shiro的核心。虽然有一些非常复杂的东西在引擎盖下进行,使得这项工作如此优雅,但这确实是它的全部。

但是你可能会问自己,"但是谁负责在登录时获取用户数据(用户名和密码,角色和权限等),以及谁在运行时真正执行这些安全检查?",这么问就对了——你来做:通过实施 Shiro称之为Realm的东西,并将该Realm插入到Shiro的配置中来完成。

但是,如何配置Realm很大程度上取决于您的运行时环境。例如,如果运行独立应用程序,或者如果您有基于Web的应用程序,或基于Spring或JEE容器的应用程序或其组合,这种类型的配置不在本快速入门的范围之内,因为它的目的是让您对API和Shiro的概念感到满意。

当您准备好了解更多细节时,您一定要阅读认证指南和授权指南。然后可以转到其他文档,特别是参考手册中,以回答任何其他问题。您也可能想要加入用户邮件列表 - 您会发现我们有一个非常棒的社区,只要有可能,他们都愿意提供帮助。

 

   
1396 次浏览       15
 
相关文章

iOS应用安全开发,你不知道的那些事术
Web安全之SQL注入攻击
移动APP安全在渗透测试中的应用
从Google备份互联网看“数据安全”
 
相关文档

web安全设计与防护
互联网海量内容安全处理技术
黑客攻击与防范技术
WEB黑盒安全检测
 
相关课程

WEB网站与应用安全原理与实践
web应用安全架构设计
创建安全的J2EE Web应用代码
信息安全问题与防范
最新课程计划
信息架构建模(基于UML+EA)3-21[北京]
软件架构设计师 3-21[北京]
图数据库与知识图谱 3-25[北京]
业务架构设计 4-11[北京]
SysML和EA系统设计与建模 4-22[北京]
DoDAF规范、模型与实例 5-23[北京]
 
最新文章
物联网安全概述
史上最详细的区块链技术架构分析
一文读懂区块链整体架构及应用案例
区块链技术架构
安全架构评审实战
最新课程
Web应用安全架构、入侵检测与防护
物联网关键技术、安全与边缘计算
区块链安全技术实践指南
云服务与安全架构
互联网安全开发方法与实践
更多...   
成功案例
中国银行 信息安全技术及深度防御
北京 Web应用安全架构、入侵检测与防护
某财税领域知名IT服务商 Web安全测试
普瑞克斯 web安全设计、测试与优化
北京和利时 性能和安全性测试
更多...