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安全框架的文章或教程。希望对你有帮助。

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




©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,287评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,346评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,277评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,132评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,147评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,106评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,019评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,862评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,301评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,521评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,682评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,405评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,996评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,651评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,803评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,674评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,563评论 2 352

推荐阅读更多精彩内容

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