`

apache-shiro杂记(二) 关于多realm认证的策略

阅读更多
一直以为给定的下面配置是短路方式的,即defaultJdbcRealm可以成功认证,backDoorJdbcRealm就不会被调用。
其实不然,org.apache.shiro.authc.pam.FirstSuccessfulStrategy并不是这个意思,所有的realm依然都会被调用。
只不过是第一个认证成功的AuthenticationInfo作为最后的结果返回。
<bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
	<!-- 其他配置 -->
	<property name="authenticator" ref="authenticator" />
	<property name="realms">
		<list>
			<ref bean="defaultJdbcRealm" />
			<ref bean="backDoorJdbcRealm" />
		</list>
	</property>
</bean>

<bean id="defaultJdbcRealm" class="..." />
<bean id="backDoorJdbcRealm" class="..." />

<bean id="authenticator" class="org.apache.shiro.authc.pam.ModularRealmAuthenticator">
	<property name="authenticationStrategy">
		<bean class="org.apache.shiro.authc.pam.FirstSuccessfulStrategy" />
	</property>
</bean>


为了实现目的,必须对org.apache.shiro.authc.pam.ModularRealmAuthenticator改造。
package xxx.yyy.security;

import java.util.Collection;
import org.apache.shiro.authc.AuthenticationInfo;
import org.apache.shiro.authc.AuthenticationToken;
import org.apache.shiro.authc.pam.AuthenticationStrategy;
import org.apache.shiro.realm.Realm;
import org.apache.shiro.util.CollectionUtils;

public class ModularRealmAuthenticator extends org.apache.shiro.authc.pam.ModularRealmAuthenticator {

	@Override
	protected AuthenticationInfo doMultiRealmAuthentication(Collection<Realm> realms, AuthenticationToken token) {
		
		AuthenticationStrategy strategy = getAuthenticationStrategy();
		AuthenticationInfo aggregate = strategy.beforeAllAttempts(realms, token);
		
		for (Realm realm : realms) {
			aggregate = strategy.beforeAttempt(realm, token, aggregate);
			if (realm.supports(token)) {
				AuthenticationInfo info = null;
				Throwable t = null;
				try {
					info = realm.getAuthenticationInfo(token);
				} catch (Throwable throwable) {
					t = throwable;
				}
				aggregate = strategy.afterAttempt(realm, token, info, aggregate, t);
				// dirty dirty hack
				if (aggregate != null && !CollectionUtils.isEmpty(aggregate.getPrincipals())) {
					return aggregate;
				}
				// end dirty dirty hack
			} else {

			}
		}
		aggregate = strategy.afterAllAttempts(token, aggregate);
		return aggregate;
	}
}

<bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
	<!-- 其他配置 -->
	<property name="authenticator" ref="authenticator" />
	<property name="realms">
		<list>
			<ref bean="defaultJdbcRealm" />
			<ref bean="backDoorJdbcRealm" />
		</list>
	</property>
</bean>

<bean id="defaultJdbcRealm" class="..." />
<bean id="backDoorJdbcRealm" class="..." />

<bean id="authenticator" class="xxx.yyy.security.ModularRealmAuthenticator">
	<property name="authenticationStrategy">
		<bean class="org.apache.shiro.authc.pam.FirstSuccessfulStrategy" />
	</property>
</bean>
分享到:
评论
1 楼 justzcq 2015-12-19  
这个能够实现多数据源认证和授权,但是会抛出异常

相关推荐

    apache-shiro-1-2-x-reference

    Apache Shiro是一个功能强大、灵活的开放式安全框架,干净利落地处理身份验证、授权、企业会话管理和加密。 Shiro可以帮助我们完成:认证、授权、加密、会话管理...【apache-shiro-1-2-x-reference,"waylau"翻译自官网】

    Apache-Shiro-使用手册

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

    thymeleaf-extras-shiro, 用于 Apache Shiro标记的Thymeleaf方言.zip

    thymeleaf-extras-shiro, 用于 Apache Shiro标记的Thymeleaf方言 thymeleaf-extras-shiro Shiro的Thymeleaf 方言, 。下载 Maven&lt;dependency&gt; &lt;groupId&gt;com.github.th

    thymeleaf-extras-shiro-2.0.1

    在thymeleaf-extras-shiro-2.0.1-SNAPSHOT-javadoc.jar中,包含了该版本的API文档。这对于开发者来说是非常宝贵的资源,因为它提供了详细的类和方法说明,可以帮助开发者快速理解和使用Thymeleaf-extras-shiro的各项...

    SpringMVC-Mybatis-Shiro-redis

    《SpringMVC-Mybatis-Shiro-Redis:构建安全高效的Web应用》 在现代Web开发中,构建一个高效且安全的后端系统是至关重要的。本文将深入探讨一个基于SpringMVC、Mybatis、Shiro和Redis的Web应用架构,这四个组件共同...

    Apache-shiro-1.7.0.zip下载

    Apache Shiro是一个强大的Java安全框架,它为应用程序提供了身份验证、授权、会话管理和加密服务。在1.7.0之前的版本中,Shiro存在一个严重的安全漏洞,这个漏洞允许攻击者通过精心构造的请求执行任意系统命令,对...

    apache-shiro-1-2-x-reference.zip

    这个压缩包文件"apache-shiro-1-2-x-reference.zip"包含了Shiro的官方中文参考文档,对于理解和使用Shiro进行Java安全开发来说是非常宝贵的资源。 **身份认证** 在Shiro中,身份认证是指验证用户的身份。Shiro提供...

    apache-shiro教程完整版.7z

    Apache Shiro 是一个强大且易用的Java安全框架,提供了认证、授权、加密和会话管理功能,可以非常轻松地开发出足够安全的应用。张开涛的《跟我学Shiro》是一本深入浅出的教程,旨在帮助读者快速掌握Shiro的核心概念...

    Apache-shiro使用手册

    - **定义**:Apache Shiro 是一款强大且易于使用的 Java 安全框架,它提供了包括认证、授权、密码加密和会话管理在内的多种安全服务功能。 - **特点**: - **简单性**:相较于其他安全框架,Shiro 的设计更为简洁...

    Java模板引擎 thymeleaf-extras-shiro-1.0.2.jar

    如果要使用shiro的话,可以引入 thymeleaf-extras-shiro.jar这个拓展包来曲线实现shiro的前端验证

    easyweb-shiro-master.zip

    在"easyweb-shiro-master"中,开发者可以通过自定义Realm实现与数据库或其他数据源的交互,验证用户的登录信息。 2. **授权(Authorization)**:Shiro的授权功能允许开发者灵活地定义角色和权限,实现细粒度的访问...

    apache-shiro-1.2.x-reference-中文文档

    Apache Shiro 是一个强大且易用的Java安全框架,提供了认证、授权、加密和会话管理功能,可以非常轻松地开发出足够安全的应用程序。这个文档是Apache Shiro 1.2.x版本的中文参考指南,它将帮助我们深入理解和使用...

    SpringMVC-Mybatis-Shiro-redis-0.2-master

    基于SpringMVC Mybatis Shiro Redis 的权限管理系统,该系统已经部署到线上,线上访问地址:http://shiro.itboy.net,登录账号:admin 密码:sojson,,详细教程参考sojson.com/shiro

    apache-shiro 学习笔记

    在`shiro-demo`这个示例项目中,可能包含了一个简单的Shiro应用示例,包括配置文件、Controller、Service和DAO等组件,展示了如何使用Shiro进行认证和授权。开发者可以通过阅读这个示例来理解Shiro在实际项目中的...

    SpringMVC-Mybatis-Shiro-redis-master

    【标题】"SpringMVC-Mybatis-Shiro-redis-master" 涉及的是一个集成框架项目,这个项目集成了四个关键的技术组件:SpringMVC、MyBatis、Shiro和Redis。这些技术在现代Java Web开发中扮演着重要角色。 **SpringMVC**...

    单点登录sso-shiro-cas-maven

    # sso-shiro-cas spring下使用shiro+cas配置单点登录,多个系统之间的访问,每次只需要登录一次 ## 系统模块说明 1. cas: 单点登录模块,这里直接拿的是cas的项目改了点样式而已 2. doc: 文档目录,里面有数据库...

    Apache-Shiro反序列化1

    Apache Shiro 反序列化漏洞分析 Apache Shiro 是一个功能强大且易用的 Java 安全框架,提供身份验证、授权、密码和会话管理等功能。然而,在 Apache Shiro 中存在一个严重的反序列化漏洞,CVE-2016-4437,攻击者...

    Apache-Shiro-中文参考文档.docx

    Apache Shiro 是一个全面的开源安全框架,专为简化应用程序的安全管理而设计。它涵盖了身份验证、授权、会话管理和加密等核心功能,提供了一套简单易用的API,使得开发者能够快速集成安全机制,无需深入理解底层的...

    easy-shiro的登录认证、鉴权例子,

    在本文中,我们将深入探讨Easy-Shiro如何实现这些核心功能,并结合提供的"easy-shiro-intercept-method-sample"示例来阐述具体的应用场景。 首先,让我们了解Shiro的基本概念。Apache Shiro是一个强大的安全框架,...

Global site tag (gtag.js) - Google Analytics