文档章节

cas 3.5.2 返回用户更多信息

大喵哥
 大喵哥
发布于 2014/03/28 16:10
字数 874
阅读 3224
收藏 6

文章中 CAS 基础环境:

cas-server-3.5.2    

cas-client-3.2.1

 

----------------------------------------------------------------------------------------------------------------------------------------

服务器端配置

---------------------------------------------------------------------------------------------------------------------------------------- 

程序中也可能遇到需要得到更多如姓名,手机号,email等更多用户信息的情况。

cas 各种版本配置方式也不尽相同,这里讲的是目前最新版本3.4.4(同样适合 3.5.2 版本)。配置方式如下,

 

 一、首先需要配置属性attributeRepository,首先,你需要到WEB-INF目录找到 

deployerConfigContext.xml文件,同时配置 attributeRepository 如下: 

<bean  class="org.jasig.services.persondir.support.jdbc.SingleRowJdbcPersonAttributeDao" id="attributeRepository">

        <constructor-arg index="0" ref="casDataSource"/>

        <constructor-arg index="1" value="select * from userinfo where {0}"/>

        <property name="queryAttributeMapping">

            <map>

                <entry key="username" value="loginname"/>  

            <!-- 这里的key需写username,value对应数据库用户名字段-->

            </map>

        </property>

        <property name="resultAttributeMapping">

            <map>

                <!--key对应数据库字段,value对应客户端获取参数-->

                <entry key="id" value="id"/>

                <entry key="mobile" value="mobile"/>

                <entry key="email" value="email"/>

            </map>

        </property>

    </bean>

其中:

queryAttributeMapping 是组装sql用的查询条件属性,上述配置后,结合封装成查询sql就是 select * from userinfo where loginname=#username#

resultAttributeMapping 是sql执行完毕后返回的结构属性, key对应数据库字段,value对应客户端获取参数。

  

二、配置用户认证凭据转化的解析器

也是在 deployerConfigContext.xml 中,找到 credentialsToPrincipalResolvers,为 UsernamePasswordCredentialsToPrincipalResolver 注入 attributeRepository,那么 attributeRepository 就会被触发并通过此类进行解析,红色为新添部分。

<property name="credentialsToPrincipalResolvers">

            <list>        

                <bean class="org.jasig.cas.authentication.principal.UsernamePasswordCredentialsToPrincipalResolver">

                    <property name="attributeRepository" ref="attributeRepository"/>

                </bean>

                <bean class="org.jasig.cas.authentication.principal.HttpBasedServiceCredentialsToPrincipalResolver"/>

            </list>

 </property>

 

 三、(在 CAS Server 3.5.2 中测试通过)修改 deployerConfigContext.xml 中的 org.jasig.cas.services.InMemoryServiceRegistryDaoImpl 的 属性 registeredServices

修改 registeredServices  列表中的每个协议中的 allowedAttributes 属性的值,列出的每个值,在客户端就可以访问了

<bean  id="serviceRegistryDao" class="org.jasig.cas.services.InMemoryServiceRegistryDaoImpl">
            <property name="registeredServices">
                <list>
                    <bean class="org.jasig.cas.services.RegexRegisteredService">
                        <property name="id" value="0" />
                        <property name="name" value="HTTP and IMAP" />
                        <property name="description" value="Allows HTTP(S) and IMAP(S) protocols" />
                        <property name="serviceId" value="^(https?|imaps?)://.*" />
                        <property name="evaluationOrder" value="10000001" />

                         <property name="ignoreAttributes" value="false" />
                        <property name="allowedAttributes"> 

                                <!-- 客户端需要使用的对象的属性名称 -->
                                <list>
                                         <value>id</value>    
                                         <value>email</value>
                                        <value>mobile</value>
                                 </list>
                        </property>

                    </bean>

此步骤灰常重要,可以看看 org.jasig.cas.services.RegexRegisteredService 的源码,其中的 allowedAttributes 是关键

【提示】网上说 ignoreAttributes 属性控制,查看了 CAS 3.5.2 版本的 AbstractRegisteredService 源码后,发现其默认值就是 false,即:添加属性后,客户端就可见了


