1. 程式人生 > >CAS返回物件的更多屬性Assertion.getPrincipal().getAttributes()

CAS返回物件的更多屬性Assertion.getPrincipal().getAttributes()

伺服器,在返回給客戶端使用者資訊時,預設只返回使用者名稱(我們已經修改成ID).但有時我們需要更多的屬性資訊,如使用者名稱。

則應做如下修改:

使用者登入成功以後,CAS使用一個credentialsToPrincipalResolvers將credentials轉成Principal物件,此物件只有一個實現類如下.
SimplePrincipal的構造方法接收兩個引數,一個是使用者的id,一個為使用者的其他屬性。使用者的ID預設為使用者登入時使用的使用者名稱,前面第4點已經講過如何將使用者的name換成使用者的id返回給客戶端。為了給客戶端返回更多的屬性,我們必須要給Principal的構造方法傳遞第二個引數,它是一個Map<String,Object>型別。

具體程式碼如下:

package cn.itcast.pubs;

import java.util.HashMap;

import java.util.Map;

import javax.sql.DataSource;

import org.jasig.cas.authentication.principal.Credentials;

import org.jasig.cas.authentication.principal.CredentialsToPrincipalResolver;

import org.jasig.cas.authentication.principal.Principal;

import org.jasig.cas.authentication.principal.SimplePrincipal;

import org.jasig.cas.authentication.principal.UsernamePasswordCredentials;

import org.springframework.jdbc.core.JdbcTemplate;

public class MyCredentialsToPrincipalResolver implements CredentialsToPrincipalResolver {

private DataSource dataSource;//查詢資料庫用

@Override

public Principal resolvePrincipal(Credentials credentials) {

System.err.println("將憑據轉換成被代理人:"+credentials);

UsernamePasswordCredentials up = //強制型別轉換

(UsernamePasswordCredentials) credentials;

String name = up.getUsername();

String pwd  = up.getPassword();

String sql = "select id from users2 where u2_name=? and u2_pwd=?"; //查詢id

String id  = null;

try{

id=new JdbcTemplate(getDataSource()).queryForObject(sql, String.class, name,pwd);

if(id!=null){

//封裝其他資訊

Map<String,Object> attrs = new HashMap<String,Object>();

attrs.put("username",name);

attrs.put("pwd",pwd);

Principal p = new SimplePrincipal(id,attrs);//封裝成包含id的Principal物件

System.err.println("生成的屬性值是::"+attrs);

return p;

}

}catch(Exception e){

e.printStackTrace();

}

return null;

}

@Override

public boolean supports(Credentials credentials) {

boolean boo =  //判斷是否是使用者和密碼憑據 

UsernamePasswordCredentials.class.isAssignableFrom(credentials.getClass());

return boo;

}

public DataSource getDataSource() {

return dataSource;

}

public void setDataSource(DataSource dataSource) {

this.dataSource = dataSource;

}

}


但,它並不會馬上顯示到客戶端,如果要顯示到客戶端,因為伺服器驗證成功以後,是通過xml形式將結果傳遞給客戶端的,xml的生成由casServiceValidationSuccess.jsp檔案負責。它的具體構造應該是以下形式:

<cas:serviceResponse

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

    <cas:authenticationSuccess>

       <cas:user>U001</cas:user>

       <cas:attributes>

              <cas:pwd>1234</cas:pwd>

              <cas:username>Jack</cas:username>

       </cas:attributes>

    </cas:authenticationSuccess>

</cas:serviceResponse>

在上面的程式碼中,cas:attributes元素是筆者新增的,客戶端的的Filter在接收到上述的XML以後,會將css:attributes中的屬性解析出來,放到AttirubtePrincipal的attributes屬性中去(或是放到Asseration的attributes中去,兩個只會放一個)。

所以,組成上面的<cas :attributes>元素中的內容,就成了如何傳遞更多屬性的關鍵,在修改了MyCredentialsToPrincipalResolver的程式碼以後,然後還必須要修改casServiceValidationSuccess.jsp的程式碼如下:

<%@ page session="false"contentType="text/xml; charset=UTF-8"%><%@taglib

    prefix="c"uri="http://java.sun.com/jsp/jstl/core"%><%@taglib

    uri="http://java.sun.com/jsp/jstl/functions"prefix="fn"%><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:iftest="${not emptypgtIou}">

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

       </c:if>

       <c:iftest="${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:attributes>

<c:forEach

               items="${assertion.chainedAuthentications[fn:length(assertion.chainedAuthentications)-1].principal.attributes}"

              var="attr">

<cas:${attr.key}>${attr.value}</cas:${attr.key}>

</c:forEach>

</cas:attributes>

    </cas:authenticationSuccess>

</cas:serviceResponse>

然後修改deployerConfigContext.xml檔案,將最後一個配置項:serviceRegistryDao中的所有屬性全部刪除或是登出。

