【翻译】Apache Shiro10分钟教程

本文为翻译文,原文地址:http://shiro.apache.org/10-minute-tutorial.html

介绍

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

通过这个教程,你会完全明白一个开发人员如何在他们的应用中使用Shiro,你也能够在10分钟内做到。

概述

什么是Apache Shiro?

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

Apache Shiro能做什么事情?

很多。不过我们不想在入门阶段就全部展开。如果你想知道它能帮你做什么,请查阅我们的描述特性的网页。如果你好奇我们的起源和我们的存在,请查阅描述我们的历史和任务的网页。

好了,现在我们开始吧。

请注意:
Shiro能运行在任何环境,无论简单的命令行,或者大型的Web集群应用,不过我们在此快速入门会用最简单的例子,比如main方法,这样你就能了解这些API。

下载

  1. 保证已经安装JDK1.6+、Maven3.0.3+
  2. 在下载页下载最新的“Source Code Distribution”。在本例中,我们使用1.3.2 release distribution。
  3. 解压
    $ unzip shiro-root-1.3.2-source-release.zip
  4. 进入quickstart目录
    $ cd shiro-root-1.3.2/samples/quickstart
  5. 运行QuickStart
    $ mvn compile exec:java

    它的目标只是打印一些日志信息让我们知道发生了什么,然后退出。在阅读本快速入门,随时查阅代码samples/quickstart/src/main/java/Quickstart.java。尝试改变文件,运行以上的命令mvn compile exec:java

Quickstart.java

上述的Quickstart.java文件包含全部我们需要熟悉的API,现在我们分块来看,使我们更容易理解究竟发生了什么。

在几乎所有的环境中,你能通过以下代码获取当前执行用户:

Subject currentUser = SecurityUtils.getSubject();

使用SecurityUtils.getSubject(),我们能获取当前执行的SubjectSubject可看作只是一个应用程序的用户的主题视图。我们实际想叫它“用户”显得“有意义”,但我们最后还是没有这么做。因为太多的应用程序存在他们自己的User类或框架,我们不太与之发生冲突。另外,在安全的领域里,这个词实际上是工人的术语。

在独立的应用中使用getSubject(),它可能返回一个特定应用的用户,如果在一个服务器环境(比如Web应用),它在当前线程或传入的请求中查找关联的用户。

现在,你有了Subject对象,你能够做什么事情呢?

如果你想使某些东西在当前应用的当前会话中可用的,你可以先获取Session:

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

Session是Shiro指定的对象,提供了大部分我们常用的普通的HttpSession,但有一些额外的好处和一个重大的区别:它不需要一个HTTP环境!

如果部署在Web应用中,默认情况下Session就是HttpSession。但是,如果在非Web应用中,比如上面的Quickstart.java,Shiro会自动地使用它企业级会话管理。这意味着,无论在任何环境,你都可以使用相同的API。这打开了一个全新的世界,因为任何应用程序需要会话,不需要强制使用HttpSession或EJB有状态的Session Bean。并且,任何客户端技术可以共享会话数据。

现在我们能获取用户和会话了。有真正有用的事情吗?比如检查他是否被允许做这个事情?比如检查角色和权限?

好,我们对用户做这些检查。我们上述的Subject代表当前用户,但当前用户是谁呢?他们是匿名的,直到他们至少登录了一次。所以,我们做一次登录吧:

if ( !currentUser.isAuthenticated() ) {
    //collect user principals and credentials in a gui specific manner
    //such as username/password html form, X509 certificate, OpenID, etc.
    //We'll use the username/password example here since it is the most common.
    //(do you know what movie this is from? ;)
    UsernamePasswordToken token = new UsernamePasswordToken("lonestarr", "vespa");
    //this is all you have to do to support 'remember me' (no config - built in!):
    token.setRememberMe(true);
    currentUser.login(token);
}

就是这样!但它并不简单。

但如果他们登录失败呢?你能捕获各种具体的异常,这些异常能告诉你究竟发生了什么,你可以根据这些做出响应的处理:

try {
    currentUser.login( token );
    //if no exception, that's it, we're done!
} catch ( UnknownAccountException uae ) {
    //username wasn't in the system, show them an error message?
} catch ( IncorrectCredentialsException ice ) {
    //password didn't match, try again?
} catch ( LockedAccountException lae ) {
    //account for that username is locked - can't login.  Show them a message?
}
    ... more types exceptions to check if you want ...
} catch ( AuthenticationException ae ) {
    //unexpected condition - error?
}

你可以检查不同类型的异常。

方便的提示:
当用户登录失败,安全的最佳实践是给与常规的模糊的提示,比如登录失败,因为我们不希望帮忙攻击者尝试攻击我们的系统。

好,现在我们有一个登录用户。我们还能做什么?
比如说他们是谁?

//print their identifying principal (in this case, a username):
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 masters only.");
}

我们可以执行一个非常强大的实例级别权限检查,用户是否有权限访问特定类型的实例:

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

很容易,对吗?

最后,当用户使用系统完毕时,他们可以注销:

currentUser.logout(); //removes all identifying information and invalidates their session too.

这是开发人员使用Apache Shiro的核心知识,虽然一些很复杂的逻辑隐藏在引擎盖下面。

你可能会问自己,在登录时,谁负责获取用户的数据(用户名、密码、角色、权限等)?在程序运行时谁执行这些检查?恩,你做,通过实现Shiro所说的Realm等等。

然而,如何配置一个Realm很大程度上依赖于运行环境。比如,如果你运行一个独立的应用,或者是Web应用,或者是Spring应用,或J2EE应用,再或者它们的合并体。这种类型的配置在此快速入门的范围之外,因为此快速入门的目的是让我们熟悉API和Shiro的概念。

