前言

欢迎来到Apache Shiro 10分钟之旅!

希望通过这个简单、快速的示例,可以让你对应用程序中使用Shiro有个深入的了解。嗯,10分钟你应该可以搞定它。

概述

Apache Shiro是什么?

Apache Shiro一个功能强大,使用简单的Java安全框架,它为开发人员提供一个直观而全面的认证,授权,加密及会话管理的解决方案。

实际上,Shiro的主要功能是管理应用程序中与安全相关的全部,同时尽可能支持多种实现方法。Shiro是建立在完善的接口驱动设计和面向对象原则之上的,支持各种自定义行为。Shiro提供的默认实现,使其能完成与其他安全框架同样的功能,这不也是我们一直努力想要得到的吗!

那么Apache Shiro能用来做什么呢?

很多,很多,嘿嘿。但是不在快速指南中做介绍,如果你想知道,那怎么办呢?去这里找寻你的答案吧。当然如果你还想知道我们什么时候,以及为什么要"创造"Shiro,去看看Shrio的历史和使命吧。

OK,现在让我们动手做点儿什么吧。

注:Shiro可以在任何环境下运行,小到最简单的命令行应用,大到大型的企业应用以及集群应用。但是我们准备在快速指南中使用最最简单的main方法的方式,让你对Shiro的API有个感官的认识。

下载

  1. 确保已经安装了JDK1.5+和Maven2.2+
  2. 这里下载最新已发布的源码。例子中我们使用1.1.0发布版本。
  3. 解压源代码
  4. 进入快速指南文件夹

    cd shiro-root-1.1.0/samples/quickstart

  5. 运行快速指南

    mvn compile exec:java

过程中会输出日志信息,用来告诉你正在进行的是什么,最后退出执行。可以在这里"samples/quickstart/src/main/java/Quickstart.java "找到源码,也可以进行修改,记得修改后运行"mvn compile exec:java "即可。

Quickstart.java

Quickstart.java中包含刚刚我们提到的所有内容(认证、授权等等),通过这个简单的示例可以让你轻松的熟悉Shiro的API。那么,让我们把Quickstart.java中的代码,一点一点剖析,这样便于理解它们的作用。 几乎所有的环境下,都可以通过这种方式获取当前用户:

Subject currentUser = SecurityUtils.getSubject();

通过SecurityUtils.getSubject(),就可以获取当前Subject。Subject是应用中用户的一个特定安全的缩影,虽然感觉上直接使用User会更贴切,但是实际上它的意义远远超过了User。而且每个应用程序都会有自己的用户以及框架,我们可不想和它们混淆在一起,况且Subject就是安全领域公认的名词。OK,我们继续。

在单应用系统中,调用getSubject()会返回一个Subject,它是位于应用程序中特定位置的用户信息;在服务器中运行的情况下(比如web应用),getSubject会返回一个位于当前线程或请求中的用户信息。 现在你已经得到了Subject对象,那么用它可以做什么呢?

如果你想得到应用中用户当前Session的其他参数,可以这样获取Session对象:

Session session = currentUser.getSession();

session.setAttribute( "someKey", "aValue" );

这个Session对象是Shiro中特有的对象,它和我们经常使用的HttpSession非常相似,但还提供了额外的东西,其中与HttpSession最大的不同就是Shiro中的Session不依赖HTTP环境(换句话说,可以在非HTTP 容器下运行)。

如果将Shiro部署在web应用程序中,那么这个Session就是基于HttpSession的。但是像QuickStart示例那样,在非web环境下使用,Shiro则默认使用EnterpriseSessionManagment。也就是说,不论在应用中的任何一层使用同样的API,却不需要考虑部署环境,这一优点为应用打开一个全新的世界,因为应用中要获取Session对象再也不用依赖于HttpSession或者EJB的会话Bean。而且任何客户端技术都可以共享session 数据。

现在你可以得到当前Subject和它的Session对象。那么我们如何验证比如角色和权限这些东西呢?

很简单,可以通过已得到的user对象进行验证。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?

}

可以捕获Shiro提供的各种异常,也可以抛出自定义类异常用于处理Shiro未考虑到的情况。预知详情,可以去了解AuthenticationException JavaDoc

提示:最安全的做法是将登录失败的消息告知用户,你总不会帮助攻击者入侵你的系统吧!

OK,现在已经拥有一个登录用户了,我们还能做点儿什么呢?

比方说,他们是谁:

//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开发应用的核心了,当然,Apache Shiro已将将很多复杂的东西封装在内部了,但是现在它就是这么简单。

你会有疑问吧,用户登录时,谁负责把用户信息(用户名、密码、角色、权限等)取出来,还有运行时,谁负责安全认证呢?当然由你决定了啊。通过将一个实现了Shiro中的Realm的Reaml配置到Shiro中即可。

至于如何配置很大程度上取决于你的运行时环境,比如在单应用、web应用、基于Spring或JEE 容器的应用或者组合模式中使用Shiro,配置都有所不同。如何配置已经超出QuickStart示例的范围,因为它的主要目的是帮助你熟悉Shiro的API和概念。

如果想进一步了解Shiro,可以看看Authentication GuideAuthorization Guide。也可以查看其他文档(特别是Reference Manual),这里可以解决你的各种疑问。

