日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

CAS 之 集成RESTful API

發布時間:2025/3/21 编程问答 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 CAS 之 集成RESTful API 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
國內私募機構九鼎控股打造APP,來就送?20元現金領取地址:http://jdb.jiudingcapital.com/phone.html
內部邀請碼:C8E245J?(不寫邀請碼,沒有現金送)
國內私募機構九鼎控股打造,九鼎投資是在全國股份轉讓系統掛牌的公眾公司,股票代碼為430719,為“中國PE第一股”,市值超1000億元。?

?

------------------------------------------------------------------------------------------------------------------------------------------------------------------

?

?

原文地址:?http://denger.iteye.com/blog/973068

最近因為公司另一款基于C/S的產品也需要整合到CAS 的 SSO,但是 CAS 本身對于客戶端或瀏覽器而言是基于其COOKIE來存儲用戶(TGT)Ticket的,所以這時候就需要使用 CAS 的 RestFul API 來進行登錄驗證,并支持在C/S軟件中點擊用戶頭象時打開瀏覽器并跳轉至用戶中心,而且這時候在 WEB 上應該是已登錄的狀態(類似QQ點擊自己的頭象時,馬上就進入到了QQ空間。)?

???? 關于CAS的登錄驗證流程,可以參考“CAS 之 實現用戶注冊后自動登錄”,這里的RESTful登錄驗證流程與其大致相似,大體流程為:首先客戶端提交用戶名、密碼、及Service三個參數,如果驗證成功便返回用戶的TGT(Ticket Granting Ticket)至客戶端, 然后客戶端再根據 TGT 獲取用戶的 ST(Service Ticket)來進行驗證登錄。 故名思意,TGT是用于生成一個新的Ticket(ST)的Ticket,而ST則是提供給客戶端用于登錄的Ticket,兩者最大的區別在于,TGT是用戶名密碼驗證成功之后所生成的Ticket,并且會保存在Server中及Cookie中,而ST則必須是是根據TGT來生成,主要用于登錄,并且當登錄成功之后 ST 則會失效。?

