當前位置:編程學習大全網 - 源碼下載 - cas單點登錄怎麽在服務器端獲得用戶信息

cas單點登錄怎麽在服務器端獲得用戶信息

通過上述部署與配置,多個Web應用已經可以***用壹個登錄服務。但是,上述過程中作為CAS Client端的Web應用只取得了用戶登錄名稱信息,而在實際應用中,Web應用往往需要獲得登錄用戶更多的信息,例如會員等級、性別、住址等。要達到此目的,只需對Server端稍做修改即可實現。

1. 服務端配置及修改

假定上述存儲用戶信息的數據表userinfo中還包含壹個名為address的用於存儲用戶地址的字段,而Web應用程序希望能夠從CAS Server處獲得當前登錄用戶的地址信息,則Server端需要按以下內容修改deployerConfigContext.xml。部分配置說明請參見註釋。

<!--將原有attributeRepository配置註釋 -->

<!--

<beanid="attributeRepository"

class="org.jasig.services.persondir.support.StubPersonAttributeDao">

<propertyname="backingMap">

<map>

<entrykey="uid" value="uid" />

<entrykey="eduPersonAffiliation" value="eduPersonAffiliation"/>

<entrykey="groupMembership" value="groupMembership" />

</map>

</property>

</bean>

-->

<!--新增attributeRepository配置(開始) -->

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

<!-- 指定使用的數據源,此處dataSource是已配置好的數據源 -->

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

<!-- 從數據庫中查詢信息的SQL語句,通常只需要修改表名即可 -->

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

<propertyname="queryAttributeMapping">

<map>

<!-- 上述查詢的參數,將userName替換為表中表示用戶名的字段名稱 -->

<entrykey="username" value="userName"/>

</map>

</property>

<propertyname="resultAttributeMapping">

<map>

<!-- 需要返回給Web應用的其它信息,多個信息時可繼續增加entry節點-->

<!--key值為數據表中的字段名稱,value值為Client端取值時的名稱標識-->

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

</map>

</property>

</bean>

<!--新增attributeRepository配置(結束) -->

<bean

id="serviceRegistryDao"

class="org.jasig.cas.services.InMemoryServiceRegistryDaoImpl">

<propertyname="registeredServices">

<list>

<beanclass="org.jasig.cas.services.RegexRegisteredService">

<propertyname="id" value="0" />

<propertyname="name" value="HTTP and IMAP" />

<propertyname="description" value="Allows HTTP(S) and IMAP(S)protocols" />

<propertyname="serviceId" value="^(https?|imaps?)://.*" />

<propertyname="evaluationOrder" value="10000001" />

<!--增加此項配置 -->

<property name="ignoreAttributes" value="true"/>

</bean>

… …

</list>

</property>

</bean>

CASServer要將額外的信息傳遞至Client端,還需要修改完成信息組裝的文件WEB-INF/view/jsp/protocol/2.0/casServiceValidationSuccess.jsp。casServiceValidationSuccess.jsp負責組裝包含用戶信息的XML,因此修改部分是將需要傳遞的額外信息加入到它最終生成的XML文件之中。具體修改如下:

<cas:serviceResponsexmlns: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:iftest="${fn:length(assertion.chainedAuthentications[fn:length(assertion.chainedAuthentications)-1].principal.attributes)> 0}">

<cas:attributes>

<c:forEachvar="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 emptypgtIou}">

<cas:proxyGrantingTicket>${pgtIou}</cas:proxyGrantingTicket>

</c:if>

<c:if test="${fn:length(assertion.chainedAuthentications)> 1}">

<cas:proxies>

<c:forEachvar="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>

2. Java Client端取得更多用戶信息

Java Client端不需要做任何修改就可以繼續正常使用CAS服務,如果需要取得用戶更多信息,可以通過AttributePrincipal對象取得Attribute列表(壹個Map對象)後進行查詢。

修改前述Java Client的示例代碼,在最後追加取得address信息的代碼,重啟服務並重新訪問頁面,可以看到頁面上顯示了當前用戶的address信息。

<%@pageimport="org.jasig.cas.client.authentication.AttributePrincipal" %>

<%@pageimport="org.jasig.cas.client.validation.Assertion" %>

<%@page import="java.util.*" %>

<%

String loginName1 = request.getRemoteUser();

%>

request.getRemoteUser(): <%=loginName1%><br/>

<%

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

String loginName2 = principal.getName();

%>

request.getUserPrincipal().getName():<%=loginName2%><br/>

<%

Object object =request.getSession().getAttribute("_const_cas_assertion_");

Assertion assertion =(Assertion)object;

String loginName3 =assertion.getPrincipal().getName();

%>

request.getSession().getAttribute("_const_cas_assertion_").getPrincipal().getName():<%=loginName3%><br/>

  • 上一篇:老友記得演員們還演了什麽?
  • 下一篇:哪個軟件有CRM客戶端系統?
  • copyright 2024編程學習大全網