四、(按照上述配置后,万里长征就差最后一步了)修改 WEB-INF/view/jsp/protocol/2.0/casServiceValidationSuccess.jsp

在server验证成功后,这个页面负责生成与客户端交互的xml信息,在默认的casServiceValidationSuccess.jsp中,只包括用户名,并不提供其他的属性信息,因此需要对页面进行扩展,如下,红色为新添加部分 

<cas:serviceResponse xmlns:cas='http://www.yale.edu/tp/cas'>

 <cas:authenticationSuccess>

<cas:user>${fn:escapeXml(assertion.chainedAuthentications[fn:length(assertion.chainedAuthentications)-1].principal.id)}</cas:user>

  <c:if test="${fn:length(assertion.chainedAuthentications[fn:length(assertion.chainedAuthentications)-1].principal.attributes) > 0}">

            <cas:attributes>

                <c:forEach var="attr" items="${assertion.chainedAuthentications[fn:length(assertion.chainedAuthentications)-1].principal.attributes}">

                    <cas:${fn:escapeXml(attr.key)}>${fn:escapeXml(attr.value)}</cas:${fn:escapeXml(attr.key)}>

                </c:forEach>

            </cas:attributes>

        </c:if>

<c:if test="${not empty pgtIou}">
  <cas:proxyGrantingTicket>${pgtIou}</cas:proxyGrantingTicket>
</c:if>
<c:if test="${fn:length(assertion.chainedAuthentications) > 1}">
<cas:proxies>
<c:forEach var="proxy" items="${assertion.chainedAuthentications}" varStatus="loopStatus" begin="0" end="${fn:length(assertion.chainedAuthentications)-2}" step="1">
   <cas:proxy>${fn:escapeXml(proxy.principal.id)}</cas:proxy>
</c:forEach>
</cas:proxies>
</c:if>
 </cas:authenticationSuccess>
</cas:serviceResponse>

 

通过完成上面四个步骤的配置后,server端的工作就完成了,那么如何在客户端获取这些信息呢?下面进行说明:

 

----------------------------------------------------------------------------------------------------------------------------------------

客户端获取用户信息

----------------------------------------------------------------------------------------------------------------------------------------

 java客户端获取用户信息:

AttributePrincipal principal = (AttributePrincipal) request.getUserPrincipal();

Map attributes = principal.getAttributes();

String email=attributes .get("email");

 

php客户端;

$email=phpCAS::getAttribute('email');

本文转载自:http://www.cnblogs.com/AloneSword/p/3247060.html

大喵哥
粉丝 13
博文 33
码字总数 1912
作品 0
广州
程序员
私信 提问
加载中

评论(8)

高级农民工ABC
高级农民工ABC
中文乱码问题是怎么解决的?
爱coding
爱coding
你好,朋友,问一下,cas认证成功了,之后,仍然不调回原有的系统中,还是在登陆页,是哪里还没有配置正确?输入错误用户名,就是凭证错误,但是输入正确了,什么也不提示,还是在登陆页,不进入我的系统中。。
难吃的阳春面
我按照步骤做后报这个错,请问怎么解决啊?
[org.jasig.cas.client.util.XmlUtils]org.xml.sax.SAXParseException; lineNumber: 13; columnNumber: 20; 与元素类型 "cas:" 相关联的属性名 "username" 必须后跟 ' = ' 字符。
org.xml.sax.SAXParseException; lineNumber: 13; columnNumber: 20; 与元素类型 "cas:" 相关联的属性名 "username" 必须后跟 ' = ' 字符。
  at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.createSAXParseException(Unknown Source)
  at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.fatalError(Unknown Source)
  at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(Unknown Source)
  at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(Unknown Source)
  at com.sun.org.apache.xerces.internal.impl.XMLScanner.reportFatalError(Unknown Source)
  at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.scanAttribute(Unknown Source)
  at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.scanStartElement(Unknown Source)
  at com.sun.org.apache.xerces.internal.impl.XMLDocumentFr
大喵哥
大喵哥 博主

引用来自“hanzhankang”的评论