当你准备跳入更多细节,你一定会想要阅读认证指南和授权指南。然后可以移动到文档,特别是参考手册,去了解各种其它问题。你可能会想加入用户邮件列表,你会发现我们有一个热情的社区。

感谢您的阅读。我们希望你享受使用Apache Shiro!

原文地址:https://www.cnblogs.com/nick-huang/p/8592588.html

时间: 2024-08-14 18:27:02

【翻译】Apache Shiro10分钟教程的相关文章

【转】Lucene五分钟教程

原文链接 http://www.importnew.com/12715.html 英文原文链接 http://www.lucenetutorial.com/lucene-in-5-minutes.html Lucene五分钟教程 本文由 ImportNew - 刘 家财 翻译自 lucenetutorial.欢迎加入翻译小组.转载请见文末要求. 更新:下面的代码使用Lucene 4.0版本! Lucene大大简化了在应用中集成全文搜索的功能.但实际上Lucene十分简单,我可以在五分钟之内向你展

Org-mode五分钟教程ZZZ

Table of Contents 1 源起 2 简介 2.1 获取 org-mode 2.2 安装 3 基础用法 3.1 创建一个新文件 3.2 简单的任务列表 3.3 使用标题组织一篇文章 3.4 展开段落 3.5 使用链接 3.6 浏览文章 3.7 给任务添加说明 4 高级功能简述 4.1 设置 4.2 全局 TODO 列表 4.3 计划任务和日程表 5 再会 6 后记 1 源起 最近在学习 Emacs 的一些高级用法,在学习到了 org-mode,看到了官方网站上的这篇 David O'

Git之2分钟教程

Git之2分钟入门 普通人:“借我1000块钱”.程序猿:“借你1024吧,凑个整”. 今天是1024,是我们程序员的节日,在此,首先祝各位程序猿以及程序媛们节日快乐~然后送出一份节日礼物,没错,就是git的两分钟入门.当然了,这是我今天抽时间翻译过来的,原文在这里,翻译的有不对的地方欢迎指出. 有感于“Git in 5 Minutes”,我决定进一步写一个更短的入门教程.当然,这是极为简单的git教程.但是它对于初期的独立开发者来说已经足够了,而且它为你的成长建立了基础. 举例来说,一个需要完

Java:Apache log4j简明教程(一)

Apache log4j的官方介绍是“log4j is a reliable, fast and flexible logging framework (APIs) written in Java, which is distributed under the Apache Software License. log4j is highly configurable through external configuration files at runtime. It views the log

Apache Solr初学者教程(入门之旅)

Apache Solr初学者教程(入门之旅) 写在前面:本文涉及solr入门的各方面,请逐行阅读,相信能帮助你对solr有个清晰全面的了解和使用. 在Apache Solr初学者教程的这个例子中,我们将讨论有关如何安装最新版本的Apache Solr,并告诉你如何配置它.此外,我们将告诉你如何进行使用solr的样本数据文件索引.Apache Solr支持不同格式,包括各种数据库,PDF文件,XML文件,CSV文件等等.在这个例子中,我们的索引将研究如何索引数据从一个CSV文件. 我们首选的这个例

PHP环境搭建:Windows7系统配置PHP+Apache+MySQL环境教程

Win7系统下PHP.Apache.MySQL的环境搭建,是许多PHP初学者.甚至是有多年开发经验的PHP程序员都无法避免的一个环节.网络上关于WAMP环境配置的文章也不少,不过很多存在版本较老,或者解释不够清晰的问题. 最近将公司电脑的Win7版本从32位升级到64位,全盘清理,需要重新配置环境,借此机会,将Win7下搭建PHP.Apache.MySQL环境的具体方法分享给锐想网的各位同学.本文对32位和64位win7系统都可用. 先列出本文使用的各种软件的版本: Apache 2.2.21

[个人翻译]Redis 集群教程(下)

[个人翻译]Redis 集群教程(上) [个人翻译]Redis 集群教程(中) 官方原文地址:https://redis.io/topics/cluster-tutorial 水平有限,如果您在阅读过程中发现有翻译的不合理的地方,请留言,我会尽快修改,谢谢. 一个更有趣的示例程序 我们上边写的那个示例程序不够好玩.他以简单的方式写入到集群而没有检查写入的正确性. 从我们的观点看,集群接收写入命令可能每次操作总是把键foo写入 为42,并且我们一点也没有注意到. 所以在redis-rb-clust

GDB十分钟教程

转自:http://blog.csdn.net/liigo/article/details/582231 作者: liigo原文链接: http://blog.csdn.net/liigo/archive/2006/01/17/582231.aspx日期: 2006年1月16日 本文写给主要工作在Windows操作系统下而又需要开发一些跨平台软件的程序员朋友,以及程序爱好者. GDB是一个由GNU开源组织发布的.UNIX/LINUX操作系统下的.基于命令行的.功能强大的程序调试工具. GDB中的

GDB十几分钟教程

GDB十分钟教程 作者: liigo原文链接: http://blog.csdn.net/liigo/archive/2006/01/17/582231.aspx日期: 2006年1月16日 本文写给主要工作在Windows操作系统下而又须要开发一些跨平台软件的程序猿朋友,以及程序爱好者. GDB是一个由GNU开源组织公布的.UNIX/LINUX操作系统下的.基于命令行的.功能强大的程序调试工具. GDB中的命令固然非常多,但我们仅仅需掌握当中十个左右的命令,就大致能够完毕日常的主要的程序调试工