单点登录CAS解决方案<四>:验证后返回数据

 「个人学习记录,肯定有理解错误和理解不透的地方,小白总是有个成长的过程,希望大家多多指教。」

    书接上文:单点登录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')



单点登录CAS解决方案<四>:验证后返回数据

好感动~0~,英语底子好差,看个文档也是一知半解的,有大神能帮忙该多好,望高人指点来理解得更透彻。








你可能感兴趣的:(SSO,cas,单点登录)