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