國內私募機構九鼎控股打造APP,來就送 20元現金領取地址:
http://jdb.jiudingcapital.com/phone.html
內部邀請碼: C8E245J (不寫邀請碼,沒有現金送)
國內私募機構九鼎控股打造,九鼎投資是在全國股份轉讓系統掛牌的公眾公司,股票代碼為430719,為“中國PE第一股”,市值超1000億元。
內部邀請碼: 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:
然后再在 web.xml 中加入:
因為使用到了 Restlat 框架,所以還需要依賴幾個 jar 包,分別是:
這幾個jar已經打包在附件中了,另外 restlet.org 的 maven庫中也有,需要的話可以去 maven.restlet.org 上找。
另外關於 restlet的配置在 cas-server中已經存在在: /WEB-INF/restlet-servlet.xml文件。
配置OK之后直接啟動Server,下面來進行簡單登錄驗證的測試:
1. 提交用戶名密碼及Service 進行登錄驗證
在以上Response信息及 Header中可以看到生成的 TGT,接下來是再重新根據 TGT 獲取 ST,將請求的 URI 地址就是以上 Header中的 Location地址。
2. 根據返回的 TGT 來獲取 ST
獲取成功之后則返回了 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. 注銷用戶
注銷用戶就很簡單了,直接 SUBMIT DELETE 刪除 TGT即可.
Java代碼調用示例:
參考: https://wiki.jasig.org/display/CASUM/RESTful+API
關於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:
- <dependency>
- <groupId>org.jasig.cas</groupId>
- <artifactId>cas-server-integration-restlet</artifactId>
- <version>3.4.2.1</version>
- <type>jar</type>
- </dependency>
然后再在 web.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 進行登錄驗證
- 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
- 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. 注銷用戶
- 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
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