非常感谢!我按照你这样的配置,没有成功,你成功了吗?
当然成功了呀
华兹格
华兹格
非常感谢!我按照你这样的配置,没有成功,你成功了吗?
大喵哥
大喵哥 博主

引用来自“hanzhankang”的评论

请问能把demo或者 cas-server-3.5.2 / cas-client-3.2.1 发给我吗?官网太难下了
http://pan.baidu.com/s/1ntHjGhz cas-server-3.5.2 / cas-client-3.2.1 在里面
大喵哥
大喵哥 博主

引用来自“hanzhankang”的评论

请问能把demo或者 cas-server-3.5.2 / cas-client-3.2.1 发给我吗?官网太难下了
稍等 还在传百度盘
华兹格
华兹格
请问能把demo或者 cas-server-3.5.2 / cas-client-3.2.1 发给我吗?官网太难下了
CAS服务器配置

参考文献: http://sucre.blog.51cto.com/1084905/683624 1.安装部署CAS Server 从官网下载CAS Server,今天发现CAS Server的官网居然被墙掉了,感叹天朝的神奇之处。后来从同事那里拷贝到了...

嗯哼9925
2017/12/20
0
0
spring security整合cas验证失败

spreing security版本:3.1.2 cas-client版本:3.3.3 cas-server版本:3.5.2 applicationContext-security.xml配置文件: 错误信息:...

mklop2014
2014/12/22
2.4K
0
cas-sample-site1/2各配上一个用于显示我们是否能够成功后用户信息的index.jsp

在同一个域名下如taobao.com下会有多个商铺(就是租户)好比: taobao.com/company_101/张飞 taobao.com/company_102/张飞 taobao.com/company_103/赵云 看张飞这个名字,看!!! 不同的com...

海博1600
2018/07/07
9
0
Spring Security 3和CAS 3.5.2集成的完整实例

回顾 在上一篇文章,利用Spring Security 3.2的remember-me搭建SSO,我做了一个简单的单点登录。但其毕竟不够健壮,比如无法点单登出,也无法与非Spring Security的应用集成。今天,我将使用...

xpbug
2014/03/04
6.7K
21
CAS服务端返回更多数据的问题

CAS Server 3.4 CAS Client 3.2 CAS Service和Client都配置成功,也基本实现了SSO,但是现在我希望实现这样的一个功能:用户登陆后,不能再单纯的校验用户是否存在,还应该查询更多的属性,比...

Hartwell
2012/04/04
2.3K
3

没有更多内容

加载失败,请刷新页面

加载更多

用 4G 工作是什么体验

七月开始,因为工作原因,在公司附近租了个住处,方便工作。离公司近了,感觉就是不一样,之前每天 5:30 就要起床赶地铁,现在可以睡到自然醒,一看才 7 点,悠闲的起床洗漱,踱步到公司,都...

zzxworld
27分钟前
4
0
sonar报错volatile

问题发生 原先代码如下: //认证授权码private static volatile String AUTHORIZATION_CODE = "init"; git push 之后,sonar认为这是个bug检测报告截图如下: 分析排查 解释说明: Markin...

开源小菜鸟2333
31分钟前
3
0
《Java实践指南》--读后

闲读《Java实践指南》... 1.lvy 某些项目中能够看到ivy.xml。早期使用ant的项目中,常常用ivy.xml来下载项目依赖。 2.ant 作为java程序员,应该都知道ant,虽然可能用过的人不多。为什么ant...

RippleChan
33分钟前
3
0
前端:固定表格(table)表头的实现方式

在写插件 bootstrap table 的时候,当数据过多的时候,需要对表格的 thead 进行固定,然后滚动表格的 tbody 。但是在实际的操作上,花了很多的时间在这个问题上,到现在也没有找到完美的解决...

前端老手
34分钟前
5
0
第五章 spring-connet之AnnotationConfigUtils

前言 AnnotatedBeanDefinitionReader是AnnctionConfig相关上下文与AnnotationConfigUtils的桥梁。还有一个作用是解析class成为BeanDefinitionHolder,注册到容器里面。AnnotationConfigUtils...

鸟菜啊
昨天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部