一、介绍

看完这个10分钟入门之后,你就知道如何在你的应用程序中引入和使用Shiro。以后你再在自己的应用程序中使用Shiro,也应该可以在10分钟内搞定。

二、概述

关于Shiro的废话就不多说了,详情可以看本系列第一篇博文:Apache Shiro系列一:初识

Apache Shiro可以做什么?

答案是很多,但是在这里我们就不展开说了,如果对这个有兴趣,可以去看Shiro的特性

三、下载

1)确保安装了1.6及其以上版本的JDK,以及3.0.3以上版本的maven;

2)Download 页面下载最新版本的”Source Code Distribution”,我们下面的例子将使用1.3.2版本;

3)解压;

4)进入到quickstart目录;

$ cd shiro-root-1.3.2/samples/quickstart

5)运行quickstart;

$ mvn compile exec:java

在看本入门文档的过程中,可以打开源文件samples/quickstart/src/main/java/Quickstart.java,并且随意修改以测试你的想法。

四、QuickStart.java

下面我们来分解说明Quickstart.java内的源码以便你可以更好的理解。

在任何环境下你都可以通过如下代码来获取当前登录的用户。

Subject currentUser =SecurityUtils.getSubject();

所谓Subject其实就是其他系统中的User,这里只是换一个说法,因为能够登录系统的不仅仅是人,还有其他系统。

如果是在一个独立的应用程序中调用getSubject(),我们会得到一个应用程序本地登录的用户信息,如果是一个web应用,则会得到一个和当前线程或者当前的session相关的用户。

不管怎么样,现在你得到了一个用户了,接下来可以做什么呢?

如果你想要让某些数据在当前用户登录会话期间内一直有效,则可以像下面这么做:

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

我们可以把这个Session当成是HttpSession在Shiro中的特殊实现,他和HttpSession有着相似的接口,大家用起来不会陌生。但是他还有一个额外的好处:不依赖于HTTP的上下文环境。这样你就可以在一个非web应用(比如类似于本例子的命令行程序)中使用Session了。

如果是在一个Web应用程序中使用Session,则返回的Session是一种基于HttpSession的实现;而如果是在一个非web环境下使用,则默认使用的是Enterprise Session。不管怎么样,这意味着我们不用理会应用程序的部署环境,总是使用相同的API来操作session,带来一致的用户体验。现在,web应用和非web应用可以共享session数据了。

到目前为止,我们得到了一个Subject以及他的Session,现在我们用它们来做点有实际意义的事情怎么样,比如检查一下这个用户是否有权限做某件事情?

我们可以为一个已知的用户做这些检查。我们上文中的Subject代表着当前用户,但是截至目前来说,谁是当前用户呢?在真正登录之前,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 =newUsernamePasswordToken("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 ){
9 //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?
}
  你可以检测很多种不同类型的异常,或者你也可以抛出自己的异常。可以 AuthenticationException JavaDoc去了解更多。
 
小提示:
    安全领域的最佳实践是,在发生错误的时候,只给出一些通用性的错误提示。如果提示信息太详细,可能会一不小心泄漏了一些中心信息给攻击我们的黑客了。
 
  好了,到目前为止,我们有了一个已经登录的用户,然后我们还可以做些什么呢?
  比如我们可以打印一些信息来说明我们是谁:
//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,了解以上这些API也就差不都了。虽然在这些优雅的代码下面隐藏了一些复杂的实现。但是对于使用者来说,真的这样就够了。
 
  不过你可能会问你自己:“在用户登录的时候,谁来负责获取用户相关的数据呢(比如用户名、密码、角色、权限等),并且在运行时谁来真正的执行这些安全检查?”,我只能说,是你是你都是你,你要实现一种自Shiro中曾作Realm的接口,并且把它继承到Shiro的配置中。
 
  但是,如何配置Realm主要和你的运行时环境有关。比如,你可能运行的是一个独立的应用、或者而是一个web应用、或者是一个依赖于spring或者JEE容器的的应用,或者是以上几种类型的组合。对于一个10分钟入门来说,以上的这些配置都太复杂了,本节的主要目的是带你熟悉一下Shiro的API以及相关的一些概念。
 
  在你继续了解其他细节之前,你可能更想先去阅读一下 用户验证向导 和 用户授权向导,然后在继续阅读其他的文档,特别是 参考手册
 
 
 
 