???? CAS本身已經提供了 restlet 的集成包,如果你用的是 maven 的話直接加入,我這里的Cas-server的版本是 3.4.2.1:?
Xml代碼??
  • <dependency>??
  • ????<groupId>org.jasig.cas</groupId>??
  • ????<artifactId>cas-server-integration-restlet</artifactId>??
  • ????<version>3.4.2.1</version>??
  • ????<type>jar</type>??
  • </dependency>??

  • ???? 然后再在 web.xml 中加入:?
    Xml代碼??
  • <servlet>??
  • ????????<servlet-name>restlet</servlet-name>??
  • ????????<servlet-class>com.noelios.restlet.ext.spring.RestletFrameworkServlet</servlet-class>??
  • ????????<load-on-startup>1</load-on-startup>??
  • ????</servlet>??
  • ??
  • ????<servlet-mapping>??
  • ????????<servlet-name>restlet</servlet-name>??
  • ????????<url-pattern>/v1/*</url-pattern>??
  • ????</servlet-mapping>??


  • ??? 因為使用到了 Restlat 框架,所以還需要依賴幾個 jar 包,分別是:?
    • ???? com.noelios.restlet.ext.servlet.jar
    • ???? com.noelios.restlet.ext.spring-1.1.0.jar
    • ???? com.noelios.restlet.jar
    • ???? org.restlet-1.1.10.jar
    • ???? org.restlet.ext.spring-1.1.10.jar

    ?? 這幾個jar已經打包在附件中了,另外 restlet.org 的 maven庫中也有,需要的話可以去?maven.restlet.org?上找。
    ?? 另外關于 restlet的配置在 cas-server中已經存在在: /WEB-INF/restlet-servlet.xml文件。?

    ?? 配置OK之后直接啟動Server,下面來進行簡單登錄驗證的測試:?

    ?? 1. 提交用戶名密碼及Service 進行登錄驗證?
    ?????? Shell代碼??
  • DengerMacBook:cas-server?denger$?curl?-i?-X??POST?-d?"username=admin&password=123456&service=http://www.google.com"?http://192.168.41.107:8080/member/v1/tickets/??
  • ??
  • HTTP/1.1?201?Created??
  • Date:?Wed,?23?Mar?2011?12:42:52?GMT??
  • Location:?http://192.168.41.107:8080/member/v1/tickets/TGT-14-gDOn9hhSYmq3xfeTRNhTAjZgOMdCdyuVNfsuLRs6onNv7fVmmX-cas??
  • Accept-Ranges:?bytes??
  • Server:?Noelios-Restlet-Engine/1.1.6??
  • Content-Type:?text/html;charset=ISO-8859-1??
  • Content-Length:?437??
  • ??
  • <!DOCTYPE?HTML?PUBLIC?"-//IETF//DTD?HTML?2.0//EN"><html><head><title>201?The?request?has?been?fulfilled?and?resulted?in?a?new?resource?being?created</title></head><body><h1>TGT?Created</h1><form?action="http://192.168.41.107:8080/member/v1/tickets/TGT-14-gDOn9hhSYmq3xfeTRNhTAjZgOMdCdyuVNfsuLRs6onNv7fVmmX-cas"?method="POST">Service:<input?type="text"?name="service"?value=""><br><input?type="submit"?value="Submit"></form></body></html>??

  • ??? 在以上Response信息及 Header中可以看到生成的 TGT,接下來是再重新根據 TGT 獲取 ST,將請求的 URI 地址就是以上 Header中的 Location地址。?

    ?? 2. 根據返回的 TGT 來獲取 ST?
    ??? Shell代碼??
  • DengerMacBook:cas-server?denger$?curl?-i??-X?POST?-d?"service=http://www.google.com"?http://192.168.41.107:8080/member/v1/tickets/TGT-14-gDOn9hhSYmq3xfeTRNhTAjZgOMdCdyuVNfsuLRs6onNv7fVmmX-cas??
  • ??
  • HTTP/1.1?200?OK??
  • Date:?Wed,?23?Mar?2011?12:48:03?GMT??
  • Accept-Ranges:?bytes??
  • Server:?Noelios-Restlet-Engine/1.1.6??
  • Content-Type:?text/plain;charset=ISO-8859-1??
  • Content-Length:?29??
  • ??
  • ST-2-lJfQyJMMEnNGnKcglf1d-cas??

  • ??? 獲取成功之后則返回了 ST,這時候對于客戶端而言就已經拿到了登錄的TIcket, 如果需要在Web中自動登錄的話,只需要彈出瀏覽器,將ST作為 ticket參數傳入即可。如,用戶中心的后臺地址首頁是:http://www.google.com.hk/userCenter 則URL為:? http://www.google.com.hk/userCenter?ticket=ST-3-9QkpLsFmCEqIXSVvGH9P-cas 并可進行登錄。 當然前提是在該Web應用中需要部署cas-client應用。?

    ?? 3. 注銷用戶?
    ?? Shell代碼??
  • DengerMacBook:cas-server?denger$?curl?-i??-X?DELETE?http://192.168.41.107:8080/member/v1/tickets/TGT-14-gDOn9hhSYmq3xfeTRNhTAjZgOMdCdyuVNfsuLRs6onNv7fVmmX-cas??
  • ??
  • HTTP/1.1?200?OK??
  • Date:?Wed,?23?Mar?2011?12:54:28?GMT??
  • Accept-Ranges:?bytes??
  • Server:?Noelios-Restlet-Engine/1.1.6??
  • Content-Length:?0??
  • ? 注銷用戶就很簡單了,直接 SUBMIT DELETE 刪除 TGT即可.?

    ??Java代碼調用示例:?
    Java代碼??
  • package?cas;??
  • ??
  • import?java.io.IOException;??
  • import?java.util.logging.Logger;??
  • import?java.util.regex.Matcher;??
  • import?java.util.regex.Pattern;??
  • ??
  • import?org.apache.commons.httpclient.HttpClient;??
  • import?org.apache.commons.httpclient.NameValuePair;??
  • import?org.apache.commons.httpclient.methods.PostMethod;??
  • ??
  • ??
  • public?final?class?Client??
  • {??
  • ??private?static?final?Logger?LOG?=?Logger.getLogger(Client.class.getName());??
  • ??
  • ??private?Client()??
  • ??{??
  • ????//?static-only?access??
  • ??}??
  • ??
  • ??public?static?String?getTicket(final?String?server,?final?String?username,??
  • ??????final?String?password,?final?String?service)??
  • ??{??
  • ????notNull(server,?"server?must?not?be?null");??
  • ????notNull(username,?"username?must?not?be?null");??
  • ????notNull(password,?"password?must?not?be?null");??
  • ????notNull(service,?"service?must?not?be?null");??
  • ??
  • ????return?getServiceTicket(server,?getTicketGrantingTicket(server,?username,??
  • ????????password),?service);??
  • ??}??
  • ??
  • ??private?static?String?getServiceTicket(final?String?server,??
  • ??????final?String?ticketGrantingTicket,?final?String?service)??
  • ??{??
  • ????if?(ticketGrantingTicket?==?null)??
  • ??????return?null;??
  • ??
  • ????final?HttpClient?client?=?new?HttpClient();??
  • ??
  • ????final?PostMethod?post?=?new?PostMethod(server?+?"/"?+?ticketGrantingTicket);??
  • ??
  • ????post.setRequestBody(new?NameValuePair[]?{?new?NameValuePair("service",??
  • ????????service)?});??
  • ??
  • ????try??
  • ????{??
  • ??????client.executeMethod(post);??
  • ??
  • ??????final?String?response?=?post.getResponseBodyAsString();??
  • ??
  • ??????switch?(post.getStatusCode())??
  • ??????{??
  • ????????case?200:??
  • ??????????return?response;??
  • ??
  • ????????default:??
  • ??????????LOG.warning("Invalid?response?code?("?+?post.getStatusCode()??
  • ??????????????+?")?from?CAS?server!");??
  • ??????????LOG.info("Response?(1k):?"??
  • ??????????????+?response.substring(0,?Math.min(1024,?response.length())));??
  • ??????????break;??
  • ??????}??
  • ????}??
  • ??
  • ????catch?(final?IOException?e)??
  • ????{??
  • ??????LOG.warning(e.getMessage());??
  • ????}??
  • ??
  • ????finally??
  • ????{??
  • ??????post.releaseConnection();??
  • ????}??
  • ??
  • ????return?null;??
  • ??}??
  • ??
  • ??private?static?String?getTicketGrantingTicket(final?String?server,??
  • ??????final?String?username,?final?String?password)??
  • ??{??
  • ????final?HttpClient?client?=?new?HttpClient();??
  • ??
  • ????final?PostMethod?post?=?new?PostMethod(server);??
  • ??
  • ????post.setRequestBody(new?NameValuePair[]?{??
  • ????????new?NameValuePair("username",?username),??
  • ????????new?NameValuePair("password",?password)?});??
  • ??
  • ????try??
  • ????{??
  • ??????client.executeMethod(post);??
  • ??
  • ??????final?String?response?=?post.getResponseBodyAsString();??
  • ??
  • ??????switch?(post.getStatusCode())??
  • ??????{??
  • ????????case?201:??
  • ????????{??
  • ??????????final?Matcher?matcher?=?Pattern.compile(".*action=\".*/(.*?)\".*")??
  • ??????????????.matcher(response);??
  • ??
  • ??????????if?(matcher.matches())??
  • ????????????return?matcher.group(1);??
  • ??
  • ??????????LOG??
  • ??????????????.warning("Successful?ticket?granting?request,?but?no?ticket?found!");??
  • ??????????LOG.info("Response?(1k):?"??
  • ??????????????+?response.substring(0,?Math.min(1024,?response.length())));??
  • ??????????break;??
  • ????????}??
  • ??
  • ????????default:??
  • ??????????LOG.warning("Invalid?response?code?("?+?post.getStatusCode()??
  • ??????????????+?")?from?CAS?server!");??
  • ??????????LOG.info("Response?(1k):?"??
  • ??????????????+?response.substring(0,?Math.min(1024,?response.length())));??
  • ??????????break;??
  • ??????}??
  • ????}??
  • ??
  • ????catch?(final?IOException?e)??
  • ????{??
  • ??????LOG.warning(e.getMessage());??
  • ????}??
  • ??
  • ????finally??
  • ????{??
  • ??????post.releaseConnection();??
  • ????}??
  • ??
  • ????return?null;??
  • ??}??
  • ??
  • ??private?static?void?notNull(final?Object?object,?final?String?message)??
  • ??{??
  • ????if?(object?==?null)??
  • ??????throw?new?IllegalArgumentException(message);??
  • ??}??
  • ??
  • ??public?static?void?main(final?String[]?args)??
  • ??{??
  • ????final?String?server?=?"http://192.168.41.107:8080/member/v1/tickets";??
  • ????final?String?username?=?"admin";??
  • ????final?String?password?=?"111111";??
  • ????final?String?service?=?"http://localhost:8080/service";??
  • ??
  • ????LOG.info(getTicket(server,?username,?password,?service));??
  • ??}??
  • }??

  • ?? 參考:https://wiki.jasig.org/display/CASUM/RESTful+API
    • restlet.zip?(457.7 KB)
    • 下載次數: 434

    總結

    以上是生活随笔為你收集整理的CAS 之 集成RESTful API的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。