或者修改如下配置

    <bean id="serviceRegistryDao" class="org.jasig.cas.services.InMemoryServiceRegistryDaoImpl">
        <property name="registeredServices">
            <list>
                <bean class="org.jasig.cas.services.RegisteredServiceImpl">
                    <property name="id" value="0" />
                    <property name="name" value="HTTP" />
                    <property name="description" value="Only Allows HTTP Urls" />
                    <property name="serviceId" value="http://**" />          
                </bean>

                <bean class="org.jasig.cas.services.RegisteredServiceImpl">
                    <property name="id" value="1" />
                    <property name="name" value="HTTPS" />
                    <property name="description" value="Only Allows HTTPS Urls" />
                    <property name="serviceId" value="https://**" />              
                </bean>

                <bean class="org.jasig.cas.services.RegisteredServiceImpl">
                    <property name="id" value="2" />
                    <property name="name" value="IMAPS" />
                    <property name="description" value="Only Allows HTTPS Urls" />
                    <property name="serviceId" value="imaps://**" />             
                </bean>

                <bean class="org.jasig.cas.services.RegisteredServiceImpl">
                    <property name="id" value="3" />
                    <property name="name" value="IMAP" />
                    <property name="description" value="Only Allows IMAP Urls" />
                    <property name="serviceId" value="imap://**" />               
                </bean>
            </list>
        </property>


為:
  <bean id="serviceRegistryDao" class="org.jasig.cas.services.InMemoryServiceRegistryDaoImpl">
        <property name="registeredServices">
            <list>
                <bean class="org.jasig.cas.services.RegisteredServiceImpl">
                    <property name="id" value="0" />
                    <property name="name" value="HTTP" />
                    <property name="description" value="Only Allows HTTP Urls" />
                    <property name="serviceId" value="http://**" />
                    <property name="ignoreAttributes" value="true" />
                </bean>

                <bean class="org.jasig.cas.services.RegisteredServiceImpl">
                    <property name="id" value="1" />
                    <property name="name" value="HTTPS" />
                    <property name="description" value="Only Allows HTTPS Urls" />
                    <property name="serviceId" value="https://**" />    
                    <property name="ignoreAttributes" value="true" />
                </bean>

                <bean class="org.jasig.cas.services.RegisteredServiceImpl">
                    <property name="id" value="2" />
                    <property name="name" value="IMAPS" />
                    <property name="description" value="Only Allows HTTPS Urls" />
                    <property name="serviceId" value="imaps://**" />
                    <property name="ignoreAttributes" value="true" />
                </bean>

                <bean class="org.jasig.cas.services.RegisteredServiceImpl">
                    <property name="id" value="3" />
                    <property name="name" value="IMAP" />
                    <property name="description" value="Only Allows IMAP Urls" />
                    <property name="serviceId" value="imap://**" />
                    <property name="ignoreAttributes" value="true" />
                </bean>
            </list>
        </property>


這個bean中的RegisteredServiceImplignoreAttributes屬性將決定是否新增attributes屬性內容,預設為false:不新增,只有去掉這個配置,
cas server
才會將獲取的使用者的附加屬性新增到認證用的Principalattributes中去。

然後即可以在頁面上通過以下方式獲取使用者的其他屬性:

    <%

       Assertion assertion = AssertionHolder.getAssertion();

       AttributePrincipal ap =  assertion.getPrincipal();   //獲取AttributePrincipal物件,這是客戶端物件

       String name = ap.getName();

       Map<String,Object> att = ap.getAttributes();//獲取屬性值,為一個Map型別。

       out.print("<br/>"+name);

       out.print("<br/>"+att);

%>

相關推薦

CAS返回物件屬性Assertion.getPrincipal().getAttributes()

伺服器,在返回給客戶端使用者資訊時,預設只返回使用者名稱(我們已經修改成ID).但有時我們需要更多的屬性資訊,如使用者名稱。 則應做如下修改: 使用者登入成功以後,CAS使用一個credentialsToPrincipalResolvers將credentials轉成Pri

CAS統一登入認證(10): 返回認證使用者屬性

在做客戶端認證過程中,有些系統不但需要賬號,還需要如卡號,mail等其它資訊,預設cas認證後返回的是認證賬號,要返回多屬性,還要做些設定,記錄如下: 環境:cas5.3.2 + ldap 首先,服務端要支援返回多屬性: 1. application.properties 在原配置好ca

CAS 5.1.5版本屬性返回

預設情況下單點登入只返回登入的使用者名稱,不會返回其它的使用者資訊。如果想要返回更多的使用者資訊,我們需要進行擴充套件開發。比如返回使用者的id,cas客戶端從請求中獲取登入使用者的id。本文是基於CAS 5.1.X版本自定義jdbc驗證這篇文章進行敘述。

CAS服務端返回的使用者登入資訊

從cas server登入成功後,預設只能從cas server得到使用者名稱。但程式中也可能遇到需要得到更多如姓名,手機號,email等更多使用者資訊的情況。cas client拿到使用者名稱後再

CAS SSO 4.0 單點登入返回使用者資訊

