CAS client 端使用Filter 获得server端传回的信息,如果多个信息使用:
assertion.getPrincipal().getAttributes()
来获得一个Map,但是有的时候Map中没有数据为null;
解决方案:配置deployerConfigContext.xml中名称为serviceRegistryDao的bean,如下
<bean id="serviceRegistryDao" class="org.jasig.cas.services.InMemoryServiceRegistryDaoImpl">
<property name="registeredServices">
<list>
<bean class="org.jasig.cas.services.RegisteredServiceImpl"
p:id="1"
p:description="test"
p:serviceId="http://192.168.104.101:8080/*"
p:enabled="true"
p:ssoEnabled="true"
p:anonymousAccess="false">
<property name="allowedAttributes" value="key1,key2,key3"/>
</bean> </list>
</property>
,其中最重要的配置为:<property name="allowedAttributes" value="key1,key2,key3"/>
这个属性决定了我们在client端获得map是否为null,如果不配置该属性则为null,该属性配置我们返回多个信息对应的key;
此处对应CAS SERVER端源码如下 CentralAuthenticationServiceImpl.java:
// 获得deployerConfigContext.xml中serviceRegistryDao配置的registeredServices
final RegisteredService registeredService = this.servicesManager
.findServiceBy(service);
allowwedAttributes配置对应的代码如下:
/**
* 从principal.getAttributes()获得map后,获取registeredService的allowedAttributes属性,
* 可以对应的key存入返回客户端信息的中map中
*/
for (final String attribute : registeredService
.getAllowedAttributes()) {
final Object value = principal.getAttributes().get(
attribute);
if (value != null) {
attributes.put(attribute, value);
}
}
final Principal modifiedPrincipal = new SimplePrincipal(
principalId, attributes);
final MutableAuthentication mutableAuthentication = new MutableAuthentication(
modifiedPrincipal);
;
希望对大家有所帮助
分享到:
相关推荐
也可以是非阻塞的,线程在队列为空时会立即返回。 在`多线程.ppt`中,可能详细阐述了这些概念的原理和使用方法,包括如何在实际编程中实现和应用。`Thread`文件可能包含了具体的线程编程示例,而`queue`文件可能...
如果队列为空,出队操作返回错误。否则,CAS更新队头,并返回旧的队头元素。如果在CAS期间队头已被其他线程修改,那么操作将重试。 ### 三、并发优化 1. **自旋等待**:当CAS操作失败时,线程可以进行自旋等待,即...
虽然描述信息为空,但我们可以从给定的标签和资源中推断,这篇博文可能涉及了对CAS的源码分析和在Tomcat服务器上的实际部署与使用。博主可能分享了如何配置CAS服务器和客户端,以及在实际项目中遇到的问题和解决方案...
在多线程编程中,硬件锁是一种用于解决并发问题的有效机制,特别是在实现多生产者多消费者(Multiple Producer Multiple Consumer, MPMC)链表时。硬件锁通常指的是CPU提供的原子操作,如测试并设置(Test-and-Set)...
单点登录(Single Sign-On,简称SSO)是一种身份验证机制,允许用户在一次登录后访问多个相互关联的应用系统,而无需再次输入凭证。在Android端实现SSO,主要是为了确保用户在同一时间只能在一个设备上保持活跃的...
在循环过程中,首先检查p节点的下一个节点q是否为空。如果q为空,说明p是尾节点,此时可以执行插入操作。使用CAS操作尝试设置p节点的next节点为新创建的Node节点。如果CAS成功,表示新节点已经被正确地添加到链表中...
- **批量操作**:在条件允许的情况下,一次处理多个元素,减少CAS操作的次数。 - **线程局部存储**:每个线程维护自己的部分队列,减少全局队列的竞争。 总结来说,自扩充的Lock-Free并发环形队列算法通过锁无关的...
2. 判断数组是否为空,若为空返回null。 3. 如果数组不为空,计算key对应的数组下标。 4. 如果该下标处没有元素,直接返回null。 5. 如果有元素且key相等,返回该节点的value。 6. 如果key不相等,检查该元素是否为...
`ForkJoinPool`是专门用于支持分治算法的线程池实现,主要用于解决可以分解为多个子任务的计算密集型任务。 **特点**: - **分治算法**:通过递归分解任务,将大任务拆解为小任务并行处理。 - **工作窃取算法**:...
它是一种高效的数据结构,常用于在多个线程或处理器之间共享数据,尤其在实时系统和高吞吐量的通信中表现优越。 无锁环形缓冲区的设计主要基于原子操作,如CAS(Compare and Swap)或其他硬件提供的原子指令,确保...
初始化时,如果数组为空,HashMap会通过inflateTable方法设置合适的数组大小,保证其为2的幂。 接下来,我们讨论Java 7的ConcurrentHashMap,这是一个线程安全的HashMap实现。与HashMap不同,ConcurrentHashMap采用...
- 如果不为空,使用CAS操作将头节点的后继节点设为新的头节点。如果成功,说明删除完成,可以返回旧头节点的元素;如果失败,说明有其他线程已经更新了头节点,此时需要再次获取头节点并重试。 无锁队列在很多场景...
- **生产者消费者模型**是一种典型的多线程协作模式,其中一个或多个生产者线程负责生成数据并将数据放入队列,一个或多个消费者线程负责从队列中取出数据并进行处理。该模型通常使用阻塞队列来实现。 ### 如何唤醒...
35. 并行是指多个任务同时执行,而并发是指在一段时间内交替执行多个任务。 36. 线程是操作系统资源分配的最小单位,进程是程序的运行实例。 37. 守护线程是后台线程,当所有非守护线程结束时,守护线程也会结束。...
2. **键值对为空:** `HashTable`不允许键或值为`null`。 3. **哈希计算次数:** `HashTable`仅对键进行一次哈希计算,而`HashMap`进行两次哈希计算。 4. **数据结构:** `HashTable`底层使用数组加链表。 #### 九...
- **并行流**:利用多核处理器的优势,将数据分割为多个部分并行处理。 - **并行流与串行流对比**:并行流适用于数据集较大的情况,可以显著提高处理速度。 **20. 计划任务** - **ScheduledExecutorService**:...
- `http.configure()` 方法内部会调用 `HttpSecurity` 的多个方法来配置过滤器。 - 最终通过 `AbstractSecurityWebApplicationInitializer` 完成 `FilterChainProxy` 的初始化并将其注册到 Servlet 容器中。 ####...
CAS返回数据类重构 CAS地址优化统一配置到常量类CasConstants 注销空指针异常BUG OAuth2地址优化统一配置常量类OAuth2Constants OAuth2 Token多次调用时认证转换的BUG ExtendApi标准优化 增加基于时间签名的...