一直以为给定的下面配置是短路方式的,即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>
分享到:
相关推荐
Apache Shiro是一个功能强大、灵活的开放式安全框架,干净利落地处理身份验证、授权、企业会话管理和加密。 Shiro可以帮助我们完成:认证、授权、加密、会话管理...【apache-shiro-1-2-x-reference,"waylau"翻译自官网】
Apache-Shiro-使用手册 Apache Shiro 是一个框架,可用于身份验证和授权。本文提供了几个示例用来展示如何在 Java™ 应用程序中使用 Shiro 并给出了如何在一个 Grails web 应用程序中使用它的概述。
thymeleaf-extras-shiro, 用于 Apache Shiro标记的Thymeleaf方言 thymeleaf-extras-shiro Shiro的Thymeleaf 方言, 。下载 Maven<dependency> <groupId>com.github.th
在thymeleaf-extras-shiro-2.0.1-SNAPSHOT-javadoc.jar中,包含了该版本的API文档。这对于开发者来说是非常宝贵的资源,因为它提供了详细的类和方法说明,可以帮助开发者快速理解和使用Thymeleaf-extras-shiro的各项...
《SpringMVC-Mybatis-Shiro-Redis:构建安全高效的Web应用》 在现代Web开发中,构建一个高效且安全的后端系统是至关重要的。本文将深入探讨一个基于SpringMVC、Mybatis、Shiro和Redis的Web应用架构,这四个组件共同...
Apache Shiro是一个强大的Java安全框架,它为应用程序提供了身份验证、授权、会话管理和加密服务。在1.7.0之前的版本中,Shiro存在一个严重的安全漏洞,这个漏洞允许攻击者通过精心构造的请求执行任意系统命令,对...
这个压缩包文件"apache-shiro-1-2-x-reference.zip"包含了Shiro的官方中文参考文档,对于理解和使用Shiro进行Java安全开发来说是非常宝贵的资源。 **身份认证** 在Shiro中,身份认证是指验证用户的身份。Shiro提供...
Apache Shiro 是一个强大且易用的Java安全框架,提供了认证、授权、加密和会话管理功能,可以非常轻松地开发出足够安全的应用。张开涛的《跟我学Shiro》是一本深入浅出的教程,旨在帮助读者快速掌握Shiro的核心概念...
- **定义**:Apache Shiro 是一款强大且易于使用的 Java 安全框架,它提供了包括认证、授权、密码加密和会话管理在内的多种安全服务功能。 - **特点**: - **简单性**:相较于其他安全框架,Shiro 的设计更为简洁...
如果要使用shiro的话,可以引入 thymeleaf-extras-shiro.jar这个拓展包来曲线实现shiro的前端验证
在"easyweb-shiro-master"中,开发者可以通过自定义Realm实现与数据库或其他数据源的交互,验证用户的登录信息。 2. **授权(Authorization)**:Shiro的授权功能允许开发者灵活地定义角色和权限,实现细粒度的访问...
Apache Shiro 是一个强大且易用的Java安全框架,提供了认证、授权、加密和会话管理功能,可以非常轻松地开发出足够安全的应用程序。这个文档是Apache Shiro 1.2.x版本的中文参考指南,它将帮助我们深入理解和使用...
基于SpringMVC Mybatis Shiro Redis 的权限管理系统,该系统已经部署到线上,线上访问地址:http://shiro.itboy.net,登录账号:admin 密码:sojson,,详细教程参考sojson.com/shiro
在`shiro-demo`这个示例项目中,可能包含了一个简单的Shiro应用示例,包括配置文件、Controller、Service和DAO等组件,展示了如何使用Shiro进行认证和授权。开发者可以通过阅读这个示例来理解Shiro在实际项目中的...
【标题】"SpringMVC-Mybatis-Shiro-redis-master" 涉及的是一个集成框架项目,这个项目集成了四个关键的技术组件:SpringMVC、MyBatis、Shiro和Redis。这些技术在现代Java Web开发中扮演着重要角色。 **SpringMVC**...
# sso-shiro-cas spring下使用shiro+cas配置单点登录,多个系统之间的访问,每次只需要登录一次 ## 系统模块说明 1. cas: 单点登录模块,这里直接拿的是cas的项目改了点样式而已 2. doc: 文档目录,里面有数据库...
Apache Shiro 反序列化漏洞分析 Apache Shiro 是一个功能强大且易用的 Java 安全框架,提供身份验证、授权、密码和会话管理等功能。然而,在 Apache Shiro 中存在一个严重的反序列化漏洞,CVE-2016-4437,攻击者...
Apache Shiro 是一个全面的开源安全框架,专为简化应用程序的安全管理而设计。它涵盖了身份验证、授权、会话管理和加密等核心功能,提供了一套简单易用的API,使得开发者能够快速集成安全机制,无需深入理解底层的...
在本文中,我们将深入探讨Easy-Shiro如何实现这些核心功能,并结合提供的"easy-shiro-intercept-method-sample"示例来阐述具体的应用场景。 首先,让我们了解Shiro的基本概念。Apache Shiro是一个强大的安全框架,...