Apache Shiro 10分钟入门教程

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的概念感到满意。

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

感谢您的关注。我们希望您喜欢使用Apache Shiro!

我会持续发布一些Shiro安全框架的文章或教程。希望对你有帮助。

码字辛苦啊——打个赏呗~ ^_*




推荐阅读更多精彩内容

  • 你的第一个Apache Shiro应用 如果你是第一次接触Apache Shiro,这个简短的教程将向你展示如何创...
    倔强的小亮阅读 5,652评论 1 31
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 103,724评论 13 125
  • 构建一个互联网应用,权限校验管理是很重要的安全措施,这其中主要包含: 认证 - 用户身份识别,即登录 授权 - 访...
    zhuke阅读 2,545评论 0 32
  • 目录 Apache Shiro架构详解... 1 1、高层视图... 2 2、详细架构... 4 3、Shrio设...
    尘_竹阅读 2,511评论 0 4
  • 同事小张的母亲, 一生就省吃俭用, 吃穿住行, 样样节省, 不吃荤菜, 不讲穿戴, 吃剩饭菜, 破衣烂衫。 算计到...
    旖旎i阅读 82评论 0 3