我们都知道CAS在登录成功后会返回一些我们所需要的值来提供给各个客户端,有一种情况就是根据不同的情况我们要查询不同的表来进行反馈信息,比如说 当 是管理员登录的时候返回的可能是从A表中查询的数据,当普通用户登录的时候可能返回的是B表中的信息,CAS怎么才能实现这种需求呢?现在我们就实现这种需求,需要修改deployerConfigContext.xml 配置文件,也需要修改源码,现在我们现讲怎么修改配置文件,其实很简单 我们配置返回登录信息的配置如下:
<property name="credentialsToPrincipalResolvers">
<list>
<bean class="org.jasig.cas.authentication.principal.UsernamePasswordCredentialsToPrincipalResolver" >
<property name="attributeRepository" ref="attributeRepository" />
<property name="attributeRepository1" ref="attributeRepository1" />
</bean>
<bean class="org.jasig.cas.authentication.principal.HttpBasedServiceCredentialsToPrincipalResolver" />
</list>
</property>
下面是配置的attributeRepsoitory和attributeRepsoitory1两个Bean
<bean
class="org.jasig.services.persondir.support.jdbc.SingleRowJdbcPersonAttributeDao"
id="attributeRepository">
<constructor-arg index="0" ref="casDataSource" />
<constructor-arg index="1"
value="select * from A where {0}" />
<property name="queryAttributeMapping">
<map>
<!-- key对应username,value对应数据库用户名字段 -->
<entry key="username" value="loginname" />
</map>
</property>
<property name="resultAttributeMapping">
<map>
<!--key为对应的数据库字段名称,value为提供给客户端获取的属性名字,系统会自动填充值 -->
<entry key="A" value="A" />
<entry key="AA" value="AA" />
</map>
</property>
</bean>
<bean
class="org.jasig.services.persondir.support.jdbc.SingleRowJdbcPersonAttributeDao"
id="attributeRepository1">
<constructor-arg index="0" ref="casDataSource" />
<constructor-arg index="1"
value="select * from B where {0}" />
<property name="queryAttributeMapping">
<map>
<!-- key对应username,value对应数据库用户名字段 -->
<entry key="username" value="loginname" />
</map>
</property>
<property name="resultAttributeMapping">
<map>
<!--key为对应的数据库字段名称,value为提供给客户端获取的属性名字,系统会自动填充值 -->
<entry key="B" value="B" />
<entry key="BB" value="BB" />
</map>
</property>
</bean>
以上就是配置文件部分的修改(该部分修改时基于原来返回信息的配置基础上增加的一个attributeReponsitory1 而已)
下面讲一下源码怎么修改
在org.jasig.cas.authentication.principal.AbstractPersonDirectoryCredentialsToPrincipalResolver这个类中有如下代码:
@NotNull
private IPersonAttributeDao attributeRepository = new StubPersonAttributeDao(new HashMap<String, List<Object>>());
看到上述代码相比就知道了上述配置文件中 <property name="attributeRepository" ref="attributeRepository" />
这句话的作用了,所以我们就参照这个attributeRepository 的定义,我们也定义一个类似的 attributeRepository1,如下:
private IPersonAttributeDao attributeRepository1 = new StubPersonAttributeDao(new HashMap<String, List<Object>>());
public final void setAttributeRepository(final IPersonAttributeDao attributeRepository1) {
this.attributeRepository1 = attributeRepository1;
}
这样注入Bean 就完成了,下面就可以具体的应用了,还是在这个类中,找到下面的代码:
final IPersonAttributes personAttributes = this.attributeRepository.getPerson(principalId);
这句代码的作用就是根据username查询返回的信息,
根据配置我们可以这样改造这句话,假定有一个loginrole 参数 为1的时候执行attributRepository1这个bean
int loginrole = 1;
final IPersonAttributes personAttributes = loginrole ==1?this.attributeRepository1.getPerson(principalId):this.attributeRepository.getPerson(principalId);
//这样就完成了如果查不同的表返回登录信息
以上纯属个人应用总结的方法,不一定是最合适的也不一定是最正确的。
分享到:
相关推荐
根据提供的标题、描述、标签及部分内容,我们可以整理出与MySQL及Oracle数据库相关的多个知识点,具体如下: ### 一、数据库基础知识 #### 1. 数据库(Database)与数据库管理系统(DBMS) - **数据库**:一种用于...
但查询缓存不是万能的,它依赖于SQL的文本一致性,即使是非常细微的变化(比如空格或者注释的不同)都可能导致缓存失效。另外,如果数据库表结构或数据发生变化,之前缓存的查询结果会失效,因此需要维护缓存的一致...
通过编写 Lua 脚本,可以检查某个键的当前值,然后根据检查结果决定是否更新该键的值,从而实现 CAS。 另一种实现方式是利用 Redis 的 `EVALSHA` 或 `EVAL` 命令结合 `WATCH` 命令。`WATCH` 命令可以监视一个或多个...
`CASE WHEN` 语句通常用于在SQL查询中根据不同的条件返回不同的结果。它的基本结构如下: ```sql CASE WHEN condition1 THEN result1 WHEN condition2 THEN result2 ... ELSE default_result END ``` 在这里,...
【系统实现与挑战】硬件方案如 STi7167 用于实现加密和解密功能,智能卡计算并返回加密的 CW,实现音视频数据解扰。然而,实际网络中可能存在大量用户导致数据加密速度不足,以及预先保存密钥在存储区域可能带来的...
- **基于关系数据库的方法**:通过设计特殊的数据库表结构来存储XML文档的节点信息,利用SQL查询实现检索。这种方法的优点在于可以直接利用成熟的数据库管理系统(DBMS)的强大功能,但复杂的查询转换可能导致性能...
- **右连接**:返回右表的所有记录,左表匹配的记录。 - **内连接**:只返回两张表中匹配的记录。 - **外连接**:包括左连接和右连接。 ### MySQL数据库性能优化之缓存参数优化 - **缓存参数**:如`query_cache_...
面试是评估技术能力的重要环节,本篇“百度面经1”涵盖了广泛的IT知识,主要涉及Java、数据库、操作系统、网络、数据结构与算法、设计模式和框架等方面。下面将对这些知识点进行详细阐述: 1. **分布式锁算法**:在...
在这个结构中,`case_expression`是你要检查的表达式,`when_expression`是你想要匹配的值,`commands`是匹配成功后要执行的SQL语句。如果`case_expression`的值与`when_expression`之一匹配,那么对应的`commands`...
Oracle CASE 函数是 SQL 查询中的一个非常有用的表达式,它允许根据特定条件返回不同的值。在给定的示例中,CASE 函数被用来为 `students` 表中的 `grade` 列设置合适的等级,基于学生的 `current_credits`。 首先...
- **EHCache**:是一个纯Java的缓存实现,主要用于缓存查询结果或计算结果,减轻数据库压力。 对于Java对象的存储,Redis可以通过`Jedis`客户端库的序列化机制实现。 #### 如何写SQL以有效利用复合索引 复合索引...
自连接和子查询是数据库查询中的重要概念,用于关联同一表的不同行。 3. 查询平均工资高于8000的部门id和平均工资: 使用`avg()`函数计算平均工资,并结合`WHERE`子句筛选条件,这展示了聚合函数和条件过滤的应用...
4. **高级命令**(如`cas`):用于实现条件存储操作。 5. **其他命令**(如`stats`, `version`等):用于查询服务器状态或版本信息等。 #### 五、内部工作机制 1. **基本数据结构**:Memcached使用哈希表来存储...
- **动态SQL**: 支持条件查询等功能。 - **对象关系映射**: 自动将数据库记录映射为对象。 ### 分布式系统要点解析 - **分布式系统**: 由多台计算机组成, 通过网络互相通信协作完成共同目标的系统。 - **常见概念*...
- **分代收集算法**:根据对象年龄的不同,采用不同的回收策略。 8. **垃圾回收器** - **Serial Collector**:单线程收集器,适用于客户端应用。 - **Parallel Collector**:多线程收集器,适用于服务器端应用。...
4. **hashCode()与equals()的区别**:hashCode()用于哈希表,如HashMap,返回对象的哈希值,而equals()用于比较两个对象是否相等。当equals()返回true时,两对象的hashCode()应相同。 5. **反射**:Java反射允许...
12. Java 应用程序的主类中的 `main` 方法返回类型是 `void`,表示不返回任何值。 13. 显示器的点距越小,分辨率越高,显示效果越好。 14. Java 中的标准输入输出流分别是 `System.in` 和 `System.out`。 15. SQL...
- **知识点概述**:`HashMap`是一种基于哈希表的数据结构,它实现了`Map`接口,提供了键值对的存储与检索。 - **实现细节**: - 使用哈希函数计算键的哈希值。 - 通过哈希值定位到数组索引位置。 - 如果发生哈希...
`CASE...WHEN` 语句是一种条件判断语句,常用于在SQL查询中根据特定条件返回不同的值。在行列转换场景下,我们可以利用它将某一列的多个行值转化为列名。以下是一个例子: ```sql SELECT Student AS '姓名', ...
SQL中的`CASE…WHEN…`语句是数据库查询中非常强大的工具,它允许你在单个查询中执行复杂的条件逻辑,生成基于不同条件的结果。在本文中,我们将深入探讨几个使用`CASE…WHEN…`的场景,以及如何利用它来解决实际...