CAS 之 集成RESTful API
生活随笔
收集整理的這篇文章主要介紹了
CAS 之 集成RESTful API
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
國內私募機構九鼎控股打造APP,來就送?20元現金領取地址:http://jdb.jiudingcapital.com/phone.html
內部邀請碼:C8E245J?(不寫邀請碼,沒有現金送)
國內私募機構九鼎控股打造,九鼎投資是在全國股份轉讓系統掛牌的公眾公司,股票代碼為430719,為“中國PE第一股”,市值超1000億元。?
???? 關于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 包,分別是:?
?? 這幾個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
內部邀請碼: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代碼??
???? 然后再在 web.xml 中加入:?
Xml代碼??
??? 因為使用到了 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代碼??
??? 在以上Response信息及 Header中可以看到生成的 TGT,接下來是再重新根據 TGT 獲取 ST,將請求的 URI 地址就是以上 Header中的 Location地址。?
?? 2. 根據返回的 TGT 來獲取 ST?
??? Shell代碼??
??? 獲取成功之后則返回了 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代碼??
??Java代碼調用示例:?
Java代碼??
?? 參考:https://wiki.jasig.org/display/CASUM/RESTful+API
- restlet.zip?(457.7 KB)
- 下載次數: 434
總結
以上是生活随笔為你收集整理的CAS 之 集成RESTful API的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 跨平台日志清理工具 Log-Cutter
- 下一篇: 基于mini2440的看门狗(裸机)