转自:http://www.turingbook.com/article/details/163


相关文章阅读及下载:

Shiro1.1.0开发配置文档

应用Shiro到Web Application

Apache Shiro 使用手册

10分钟教会你Apache Shiro

更多Apache Shiro文档,尽在开卷有益360  http://www.docin.com/book_360

转载于:https://www.cnblogs.com/ibook360/archive/2011/10/27/2226522.html

10分钟教会你Apache Shiro相关推荐

  1. 二、了解shiro架构 (10 Minute Tutorial on Apache Shiro)

    10 Minute Tutorial on Apache Shiro 教程: https://shiro.apache.org/10-minute-tutorial.html#overview 文档: ...

  2. 10分钟教会你看眼图,太有用了!!

    10分钟教会你看眼图,太有用了!!-面包板社区 ●搜寻了不少资料,如果追溯历史,大约47年前,眼图就已经开始广泛应用.在1962年-2002的40年间,眼图的测量方法是基于采样示波器的传统方法,200 ...

  3. 10分钟学会如何使用Shiro

    本篇内容大多总结自张开涛的<跟我学Shiro>原文地址:http://jinnianshilongnian.iteye.com/blog/2018936 我并没有全部看完,只是选择了一部分 ...

  4. mac 10.10 apache php,在Mac上10分钟搞定Apache服务器配置

    目的:创建一个专属的测试环境 一.Apache服务器使用最广的 Web 服务器 Mac自带Apache,只需要修改几个配置就可使用 有些特殊的服务器功能,Apache都能很好的支持 二.硬件要求 1. ...

  5. 10分钟教会你原生JS压缩图片,极其精简版

    1.实现思路 先通过input标签获取本地图片 把获取到的图片转换成base64格式 使用canvas中的API把图片分辨率调低(canvas只能处理base64格式的图片) 注:不懂base64的同 ...

  6. 思迈特软件Smartbi:10分钟教会你制作高难度的数据地图!

    在数据可视化中,地图可视化是高频应用的一种.我们在一些新闻报道和商业杂志上,会经常看到运用地图来分析展示商业现象,这样的利用地图来反映和分析数据的形式叫数据地图. 数据地图可以最直观的表达出数据之间的 ...

  7. 百度霸屏有效果吗?怎样实现百度霸屏?10分钟教会你

    这个世界,原本就不是一个你想象中的世界.也许你拿着3k的工资,却在做着给老板创造3w甚至更多的效益.也有的人天天不用认真干活,上班就是喝喝茶.吹吹牛,照样薪水比你高很多.还有的人,他们就是靠压榨你们的 ...

  8. Apache Shiro和Spring Security的详细对比

    参考资料: 1)Apache Shiro Apache Shiro:http://shiro.apache.org/ 在Web项目中应用 Apache Shiro:http://www.ibm.com ...

  9. 众至科技:漏洞通告 | 微软10月发布多个安全漏洞;Apache Shiro权限绕过漏洞;Apache Commons存在代码执行漏洞

    微软发布10月多个安全漏洞 1.漏洞概述 2022年10月11日,微软发布了10月安全更新,此次更新修复了包括2个0 day漏洞在内的84个安全漏洞(不包括10月3日修复的12个Microsoft   ...

最新文章

  1. c语言实现循环单链表
  2. 【嵌入式】C语言高级编程-可变参数宏(12)
  3. ubuntu 16.0.4如何配合网卡,
  4. Web Hacking 101 中文版 九、应用逻辑漏洞(三)
  5. 四款新旗舰即将发布:小米10和iPhone9领跑,价格惊喜
  6. 关于×××隧道技术在使用中的优势
  7. native2ascii.exe unicode
  8. 【BZOJ 4011】[HNOI2015]落忆枫音
  9. Java开发面试常见问题总结
  10. 计算机网卡的总线接口分类有,网卡的详细分类是怎样的?以太网卡有将高层数据转换为比特流的功能吗?...
  11. 解决Docker下载镜像速度太慢
  12. Microsoft Edge浏览器文件保存位置记录
  13. html表单按钮底部居中,Ant design StepsForm中如何使底部按钮居中
  14. 计算多列迭代次数的一种平均列近似方法
  15. 服务器如何验证jwt,使用JWT实现前后端权限验证
  16. python中的sort排序加换行_python中sort()排序的方法
  17. 群晖nas部署python项目
  18. 【阅读】阅读软件Calibre以及电子书下载地址
  19. linux 内存性能调优
  20. Spring Cloud Alibaba系列使用(二)----Nacos注册中心

热门文章

  1. android imageview图片旋转动画,Android 安卓动画 属性动画 - 旋转动画
  2. 使用AspectJ开发AOP更加便捷,你不知道嘛
  3. matlab瓶盖盖严检查,盖检机|瓶盖检测|外观检测设备|誉阵科技
  4. php框架 事件,php框架Minor5事件(附代码)
  5. pygame和python的区别_用Python和Pygame写游戏-从入门到精通(22)
  6. java in 绑定变量_ng-model绑定的变量在controller中为undefined
  7. Cannot find module 'less-bundle-promise'
  8. NYOJ 745 dp
  9. 作业2结对(升级版)
  10. SQL语句inner join,left join ,right join连接的不同之处