文章中 CAS 基础环境: php
cas-server-3.5.2 java
cas-client-3.2.1 sql
---------------------------------------------------------------------------------------------------------------------------------------- 数据库
服务器端配置 服务器
---------------------------------------------------------------------------------------------------------------------------------------- app
程序中也可能遇到须要获得更多如姓名,手机号,email等更多用户信息的状况。 jsp
cas 各类版本配置方式也不尽相同,这里讲的是目前最新版本3.4.4(一样适合 3.5.2 版本)。配置方式以下, oop
1、首先须要配置属性attributeRepository,首先,你须要到WEB-INF目录找到 测试
deployerConfigContext.xml文件,同时配置 attributeRepository 以下: lua
<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对应客户端获取参数。
2、配置用户认证凭据转化的解析器
也是在 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>
3、(在 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,即:添加属性后,客户端就可见了
4、(按照上述配置后,万里长征就差最后一步了)修改 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');