Apache Shiro系列三,概述 —— 10分钟入门的更多相关文章

  1. Apache Shiro系列之五,概述 —— 配置

    Shiro设计的初衷就是可以运行于任何环境:无论是简单的命令行应用程序还是复杂的企业集群应用.由于运行环境的多样性,所以有多种配置机制可用于配置,本节我们将介绍Shiro内核支持的这几种配置机制.   ...

  2. Apache Shiro系列四,概述 —— Shiro的架构

    Shiro的设计目标就是让应用程序的安全管理更简单.更直观.     软件系统一般是基于用户故事来做设计.也就是我们会基于一个客户如何与这个软件系统交互来设计用户界面和服务接口.比如,你可能会说:“如 ...

  3. kafka原理和实践(一)原理:10分钟入门

    系列目录 kafka原理和实践(一)原理:10分钟入门 kafka原理和实践(二)spring-kafka简单实践 kafka原理和实践(三)spring-kafka生产者源码 kafka原理和实践( ...

  4. JavaScript 10分钟入门

    JavaScript 10分钟入门 随着公司内部技术分享(JS进阶)投票的失利,先译一篇不错的JS入门博文,方便不太了解JS的童鞋快速学习和掌握这门神奇的语言. 以下为译文,原文地址:http://w ...

  5. Markdown - Typora 10分钟入门 - 精简归纳

    Markdown - Typora 10分钟入门 - 精简归纳 JERRY_Z. ~ 2020 / 8 / 22 转载请注明出处! 目录 Markdown - Typora 10分钟入门 - 精简归纳 ...

  6. Apache Shiro系列一,概述 —— 初识

    一.什么是Shiro Apache Shiro是一个强大.灵活.开源的安全框架,它支持用户认证.权限控制.企业会话管理以及加密等. Apache Shiro的第一个也是最重要的一个目标就是易于使用和理 ...

  7. Apache Shiro系列教程之二:十分钟上手Shiro

    在本教程中,我们会写一个简单的.仅仅输出一些内容命令行程序,从而对Shiro有一个大体的感觉. 一.准备工作 本教程需要Java1.5+,并且我们用Maven生成项目,当然Maven不是必须的,你也可 ...

  8. [入门到吐槽系列] Webix 10分钟入门 一 管理后台制作

    前言 本人是服务端程序员,同时需要兼职前端开发.常用的就是原生态的HTML.Javascript,也用过ExtJS.Layui.可是ExtJS变公司后非常难用.Layui上手还行,用过一段时间,会觉得 ...

  9. [入门到吐槽系列] Webix 10分钟入门 二 表单Form的使用

    前言 继续接着上一篇的webix入门:https://www.cnblogs.com/zc22/p/15912342.html.今天完成剩下两个最重要的控件,表单和表格的使用.掌握了这两个,整个Web ...

随机推荐

  1. wampserver安装配置

    按步骤安装--选择指定浏览器-安装成功后显示绿色图标: 打开浏览器:将文件夹移入wampserver安装路径的www文件夹中:找到电脑IP 在手机端访问 IP/文件夹/demo.html即可

  2. 一点惊喜 --- alert()函数

    在JavaScript代码中,可以使用window对象的alert()函数来显示一段文本,从而进行程序的调试,或者向用户警示相关信息: window.alert("sample text&q ...

  3. ArcGIS中的VBA修复

    一直以来,ArcGIS10.1 的VBA安装后,菜单栏里也没相关菜单,听说是许可的问题,直到遇到这个问题才知道真正的原因. 由于项目需要使用了ArcGIS10.0, 不知道操作了什么,打开ArcMap ...

  4. Android开发6:Service的使用(简单音乐播放器的实现)

    前言 啦啦啦~各位好久不见啦~博主最近比较忙,而且最近一次实验也是刚刚结束~ 好了不废话了,直接进入我们这次的内容~ 在这篇博文里我们将学习Service(服务)的相关知识,学会使用 Service ...

  5. [转]Android应用程序框架思路整理

    一.一般Android应用程序架构(Book,购彩,Market). 普通的应用程序由于只需要用到Android的联网与显示的功能,所以应用程序大体上是呈现为UI(Activities)与网络(Net ...

  6. iOS面试题总结(一)

    面试题总结 1.#import 跟#include.@class有什么区别?#import<> 跟 #import""又什么区别? include和#import都能完 ...

  7. 安装gem所需知道的

    1 在中国rubygem源被墙了,所以不管是gem install 还是bundle install都需要修改默认的源,淘宝和ruby-china都提供了源. gem source -r http:/ ...

  8. 项目管理过程组和知识领域表(PMBOK2008)

    项目管理过程组和知识领域表(PMBOK2008) 知识领域 项目管理过程组 启动过程组 规划过程组 执行过程组 监控过程组 收尾过程组  4. 项目整合管理 4.1 制定项目章程 4.2 制定项目管理 ...

  9. Symantec Backup Exec Remote Agent 2010在Redhat Enterprise 6.6上启动问题

    在Red Hat Enterprise Linux Server release 6.6 (Santiago)上安装了Symantec Backup Exec Remote Agent 2010后,启 ...

  10. SQL Server 2008 R2——TRUNCATE TABLE 无法截断表 该表正由 FOREIGN KEY 约束引用

    =================================版权声明================================= 版权声明:原创文章 禁止转载  请通过右侧公告中的“联系邮 ...