- 浏览: 759141 次
- 性别:
- 来自: 北京
最新评论
-
天台没有爱情:
Shiro视频教程分享网盘地址:https://pan.bai ...
Apache Shiro 使用手册(一)Shiro架构介绍 -
zhoubaicheng88:
推荐一套完整的Shiro Demo,免费的。Shiro介绍文档 ...
Apache Shiro 使用手册(一)Shiro架构介绍 -
zxsy007x:
我是用grails架构,有没有一起学习的加我qq1270858 ...
Apache Shiro 使用手册(一)Shiro架构介绍 -
FirstBlood:
看了文章写的非常好,最近也在看源码,看到底下发现日期是11年写 ...
Apache Shiro 使用手册(二)Shiro 认证 -
darren_nizna:
apache-shiro-1.2.x-reference ...
Apache Shiro 使用手册(一)Shiro架构介绍
认证就是验证用户身份的过程。在认证过程中,用户需要提交实体信息(Principals)和凭据信息(Credentials)以检验用户是否合法。最常见的“实体/凭证”组合便是“用户名/密码”组合。
一、Shiro认证过程
1、收集实体/凭据信息
但是,“已记住”和“已认证”是有区别的:
已记住的用户仅仅是非匿名用户,你可以通过subject.getPrincipals()获取用户信息。但是它并非是完全认证通过的用户,当你访问需要认证用户的功能时,你仍然需要重新提交认证信息。
这一区别可以参考亚马逊网站,网站会默认记住登录的用户,再次访问网站时,对于非敏感的页面功能,页面上会显示记住的用户信息,但是当你访问网站账户信息时仍然需要再次进行登录认证。
2、提交实体/凭据信息
3、认证处理
相反,如果login方法执行过程中抛出异常,那么将认为认证失败。Shiro有着丰富的层次鲜明的异常类来描述认证失败的原因,如代码示例。
二、登出操作
登出操作可以通过调用subject.logout()来删除你的登录信息,如:
三、认证内部处理机制
以上,是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的配置:
2、AuthenticationStrategy(认证策略)
当应用程序配置了多个Realm时,ModularRealmAuthenticator将根据认证策略来判断认证成功或是失败。
例如,如果只有一个Realm验证成功,而其他Realm验证失败,那么这次认证是否成功呢?如果大多数的Realm验证成功了,认证是否就认为成功呢?或者,一个Realm验证成功后,是否还需要判断其他Realm的结果?认证策略就是根据应用程序的需要对这些问题作出决断。
认证策略是一个无状态的组件,在认证过程中会经过4次的调用:
Shiro有3中认证策略的具体实现:
ModularRealmAuthenticator 内置的认证策略默认实现是AtLeastOneSuccessfulStrategy 方式,因为这种方式也是被广泛使用的一种认证策略。当然,你也可以通过配置文件定义你需要的策略,如:
3、Realm的顺序
由刚才提到的认证策略,可以看到Realm在ModularRealmAuthenticator 里面的顺序对认证是有影响的。
ModularRealmAuthenticator 会读取配置在SecurityManager里的Realm。当执行认证是,它会遍历Realm集合,对所有支持提交的token的Realm调用getAuthenticationInfo 。
因此,如果Realm的顺序对你使用的认证策略结果有影响,那么你应该在配置文件中明确定义Realm的顺序,如:
恩,确实如你所说,我前面理解错了,使用FirstSuccessfulStrategy策略后面的Realm的结果会被忽略,但授权认证方法仍然会被执行的。我Debug跟踪了一下,stategy确实已经变成了FirstSuccessfulStrategy。
非常感谢O(∩_∩)O哈!
web项目通常会将前后台设计为两个独立的应用。
你的项目整合在一起的话,你可以在自定义Realm中实现你的特殊需求,需求复杂的话可能会浪费部分性能。
或者你可以配置两个ShiroFilter,分别在前后台系统中使用。
非常感谢,给我提供了很好的思路。
我也试了试使用使用多个realms来处理这种问题【性能有所损耗】,并且尝试使用firstSuccessfulStrategy,采用spring的配置,但是发现配置不起作用,不知是什么地方配置的不对。
能否帮助看看,谢谢!
web项目通常会将前后台设计为两个独立的应用。
你的项目整合在一起的话,你可以在自定义Realm中实现你的特殊需求,需求复杂的话可能会浪费部分性能。
或者你可以配置两个ShiroFilter,分别在前后台系统中使用。
spring-side的mini-web你跑通了?
可以跑通
spring-side的mini-web你跑通了?
羡慕嫉妒恨吧。不过我是顶你的了
一、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被调用之后
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
评论
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。不得其解。
------------------------------------------------------------------
我的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:/";
}
@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中就不可以
我这步就有错,说是这个应用不可用。但是servlet里面创建可以执行,ssh中就不可以
15 楼
zhangleipd
2012-08-07
kdboy 写道
@zhangleipd:
使用FirstSuccessfulStrategy策略,尽管第一个成功后,后续的Realm的结果会被忽略,但是后续的每个Realm的授权认证方法仍然会被执行的。
你的配置看上去是没问题的。你检查一下log日志,有没有异常输出。
另外,你在每个自定义的Realm设置断点进行Debug,看看是否每个Realm都成功执行了。
使用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都成功执行了。
使用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 使用手册(五)Shiro 配置说明
2011-09-09 22:23 62690Apache Shiro的配置主要分为四部分: 对象和属性的 ... -
Apache Shiro 使用手册(四)Realm 实现
2011-09-09 22:03 58416在认证、授权内部实现机制中都有提到,最终处理都将交给Real进 ... -
Apache Shiro 使用手册(三)Shiro 授权
2011-08-23 20:50 94421授权即访问控制,它将判断用户在应用程序中对资源是否拥有相应的访 ... -
Apache Shiro 使用手册(一)Shiro架构介绍
2011-08-21 23:48 184651一、什么是Shiro Apache Shi ... -
基于Spring框架的Shiro配置
2011-06-24 15:20 91402一、在web.xml中添加shiro过滤器 <!-- ... -
Hibernate的List映射
2010-01-17 22:46 23765Answer类为Question类一对多关联关系,即一个问题对 ... -
JSTL笔记—c标签
2010-01-07 16:35 14827Taglib 伪指令 <%@ taglib ... -
Quartz与Spring的集成
2009-07-18 09:54 3614Quartz与Spring的集成 1、Scheduler入口 ... -
Spring Annotation 笔记——IOC篇
2009-07-02 18:58 20138@Autowired 1、Spring 通过一个 BeanPo ... -
代码规范的重要性
2009-06-12 22:33 27502代码规范比比皆是,但 ... -
LRU缓存算法实现
2009-05-31 10:16 2001import java.util.HashMap; im ... -
Struts常用标签使用介绍
2008-07-08 00:17 4929Struts提供了五个标签库,即:HTML、Bean、Logi ... -
ComponentOne WebChart的使用 - 1(概述)
2007-03-03 01:34 4863ComponentOne Studio Enterprise ... -
ComponentOne WebChart的使用 - 2(对象介绍)
2007-03-04 23:33 2964接下来的文章主要介绍如何使用代码设置实现 WebCha ... -
ComponentOne WebChart的使用 - 3(折线图)
2007-03-08 01:06 5120本篇文章将演示如 ... -
ComponentOne WebChart的使用 - 4(饼图)
2007-03-21 22:03 2819这次演示饼图制作,简单介绍饼图的样式效果及 PlotArea ... -
ComponentOne WebChart的使用 - 5(柱形图)
2007-05-07 16:05 4261系列最后一章,柱形图 ... -
Log4j使用总结
2008-06-28 01:24 72884一、介绍 Log4j是Apache的 ...
相关推荐
Apache Shiro中文版使用手册!
Apache Shiro使用手册 共22页.pdf
Apache Shiro使用手册.pdf 学习shiro 入门之用
Apache_Shiro_使用手册(一)Shiro架构介绍
Apache_Shiro_使用手册Apache_Shiro_使用手册Apache_Shiro_使用手册
Apache_Shiro参考手册中文版 Introduction to Apache Shiro What is Apache Shiro? Apache Shiro 是一个强大而灵活的开源安全框架,它干净利落地处理身份认证,授权,企业会话管理和加密。 Apache Shiro 的首要目标...
Shiro核心组件Aplication,Subject,SecurityManager, Realm, Authenticator, Authorizer. 介绍了Shiro认证,授权的实现及其机制原理。给了具体操作步骤及代码。
Apache Shiro 中文手册,想了解权限方面知识的小伙伴们下载吧。
Apache Shiro 开发使用手册,介绍了shiro的架构,认证,授权,实现,配置等,希望能够为大家使用shiro的时候带来帮助。
Apache_Shiro参考手册中文版,官方原版,pdf格式,方便查看,可复制!
ApacheShiro使用手册和Apache Shiro Reference Documentation 该文件下载了别人上传的两个文件,一个10分,一个30分,为了自己以后下载不花那么多分,也不让一些没有多少分的朋友能够下载,所以将别人资源下载后,将...
apache-shiro中文开发技术手册,很实用
shiro文档 java相关项目开发短信功能使用的jar包
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 ....
取代spring-security的东西,
Apache-Shiro-使用手册 Apache Shiro 是一个框架,可用于身份验证和授权。本文提供了几个示例用来展示如何在 Java™ 应用程序中使用 Shiro 并给出了如何在一个 Grails web 应用程序中使用它的概述。
Apache_Shiro参考手册中文版-converted
Apache_Shiro_使用手册(四)Realm_实现
授权即访问控制,它将判断用户在应用程序中对资源是否拥有相应的访问权限
认证就是验证用户身份的过程。在认证过程中,用户需要提交实体信息(Principals)和凭据信息(Credentials)以检验用户是否合法。最常见的“实体/凭证”组合便是“用户名/密码”组合