Apache Shiro系列三:10分钟入门

一、            介绍

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

二、            概述

关于Shiro的废话就不多说了,详情可以看http://www.cnblogs.com/strinkbug/p/6117353.html

Apache Shiro可以做什么?http://shiro.apache.org/features.html

答案是很多,但是在这里我们就不展开说了,如果对这个有兴趣,可以去看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是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);
}

就这样,简单的不能再简单了。

但是如果登录失败了怎么办?你可以通过捕获异常来准确了解到底发生了什么错误,然后针对性的做一些处理。

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

你可以检测很多种不同类型的异常,或者你也可以抛出自己的异常。可以 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以及相关的一些概念。

在你继续了解其他细节之前,你可能更想先去阅读一下用户验证向导(http://shiro.apache.org/java-authentication-guide.html)和用户授权向导(http://shiro.apache.org/java-authorization-guide.html),然后在继续阅读其他的文档,特别是参考手册(http://shiro.apache.org/reference.html)。

英文原文地址:http://shiro.apache.org/10-minute-tutorial.html

时间: 2024-10-03 13:38:53

Apache Shiro系列三:10分钟入门的相关文章

Apache Shiro系列四:Shiro的架构

Shiro的设计目标就是让应用程序的安全管理更简单.更直观. 软件系统一般是基于用户故事来做设计.也就是我们会基于一个客户如何与这个软件系统交互来设计用户界面和服务接口.比如,你可能会说:“如果用户登录了我们的系统,我就给他们显示一个按钮,点击之后可以查看他自己的账户信息.如果没有登录,我就给他显示一个注册按钮.” 上述应用程序在很大程度上是为了满足用户的需求而编写的,即便这个“用户”不是人,而是一个其他的软件系统.你仍然是按照谁当前正在与你的系统交互的逻辑来编写你的逻辑代码. Shiro的设计

Apache Shiro系列之五:配置

Shiro设计的初衷就是可以运行于任何环境:无论是简单的命令行应用程序还是复杂的企业集群应用.由于运行环境的多样性,所以有多种配置机制可用于配置,本节我们将介绍Shiro内核支持的这几种配置机制. 小贴士:多种配置方案: Shiro的SecurityManager是和JavaBean兼容的,所以我们可以使用诸如Java.Xml(Spring.Jboss.Guice等).YAML.Json.Groovy等配置方式.   一.基于Java代码的配置 最简单的创建并且使用SecurityManager

Maven学习系列一5分钟入门教程

Maven是基于项目对象模型的一个Apache开源项目.Maven的主要配置文件pom.xml就是项目模型的意思(Project Oriented Model),它是Apache Ant的衍生扩展. 安装 Maven是一个Java工具,所以你必须首先安装Java所需运行环境. 1.解压apache-maven-3.2.1-bin.zip到你想要安装maven的目录,例如,我解压文件到D:\apache-maven-3.2.1. 2.添加M2_HOME环境变量,(WinKey+Pause)快捷键调

Apache Kafka系列(三) Java API使用

Apache Kafka系列(一) 起步 Apache Kafka系列(二) 命令行工具(CLI) Apache Kafka系列(三) Java API使用 摘要: Apache Kafka Java Client API 一.基本概念 Kafka集成了Producer/Consumer连接Broker的客户端工具,但是在消息处理方面,这两者主要用于服务端(Broker)的简单操作,如: 1.创建Topic 2.罗列出已存在的Topic 3.对已有Topic的Produce/Consume测试

10分钟入门opengl投影变换推导(内含mathjax公式)

*/ pre code { display: block; padding: 0.5em; color: #333; background: #f8f8ff } pre .comment, pre .template_comment, pre .diff .header, pre .javadoc { color: #998; font-style: italic } pre .keyword, pre .css .rule .keyword, pre .winutils, pre .javas

10分钟入门微信小程序开发:从环境搭建到开发出第一个程序。

小程序简介 小程序是一种不需要下载安装即可使用的快速应用,它实现了应用“触手可及”的操作:用户扫一扫或搜一下即可打开应用,完全不需要安装,因此小程序不仅可提高的用户的应用体验,也方便应用的传扩散. 本文带大家快速入门小程开发,了解从环境搭建到开发出一个简单hello world程序,从而上手小程序开发,让你快速成功小程序开发人员.之后,想开发什么样的小程序,就可以自己研究和努力了. 下面,是循序渐经的步骤: ?1.注册小程序 在开发之前,当然需要先注册一个小程序账号. 进入“微信公众平台”进行注

Apache Shiro系列(1)

Apache Shiro是啥呢,安全框架. 360百科是这么描述的:        Apache Shiro(日语"堡垒(Castle)"的意思)是一个强大易用的Java安全框架,提供了认证.授权.加密和会话管理功能,可为任何应用提供安全保障 - 从命令行应用.移动应用到大型网络及企业应用. Shiro为解决下列问题(我喜欢称它们为应用安全的四要素)提供了保护应用的API: 认证 - 用户身份识别,常被称为用户"登录"; 授权 - 访问控制; 密码加密 - 保护或隐

Pandas 10分钟入门----缺失数据的处理(官方文档注释版三)

在日常我们获取的数据中,经常会出现数据缺失的情况.对数据缺失的处理,有多种处理的方法:插值填补.平均值填补方法很多.这里不具体讨论用哪种方式去插补这些数据,而只是谈谈如何使用pandas去快速的处理这些数据. pandas 常用np.nan代表缺失数据,详情可以查看Missing Data section. 1. reindex()可以允许你在指定维度上修改.增加.删除索引,并返回数据的副本: df1 = df.reindex(index=dates[0:4], columns=list(df.

Apache POI系列教程之一:poi入门教程

一 POI简介 Apache POI是Apache软件基金会的开放源码函式库,POI提供API给Java程序对Microsoft Office格式档案读和写的功能.自2009-09-28后,推出了3.5版本,提供了对Office2007的支持: POI支持Excel.Word等等,详细看官方文档下图中部分:点击打开链接 二 基础定义的东西没有必要写了 2.1 poi入门:点击打开链接  2.2   poi3.8组件研究1-9系列:点击打开链接  推荐 2.3 poi要理清组件(HSSF,XSSF