【apache shiro第三篇】Apache Shiro 10分钟教程

来源:互联网 发布:javascript百度云网盘 编辑:程序博客网 时间:2024/06/06 09:52

介绍

欢迎来到Apache Shiro的10分钟Tutoral !

在这个快速而简单的教程你应该完全理解开发人员如何使用Shiro的应用程序。 和你应该能够做到在10分钟。

概述

Apache Shiro是什么?

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

实际上,它实现了管理应用程序的所有方面的安全,同时保持的方式尽可能的多。 这听起来是建立在界面驱动设计和面向对象的原则,无论启用自定义行为你可以想象它。 但对一切合理的默认值,它是“手”应用程序安全性。至少这是我们争取的。

Apache Shiro会做什么呢?

很多。 但我们不想膨胀快速入门。 请查看我们的特性页面如果你想看到它能为你做什么。 同样,如果你在好奇我们如何开始和我们为什么存在,请参阅Shiro的历史和任务页面。

好吧。 现在让我们做点什么!

Shiro可以运行在任何环境中,从最简单的命令行应用程序最大的企业web和集群应用程序,但是我们将使用尽可能简单的例子一个简单的主要这种方法快速入门,这样你可以领略到API。

下载

  1. 确保您已经安装了JDK 1.5 +和Maven 2.2 +。
  2. 下载最新的“源代码分配”下载页面。 在这个例子中,我们使用1.1.0版本分布。
  3. 解压缩源包:
    > unzip shiro-root-1.2.0-source-release.zip
  4. 进入快速入门目录:
    > cd shiro-root-1.2.0/samples/quickstart
  5. 运行快速入门:
    > mvn compile exec:java

    这个目标就会打印出一些日志消息让你知道是怎么回事,然后退出。 而阅读本快速入门,随意看下发现的代码样品/快速入门/ src /主/ java / Quickstart.java。改变该文件并运行上面的mvn编译执行:java你喜欢的命令经常。

Quickstart.java

Quickstart.java以上文件引用包含所有的代码会让你熟悉的API。 现在可以将其分解这里块,所以你可以很容易地理解是怎么回事。

在几乎所有的环境中,您可以获得当前执行的用户通过以下电话:

Subject currentUser = SecurityUtils.getSubject();

使用securityutilsgetSubject(),我们可以获得当前执行的主题。一个主题只是一个用户应用程序的安全特定的“视图”。 我们其实想叫它“用户”因为“意义”,但我们决定反对:应用现有的api,已经太多了自己的用户类/框架,我们不想与人发生冲突。 同时,在安全的世界,这个词主题实际上是公认的术语。 好了,继续……

getSubject()在一个独立的应用程序可能会返回一个电话主题在一个基于用户数据特定于应用程序的位置,并在服务器环境(例如web应用程序),它获得的主题基于用户数据与当前线程或传入的请求。

现在,您已经有了一个主题,你可以用它来做什么?

如果你想让事情在当前会话用户可用的应用程序,你可以得到他们会话:

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

会话是Shiro-specific实例,提供了大部分与普通httpsession你习惯什么但和一些额外的好处区别:它不需要HTTP环境!

如果部署在一个web应用程序,默认情况下会话httpsession的基础。 但是,在一个非web环境中,像这样简单的快速入门,Shiro会自动使用其企业会话管理违约。 这意味着你可以在您的应用程序使用相同的API,在任何层,无论部署环境。 这将打开一个全新的世界的应用程序从任何应用程序需要会话不需要被迫使用httpsession或EJB有状态会话bean。 现在可以共享,任何客户机技术会话数据。

所以现在你可以获得主题和他们的会话。 那真的有用的东西检查他们是否允许做事情,喜欢对角色和权限检查吗?

好吧,我们只能做那些检查一个已知的用户。 我们的主题上面的实例代表当前用户,但当前用户吗? 好吧,他们是匿名的——也就是说,直到他们至少登录一次。 所以,让我们这样做:

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?}

有许多不同类型的异常,你可以检查,或把自己的Shiro可能不为自定义条件占。 看到AuthenticationExceptionJavadoc更多。

方便的提示
安全最佳实践是给通用用户登录失败的消息,因为你不想攻击者试图进入你的援助系统。

好吧,现在,我们有一个登录用户。 我们还能做什么?

让我们说他们是谁:

//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的核心在application-developer级别。 尽管有一些漂亮复杂的东西在引擎盖下面,使这项工作如此优雅,这就是它。

但是你可能会问自己,“但谁负责在登录(用户名和用户数据密码、角色和权限等),在运行时和那些实际上执行安全检查? “嗯,你做什么,通过实现Shiro所说的吗领域和堵塞领域Shiro的配置。

然而,如何配置一个领域在很大程度上是依赖于运行时环境。 例如,如果您运行一个独立的应用程序,或者如果你有一个基于web的应用程序,或一个春天JEE基于容器的应用程序,或组合。 这种类型的配置超出了这个范围快速入门,因为它的目的是让你熟悉的API和Shiro的概念。

当你准备跳的更多的细节,你一定会想要读的身份验证指南授权指南。 然后可以移动到其他文档,特别是参考手册回答其他问题。 你也会用户可能想加入邮件列表——你会发现我们有一个伟大的社会与人愿意帮助。

感谢以下。 我们希望你享受使用Apache Shiro !

0 0
原创粉丝点击