`
liuzhiyi7288
  • 浏览: 31921 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

CAS 返回多个信息为空

    博客分类:
  • SSO
 
阅读更多
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);

希望对大家有所帮助
分享到:
评论
1 楼 solomon 2011-10-31  
  不错,雪中送炭。 

相关推荐

    多线程 教程 各种锁 半成品的CAS 临界区 信号量 事件 互斥锁 队列

    也可以是非阻塞的,线程在队列为空时会立即返回。 在`多线程.ppt`中,可能详细阐述了这些概念的原理和使用方法,包括如何在实际编程中实现和应用。`Thread`文件可能包含了具体的线程编程示例,而`queue`文件可能...

    基于cas的无锁队列实现

    如果队列为空,出队操作返回错误。否则,CAS更新队头,并返回旧的队头元素。如果在CAS期间队头已被其他线程修改,那么操作将重试。 ### 三、并发优化 1. **自旋等待**:当CAS操作失败时,线程可以进行自旋等待,即...

    关于CAS开源单点登录的点点滴滴

    虽然描述信息为空,但我们可以从给定的标签和资源中推断,这篇博文可能涉及了对CAS的源码分析和在Tomcat服务器上的实际部署与使用。博主可能分享了如何配置CAS服务器和客户端,以及在实际项目中遇到的问题和解决方案...

    硬件锁实现多生产者多消费者链表

    在多线程编程中,硬件锁是一种用于解决并发问题的有效机制,特别是在实现多生产者多消费者(Multiple Producer Multiple Consumer, MPMC)链表时。硬件锁通常指的是CPU提供的原子操作,如测试并设置(Test-and-Set)...

    Android端实现单点登录的方法详解

    单点登录(Single Sign-On,简称SSO)是一种身份验证机制,允许用户在一次登录后访问多个相互关联的应用系统,而无需再次输入凭证。在Android端实现SSO,主要是为了确保用户在同一时间只能在一个设备上保持活跃的...

    Java并发编程之美_部分51

    在循环过程中,首先检查p节点的下一个节点q是否为空。如果q为空,说明p是尾节点,此时可以执行插入操作。使用CAS操作尝试设置p节点的next节点为新创建的Node节点。如果CAS成功,表示新节点已经被正确地添加到链表中...

    自扩充的Lock-Free并发环形队列算法

    - **批量操作**:在条件允许的情况下,一次处理多个元素,减少CAS操作的次数。 - **线程局部存储**:每个线程维护自己的部分队列,减少全局队列的竞争。 总结来说,自扩充的Lock-Free并发环形队列算法通过锁无关的...

    HashMap与ConcurrentHashMap面试要点.pdf

    2. 判断数组是否为空,若为空返回null。 3. 如果数组不为空,计算key对应的数组下标。 4. 如果该下标处没有元素,直接返回null。 5. 如果有元素且key相等,返回该节点的value。 6. 如果key不相等,检查该元素是否为...

    并发容器和线程池,java并发编程3

    `ForkJoinPool`是专门用于支持分治算法的线程池实现,主要用于解决可以分解为多个子任务的计算密集型任务。 **特点**: - **分治算法**:通过递归分解任务,将大任务拆解为小任务并行处理。 - **工作窃取算法**:...

    ring-buffer-design.rar_V2 _buffer_ring_buffer

    它是一种高效的数据结构,常用于在多个线程或处理器之间共享数据,尤其在实时系统和高吞吐量的通信中表现优越。 无锁环形缓冲区的设计主要基于原子操作,如CAS(Compare and Swap)或其他硬件提供的原子指令,确保...

    2.Java7_8+中的+HashMap+和+ConcurrentHashMap+全解析1

    初始化时,如果数组为空,HashMap会通过inflateTable方法设置合适的数组大小,保证其为2的幂。 接下来,我们讨论Java 7的ConcurrentHashMap,这是一个线程安全的HashMap实现。与HashMap不同,ConcurrentHashMap采用...

    无锁队列

    - 如果不为空,使用CAS操作将头节点的后继节点设为新的头节点。如果成功,说明删除完成,可以返回旧头节点的元素;如果失败,说明有其他线程已经更新了头节点,此时需要再次获取头节点并重试。 无锁队列在很多场景...

    线程面试汇总.docx

    - **生产者消费者模型**是一种典型的多线程协作模式,其中一个或多个生产者线程负责生成数据并将数据放入队列,一个或多个消费者线程负责从队列中取出数据并进行处理。该模型通常使用阻塞队列来实现。 ### 如何唤醒...

    Java基础系列面试题(88个).pdf

    35. 并行是指多个任务同时执行,而并发是指在一段时间内交替执行多个任务。 36. 线程是操作系统资源分配的最小单位,进程是程序的运行实例。 37. 守护线程是后台线程,当所有非守护线程结束时,守护线程也会结束。...

    八股文.pdf

    2. **键值对为空:** `HashTable`不允许键或值为`null`。 3. **哈希计算次数:** `HashTable`仅对键进行一次哈希计算,而`HashMap`进行两次哈希计算。 4. **数据结构:** `HashTable`底层使用数组加链表。 #### 九...

    深入浅出Java多线程.pdf

    - **并行流**:利用多核处理器的优势,将数据分割为多个部分并行处理。 - **并行流与串行流对比**:并行流适用于数据集较大的情况,可以显著提高处理速度。 **20. 计划任务** - **ScheduledExecutorService**:...

    spring security源码分析.pdf

    - `http.configure()` 方法内部会调用 `HttpSecurity` 的多个方法来配置过滤器。 - 最终通过 `AbstractSecurityWebApplicationInitializer` 完成 `FilterChainProxy` 的初始化并将其注册到 Servlet 容器中。 ####...

    MaxKey单点登录认证系统-其他

    CAS返回数据类重构 CAS地址优化统一配置到常量类CasConstants 注销空指针异常BUG OAuth2地址优化统一配置常量类OAuth2Constants OAuth2 Token多次调用时认证转换的BUG ExtendApi标准优化 增加基于时间签名的...

Global site tag (gtag.js) - Google Analytics