「个人学习记录,肯定有理解错误和理解不透的地方,小白总是有个成长的过程,希望大家多多指教。」
书接上文:单点登录CAS解决方案<三>:phpCAS Client ,当用户验证完成后,客户端还需要一些字段来对接,那么CAS-Server,和CAS-Client又要怎么做呢?
官方文档:http://jasig.github.io/cas/4.0.x/integration/Attribute-Release.html
一、服务端
- deployerConfigContext.xml,找到该文件的以下内容:
<bean id="attributeRepository" class="org.jasig.services.persondir.support.StubPersonAttributeDao"
p:backingMap-ref="attrRepoBackingMap" />
<util:map id="attrRepoBackingMap">
<entry key="uid" value="uid" />
<entry key="eduPersonAffiliation" value="eduPersonAffiliation" />
<entry key="groupMembership" value="groupMembership" />
</util:map>
替换为:
<bean id="attributeRepository"
class="org.jasig.services.persondir.support.jdbc.SingleRowJdbcPersonAttributeDao">
<constructor-arg index="0" ref="dataSource" />
<constructor-arg index="1" value="SELECT * FROM sso WHERE {0}" />
<property name="queryAttributeMapping">
<map>
<!-- key是指上面sql语句中条件字段 -->
<!-- value很重要,这个也是一个变量,不要认为是查询username='username'的结果 -->
<!-- 这个值到底是从哪儿来的呢,继续往下年 -->
<entry key="username" value="username" />
</map>
</property>
<property name="resultAttributeMapping">
<map>
<!-- key别名,value对应数据库的字段名 -->
<entry key="id" value="id" />
<entry key="username" value="username" />
<entry key="nick" value="nick" />
<entry key="sex" value="sex" />
<entry key="email" value="email" />
<entry key="phone" value="phone" />
<entry key="createtime" value="createtime" />
<entry key="modifytime" value="modifytime" />
</map>
</property>
</bean>
- deployerConfigContext.xml,在该文件中找到【<util:list id="registeredServicesList">】,删除或注释下面的内容:
<bean class="org.jasig.cas.services.RegexRegisteredService"
p:id="0" p:name="HTTP and IMAP" p:description="Allows HTTP(S) and IMAP(S) protocols"
p:serviceId="^(https?|imaps?)://.*" p:evaluationOrder="10000001" />
替换为:
<!-- 注册客户端 -->
<bean class="org.jasig.cas.services.RegexRegisteredService">
<!-- 自定义一个ID,不重复就行 -->
<property name="id" value="1" />
<!-- 注册客户端的名字,根据需求定义 -->
<property name="name" value="HTTPS Services" />
<!-- 描述 -->
<property name="description" value="YOUR HTTPS Service" />
<!-- 域名的正则表达式,这里匹配的是所有https和imaps开头的网站 -->
<!-- 如果正式使用应该使用更明确的域名 <property name="serviceId" value="^(https?|imaps?)://([A-Za-z0-9_-]+\.)*example\.com/.*" /> -->
<property name="serviceId" value="^(https?|imaps?)://.*" />
<!-- 判断的顺序 -->
<property name="evaluationOrder" value="1" />
<!-- 这里很关键啦,这个value就是要用来为上面attributeRepository提供查询条件的变量 -->
<!-- 并且,这个也是单点登录CAS解决方案<二>中fieldUser的值一样-->
<property name="usernameAttribute" value="username" />
<!-- 这个地方就是允许该客户端能够接收到的字段信息 -->
<property name="allowedAttributes">
<list>
<value>id</value>
<value>username</value>
<value>nick</value>
<value>sex</value>
<value>email</value>
<value>phone</value>
<value>createtime</value>
<value>modifytime</value>
</list>
</property>
</bean>
- WEB-INF/view/jsp/protocol/2.0/casServiceValidationSuccess.jsp 文件中“<cas:user>”标签结束后添加下面的内容:
<cas:attributes>
<c:forEach var="attr"
items="${assertion.chainedAuthentications[fn:length(assertion.chainedAuthentications)-1].principal.attributes}"
varStatus="loopStatus" begin="0"
end="${fn:length(assertion.chainedAuthentications[fn:length(assertion.chainedAuthentications)-1].principal.attributes)-1}"
step="1">
<cas:${fn:escapeXml(attr.key)}>${fn:escapeXml(attr.value)}</cas:${fn:escapeXml(attr.key)}>
</c:forEach>
</cas:attributes>
二、客户端
客户端口要做的很简单了,在单点登录CAS解决方案<三>:phpCAS Client的基础上,只需要使用下面的函数就能获取到CAS-Server返回的值。
phpCAS::getAttributes()
phpCAS::getAttribute('key')
好感动~0~,英语底子好差,看个文档也是一知半解的,有大神能帮忙该多好,望高人指点来理解得更透彻。