從cas server登入成功後,預設只能從cas server得到使用者名稱。但程式中也可能遇到需要得到更多如姓名,手機號,email等更多使用者資訊的情況。 cas client拿到使用者名稱後再到資料庫中查詢,的確可以得到關於該使用者的更多資訊。 但是如果使用者登入成

Java 物件按照屬性來合併。

private static final String detailId="detailId"; private static final String shelfBinCode="shelfBinCode"; /** * 相同商品+相同貨架相同貨位合併 * @para

【轉】java list按照 物件 指定個欄位屬性進行排序

話不多說,上程式碼: package PjectUtils; import java.lang.reflect.Field; import java.text.NumberFormat; import java.util.Collections; import java

面向物件說明

面向物件的軟體開發 很多人在學完了python的class機制之後,遇到一個生產中的問題,還是會懵逼,這其實太正常了,因為任何程式的開發都是先設計後程式設計,python的class機制只不過是一種程式設計方式,如果你硬要拿著class去和你的問題死磕,變得更加懵逼都是分分鐘的事,在以前,軟體的開發相對簡單

Servlet與jquery ajax測試讀取返回物件屬性

這個例子測試感覺很麻煩,網上找了好多,終於搞出來了。 這裡以返回一個物件為例 public class people { private String name; private i

Python面向物件程式設計(類和例項 訪問限制 繼承和型 獲取物件資訊 例項屬性和類屬性

面向物件程式設計——Object Oriented Programming,簡稱OOP,是一種程式設計思想。OOP把物件作為程式的基本單元,一個物件包含了資料和操作資料的函式。 資料封裝、繼承和多型是面向物件的三大特點 在Python中,所有資料型別都可以視

ExtJs中元件最好少使用ID屬性(推薦使用Name屬性

因為在不為元件指定ID的情況下,預設為其自動分配id;如果手動指定ID,系統就會以此為準。 但是往往在系統中,尤其是使用TabPanel的情況下,一下載入了多個JS頁面,很容易出現多個元件使用重複的一個ID都情況,當關閉某個tab頁,卻因為別的tab頁存在相同id的元件無法銷燬該頁面元件;而且在使用E

C#返回object物件的指定屬性

以object型別的物件返回其Shape屬性為例。 /// <summary> /// 返回Object物件的指定屬性 /// </s

編寫函數,接受一個string,返回一個bool值,指出string是否有5個或者字符,使用此函數打印出長度大於等於5的元素

isf 打印 元素 erase tor 編寫 The 長度 red #include <algorithm> using namespace std; bool isFive(const string& s1) { return s1.s

Ubuntu啟用3D桌面和的窗口動畫

config con nbsp 是我 sta alt app 還需要 找到 Ubuntu(確切的說是Ubuntu天朝定制版簡稱優麒麟)才是我最早接觸的一個Linux發行,比較搞笑的是,那個時候我還坐在網吧玩星際2。 剛開始玩的時候,尤其喜歡優麒麟那個窗口動畫以及在切換的時候

我會采的雛菊

能夠 這樣的 想象 木馬 旅行 什麽 每天 一點 分數 如果我能過從頭來過, 我會試著犯更多的錯。 我會放松一點,我會靈魂一點。 我會比這一趟過的更傻。 很少有什麽事能讓我當真。 我會瘋狂一些,我會少講點衛生。 我會冒更多的險,我會更經常的旅行。

vue2 mint-ui loadmore(下拉刷新,上拉)

eat move ott 上拉更多 line col pst first pin <template> <div class="page-loadmore"> <h1 class="page-title">Pull u

Win7系統下調整硬盤分區大小給C盤的空間

-1 鼠標 一個 ima 電腦安裝 壓縮 計算機名 操作 彈出 電腦安裝了很多程序,C盤空間越來越小了。如何給C盤調整更多的空間,其實只要調整硬盤分區大小便可解決這個問題,下面有個小技巧,需要的朋友照做就可以了 Win7系統下如何調整硬盤分區大小,以前裝系統的時候只給C盤

JS實現移動端下拉刷新分頁請求功能方法2.0

keyframes 發生 usb 第一次 odr back eight urn 返回頂部 本次2.0升級版為js實現移動端加載更多下拉刷新更多分頁請求功能方法(數據一次請求,前端分頁,適用於數據流量較少,數據量壓力小的頁面)同時新增loading組件,turnToTop組件

請牢記以上幾點,做到讓人願意與你為友

打開 san 無限 你會 並發 span 交朋友 col 若有 請牢記以上幾點,做到讓更多人願意與你為友。若有下一點,你會吸住更多人才的。 第一:你有用。你能帶給人家實用價值。 第二:你有料。跟你相處能打開眼界,放大格局。 第三:你有量。你能傾聽別人的想法並發表有價值的見

arttemplate模板引擎有假數據返回數據層內嵌的渲染方法

錯誤 一個 scala pan 制作 nes 國家 引擎 求和 1 <!DOCTYPE html> 2 <html lang="en"> 3 4 <head> 5 <meta charset="