`
kdboy
  • 浏览: 761202 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Apache Shiro 使用手册(二)Shiro 认证

阅读更多
认证就是验证用户身份的过程。在认证过程中,用户需要提交实体信息(Principals)和凭据信息(Credentials)以检验用户是否合法。最常见的“实体/凭证”组合便是“用户名/密码”组合。

一、Shiro认证过程

1、收集实体/凭据信息
//Example using most common scenario of username/password pair:
UsernamePasswordToken token = new UsernamePasswordToken(username, password);
//”Remember Me” built-in:
token.setRememberMe(true);
UsernamePasswordToken支持最常见的用户名/密码的认证机制。同时,由于它实现了RememberMeAuthenticationToken接口,我们可以通过令牌设置“记住我”的功能。
但是,“已记住”和“已认证”是有区别的:
已记住的用户仅仅是非匿名用户,你可以通过subject.getPrincipals()获取用户信息。但是它并非是完全认证通过的用户,当你访问需要认证用户的功能时,你仍然需要重新提交认证信息。
这一区别可以参考亚马逊网站,网站会默认记住登录的用户,再次访问网站时,对于非敏感的页面功能,页面上会显示记住的用户信息,但是当你访问网站账户信息时仍然需要再次进行登录认证。

2、提交实体/凭据信息
Subject currentUser = SecurityUtils.getSubject();
currentUser.login(token);
收集了实体/凭据信息之后,我们可以通过SecurityUtils工具类,获取当前的用户,然后通过调用login方法提交认证。

3、认证处理
try {
    currentUser.login(token);
} catch ( UnknownAccountException uae ) { ...
} catch ( IncorrectCredentialsException ice ) { ...
} catch ( LockedAccountException lae ) { ...
} catch ( ExcessiveAttemptsException eae ) { ...
} ... catch your own ...
} catch ( AuthenticationException ae ) {
    //unexpected error?
}
如果login方法执行完毕且没有抛出任何异常信息,那么便认为用户认证通过。之后在应用程序任意地方调用SecurityUtils.getSubject() 都可以获取到当前认证通过的用户实例,使用subject.isAuthenticated()判断用户是否已验证都将返回true.
相反,如果login方法执行过程中抛出异常,那么将认为认证失败。Shiro有着丰富的层次鲜明的异常类来描述认证失败的原因,如代码示例。

二、登出操作
登出操作可以通过调用subject.logout()来删除你的登录信息,如:
currentUser.logout(); //removes all identifying information and invalidates their session too.
当执行完登出操作后,Session信息将被清空,subject将被视作为匿名用户。

三、认证内部处理机制
以上,是Shiro认证在应用程序中的处理过程,下面将详细解说Shiro认证的内部处理机制。


如上图,我们通过Shiro架构图的认证部分,来说明Shiro认证内部的处理顺序:
1、应用程序构建了一个终端用户认证信息的AuthenticationToken 实例后,调用Subject.login方法。
2、Sbuject的实例通常是DelegatingSubject类(或子类)的实例对象,在认证开始时,会委托应用程序设置的securityManager实例调用securityManager.login(token)方法。
3、SecurityManager接受到token(令牌)信息后会委托内置的Authenticator的实例(通常都是ModularRealmAuthenticator类的实例)调用authenticator.authenticate(token). ModularRealmAuthenticator在认证过程中会对设置的一个或多个Realm实例进行适配,它实际上为Shiro提供了一个可拔插的认证机制。
4、如果在应用程序中配置了多个Realm,ModularRealmAuthenticator会根据配置的AuthenticationStrategy(认证策略)来进行多Realm的认证过程。在Realm被调用后,AuthenticationStrategy将对每一个Realm的结果作出响应。
注:如果应用程序中仅配置了一个Realm,Realm将被直接调用而无需再配置认证策略。
5、判断每一个Realm是否支持提交的token,如果支持,Realm将调用getAuthenticationInfo(token); getAuthenticationInfo 方法就是实际认证处理,我们通过覆盖Realm的doGetAuthenticationInfo方法来编写我们自定义的认证处理。

四、使用多个Realm的处理机制:

1、Authenticator
默认实现是ModularRealmAuthenticator,它既支持单一Realm也支持多个Realm。如果仅配置了一个Realm,ModularRealmAuthenticator 会直接调用该Realm处理认证信息,如果配置了多个Realm,它会根据认证策略来适配Realm,找到合适的Realm执行认证信息。
自定义Authenticator的配置:
[main]
...
authenticator = com.foo.bar.CustomAuthenticator
securityManager.authenticator = $authenticator

2、AuthenticationStrategy(认证策略)
当应用程序配置了多个Realm时,ModularRealmAuthenticator将根据认证策略来判断认证成功或是失败。
例如,如果只有一个Realm验证成功,而其他Realm验证失败,那么这次认证是否成功呢?如果大多数的Realm验证成功了,认证是否就认为成功呢?或者,一个Realm验证成功后,是否还需要判断其他Realm的结果?认证策略就是根据应用程序的需要对这些问题作出决断。
认证策略是一个无状态的组件,在认证过程中会经过4次的调用:
  • 在所有Realm被调用之前
  • 在调用Realm的getAuthenticationInfo 方法之前
  • 在调用Realm的getAuthenticationInfo 方法之后
  • 在所有Realm被调用之后
认证策略的另外一项工作就是聚合所有Realm的结果信息封装至一个AuthenticationInfo实例中,并将此信息返回,以此作为Subject的身份信息。
Shiro有3中认证策略的具体实现:
AtLeastOneSuccessfulStrategy只要有一个(或更多)的Realm验证成功,那么认证将被视为成功
FirstSuccessfulStrategy第一个Realm验证成功,整体认证将被视为成功,且后续Realm将被忽略
AllSuccessfulStrategy所有Realm成功,认证才视为成功

ModularRealmAuthenticator 内置的认证策略默认实现是AtLeastOneSuccessfulStrategy 方式,因为这种方式也是被广泛使用的一种认证策略。当然,你也可以通过配置文件定义你需要的策略,如:
[main]
...
authcStrategy = org.apache.shiro.authc.pam.FirstSuccessfulStrategy
securityManager.authenticator.authenticationStrategy = $authcStrategy
...

3、Realm的顺序
由刚才提到的认证策略,可以看到Realm在ModularRealmAuthenticator 里面的顺序对认证是有影响的。
ModularRealmAuthenticator 会读取配置在SecurityManager里的Realm。当执行认证是,它会遍历Realm集合,对所有支持提交的token的Realm调用getAuthenticationInfo 。
因此,如果Realm的顺序对你使用的认证策略结果有影响,那么你应该在配置文件中明确定义Realm的顺序,如:
blahRealm = com.company.blah.Realm
...
fooRealm = com.company.foo.Realm
...
barRealm = com.company.another.Realm

securityManager.realms = $fooRealm, $barRealm, $blahRealm
  • 大小: 88.4 KB
28
10
分享到:
评论
20 楼 FirstBlood 2016-11-14  
看了文章写的非常好,最近也在看源码,看到底下发现日期是11年写的,瞬间感觉自己又变成渣了。
19 楼 mu_xiaoxia 2015-08-21  
如果login方法执行完毕且没有抛出任何异常信息,那么便认为用户认证通过。之后在应用程序任意地方调用SecurityUtils.getSubject() 都可以获取到当前认证通过的用户实例,使用subject.isAuthenticated()判断用户是否已验证都将返回true.
------------------------------------------------------------------
我的login方法执行完毕且没有抛出任何异常信息,用户认证通过。可是,可是我在登录成功跳转首页的拦截器中的preHandle()中SecurityUtils.getSubject()获取到当前认证通过对用户实例subject.isAuthenticated()判断用户是否已验证返回false。不得其解。
18 楼 非法用户 2013-08-27  
学习中
17 楼 endual 2013-04-15  
我的logout 不会跳出项目啊,哪里错了?菜鸟问问。

@RequestMapping(value = "/logout")
public String logout()
{
Subject currentUser = SecurityUtils.getSubject();
if (currentUser != null)
{
currentUser.logout();
}
return "redirect:/";
}
16 楼 chentianyi02 2012-12-18  
Subject currentUser = SecurityUtils.getSubject();
我这步就有错,说是这个应用不可用。但是servlet里面创建可以执行,ssh中就不可以
15 楼 zhangleipd 2012-08-07  
kdboy 写道
@zhangleipd:
使用FirstSuccessfulStrategy策略,尽管第一个成功后,后续的Realm的结果会被忽略,但是后续的每个Realm的授权认证方法仍然会被执行的。

你的配置看上去是没问题的。你检查一下log日志,有没有异常输出。
另外,你在每个自定义的Realm设置断点进行Debug,看看是否每个Realm都成功执行了。


恩,确实如你所说,我前面理解错了,使用FirstSuccessfulStrategy策略后面的Realm的结果会被忽略,但授权认证方法仍然会被执行的。我Debug跟踪了一下,stategy确实已经变成了FirstSuccessfulStrategy。
非常感谢O(∩_∩)O哈!
14 楼 kdboy 2012-08-07  
@zhangleipd:
使用FirstSuccessfulStrategy策略,尽管第一个成功后,后续的Realm的结果会被忽略,但是后续的每个Realm的授权认证方法仍然会被执行的。

你的配置看上去是没问题的。你检查一下log日志,有没有异常输出。
另外,你在每个自定义的Realm设置断点进行Debug,看看是否每个Realm都成功执行了。
13 楼 zhangleipd 2012-08-07  
kdboy 写道
zhangleipd 写道
我自己写项目使用shiro试了试,碰到一种场景: 后台管理系统需要用户的登陆,前台系统需要会员的登陆,也就是说一个web app中需要访问两种表去验证用户提交信息,这种情况应当怎样去设计?

web项目通常会将前后台设计为两个独立的应用。
你的项目整合在一起的话,你可以在自定义Realm中实现你的特殊需求,需求复杂的话可能会浪费部分性能。
或者你可以配置两个ShiroFilter,分别在前后台系统中使用。

非常感谢,给我提供了很好的思路。

我也试了试使用使用多个realms来处理这种问题【性能有所损耗】,并且尝试使用firstSuccessfulStrategy,采用spring的配置,但是发现配置不起作用,不知是什么地方配置的不对。
	<bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
		
	<property name="authenticator" ref="modularRealmAuthenticator"></property>
		<property name="realms">
			<list>
				<ref bean="memberRealm"/>
				<ref bean="moniterRealm"/>
			</list>
		</property>
		
		<property name="cacheManager" ref="shiroCacheManager"/>
		
		<property name="sessionMode" value="native"/>
		<property name="sessionManager" ref="sessionManager"/>
	</bean>
	
	<bean id="modularRealmAuthenticator" class="org.apache.shiro.authc.pam.ModularRealmAuthenticator">
		<property name="authenticationStrategy" ref="firstSuccessfulStrategy"></property>
	</bean>
	
	<bean id="firstSuccessfulStrategy" class="org.apache.shiro.authc.pam.FirstSuccessfulStrategy" />


能否帮助看看,谢谢!
12 楼 kdboy 2012-08-06  
zhangleipd 写道
我自己写项目使用shiro试了试,碰到一种场景: 后台管理系统需要用户的登陆,前台系统需要会员的登陆,也就是说一个web app中需要访问两种表去验证用户提交信息,这种情况应当怎样去设计?

web项目通常会将前后台设计为两个独立的应用。
你的项目整合在一起的话,你可以在自定义Realm中实现你的特殊需求,需求复杂的话可能会浪费部分性能。
或者你可以配置两个ShiroFilter,分别在前后台系统中使用。
11 楼 zhangleipd 2012-08-06  
我自己写项目使用shiro试了试,碰到一种场景: 后台管理系统需要用户的登陆,前台系统需要会员的登陆,也就是说一个web app中需要访问两种表去验证用户提交信息,这种情况应当怎样去设计?

10 楼 wenjinglian 2012-06-02  
jarorwar 写道
holysky 写道
看springside 的mini -web就可以了!

spring-side的mini-web你跑通了?


可以跑通
9 楼 jarorwar 2012-03-29  
holysky 写道
看springside 的mini -web就可以了!

spring-side的mini-web你跑通了?
8 楼 holysky 2012-03-28  
看springside 的mini -web就可以了!
7 楼 solomon 2012-03-09  
有没有一个实例,包括从前端到后台数据库配置的。
6 楼 hohofd 2012-01-30  
云里雾里
5 楼 jarorwar 2011-10-13  
ivan18248 写道
这些人为什么踩啊?最起码说个理由吧。

羡慕嫉妒恨吧。不过我是顶你的了
4 楼 liancl 2011-09-27  
好文章,非常需要
3 楼 johnjmx 2011-09-07  
这个具体怎么配置啊?
2 楼 wei8424779 2011-09-01  
好文章 正需要~谢谢分享~
1 楼 ivan18248 2011-08-24  
这些人为什么踩啊?最起码说个理由吧。

相关推荐

    Apache_Shiro参考手册中文版.zip

    Apache_Shiro参考手册中文版 Introduction to Apache Shiro What is Apache Shiro? Apache Shiro 是一个强大而灵活的开源安全框架,它干净利落地处理身份认证,授权,企业会话管理和加密。 Apache Shiro 的首要目标...

    Apache_Shiro_使用手册(一)Shiro架构介绍

    ### Apache Shiro 使用手册(一)Shiro架构介绍 #### 一、Shiro简介 Apache Shiro 是一款功能强大且易于使用的 Java 安全框架,它提供了多种安全相关的功能和服务,包括但不限于认证、授权、加密和会话管理。相较...

    Apache Shiro使用手册 共22页.pdf

    Apache Shiro 使用手册 Apache Shiro 是一个强大易用的 Java 安全框架,提供了认证、授权、加密和会话管理等功能。Shiro 的架构主要包括三个核心组件:Subject、SecurityManager 和 Realm。 1. 认证...

    Apache Shiro中文版使用手册

    ### Apache Shiro 使用手册知识点详解 #### 一、Apache Shiro 概述 **1.1 什么是 Apache Shiro** Apache Shiro 是一款强大的 Java 安全框架,它集成了认证、授权、加密和会话管理等功能。这些功能使得 Shiro 成为...

    Apache Shiro 使用手册(二) Shiro 认证

    一、Shiro认证过程 1、收集实体/凭据信息 代码如下://Example using most common scenario of username/password pair:UsernamePasswordToken token = new UsernamePasswordToken(username, password);//”...

    Apache_Shiro参考手册中文版_shiro_

    通过阅读《Apache Shiro参考手册中文版》PDF,你可以深入了解每个功能的详细用法,包括如何配置Shiro,如何创建自定义的 Realm,以及如何在代码中使用Subject、Session和Cache等核心概念。手册还会涵盖实际案例和...

    Apache Shiro 中文手册

    这份"Apache Shiro 中文手册"将帮助你深入理解和掌握Shiro的核心概念与使用方法。 1. **认证**:认证是验证用户身份的过程。在Shiro中,你可以自定义实现认证逻辑,或者使用内置的Realm(领域)来连接数据库或其他...

    Apache_Shiro_使用手册.docx

    Apache Shiro 是一个轻量级的 Java 安全框架,主要负责处理认证、授权、加密和会话管理等核心安全任务。它的设计简洁且易于使用,使得开发人员能够快速集成安全功能到各种类型的应用程序中。 Shiro 的核心组件包括 ...

    Apache Shiro 使用手册

    Shiro核心组件Aplication,Subject,SecurityManager, Realm, Authenticator, Authorizer. 介绍了Shiro认证,授权的实现及其机制原理。给了具体操作步骤及代码。

    Apache_Shiro_使用手册

    Apache Shiro 是一个轻量级的 Java 安全框架,主要负责处理认证、授权、加密和会话管理等核心安全任务。它旨在简化应用程序的安全实现,对比其他如 Spring Security 的框架,Shiro 更加易于理解和使用。 **认证过程...

    Apache-shiro使用手册

    ### Apache Shiro 使用手册知识点详解 #### 一、Shiro简介 - **定义**:Apache Shiro 是一款强大且易于使用的 Java 安全框架,它提供了包括认证、授权、密码加密和会话管理在内的多种安全服务功能。 - **特点**: ...

    Apache_Shiro参考手册中文版

    要开始使用Shiro,首先需要确保Java环境至少为Java 1.5版本,使用Apache Maven作为构建工具。对于本教程,至少需要Maven 2.2.1版本。接下来,通过在文件系统中创建一个新的目录,并保存一个Maven的pom.xml文件,从而...

    Apache Shiro 开发使用手册

    Apache Shiro 是一个轻量级且易于使用的 Java 安全框架,它专注于提供认证、授权、加密和会话管理功能,适用于多种类型的Java应用程序。Shiro 的设计目标是简化安全管理的实现,使得开发者能更专注于业务逻辑,而...

    ApacheShiro使用手册和Apache Shiro Reference Documentation

    ApacheShiro使用手册和Apache Shiro Reference Documentation 该文件下载了别人上传的两个文件,一个10分,一个30分,为了自己以后下载不花那么多分,也不让一些没有多少分的朋友能够下载,所以将别人资源下载后,将...

    apache-shiro-1.2.x-reference:《 Apache Shiro参考手册》(http

    apache-shiro-reference《Apache Shiro 参考手册》 Chinese translation of and the other article collection. The laset version of Apache Shiro is 1.5.x. You can also see the demos of the reference at ....

    Apache_Shiro&参考手册中文版&-converted.zip

    这个"Apache_Shiro参考手册中文版-converted.zip"文件包含了一个转换后的中文版Apache Shiro参考手册,方便中国开发者学习和理解Shiro的使用方法。 **一、认证(Authentication)** 在Shiro中,认证是指验证用户...

    Apache-Shiro-使用手册

    Apache-Shiro-使用手册 Apache Shiro 是一个框架,可用于身份验证和授权。本文提供了几个示例用来展示如何在 Java™ 应用程序中使用 Shiro 并给出了如何在一个 Grails web 应用程序中使用它的概述。

    Apache Shiro 使用手册(三) Shiro授权

    Apache Shiro 是一款强大的安全管理框架,它提供了身份验证(Authentication)、授权(Authorization)和会话管理(Session Management)等功能。本篇文章将详细讲解 Shiro 的授权机制,即如何控制用户在应用程序中...

Global site tag (gtag.js) - Google Analytics