【Tech】CAS RESTful API使用筆記


在被maven,cas,tomcat各種賤人就是矯情的虐了好幾天之后,終於跑通了demo,哈哈哈哈哈哈哈~

在這里詳細記錄一下,給和我一樣連maven都不會的小白一點福利,同時歡迎大神指正。

 

首先上最好的參考資料:http://stackoverflow.com/questions/22625368/working-java-rest-client-example-to-access-cas-rest-api

這個大神講的非常清楚了,只要跟着他的步驟一定是可以的,但是。。。大神一句話,通常我要花一天來理解。

另外還有官方的參考資料:

https://wiki.jasig.org/display/CASUM/Best+Practice+-+Setting+Up+CAS+Locally+using+the+Maven+WAR+Overlay+Method

https://wiki.jasig.org/display/casum/restful+api

 

這篇博客的基礎是單點登錄系統CAS服務器端搭建及實現用戶名密碼由MYSQL數據庫驗證這篇文章,在調用rest ful API之前,首先要保證:

1.tomcat配置好,支持https,檢驗的標准是通過https://localhost:8443/可以訪問到tomcat;

2.知道怎么部署cas官網上的打好包的server,檢驗的標准是通過https://localhost:8443/cas/login可以訪問到cas server;

3.知道怎么將server和MYSQL連接使用,檢驗的標准是可以通過MYSQL中的用戶名,密碼登錄cas server。

以上三點上述博客里都有詳細步驟。

 

以下是restful API使用的詳細步驟:

要調用restful API,首先要在pom.xml里面加入restful API的依賴,然后重新編譯出來一個cas server的war包。

1.安裝Maven

具體步驟我就不詳述了,灰常簡單,參考:http://blog.csdn.net/kenhins/article/details/13298015,需要把本地倉庫配置好。

2.把下面的pom.xml拷貝到一個文件夾里面(隨便一個),命名為pom.xml,這個pom.xml參考了http://pastie.org/4064726#22,30,78,81https://wiki.jasig.org/display/CASUM/Best+Practice+-+Setting+Up+CAS+Locally+using+the+Maven+WAR+Overlay+Method

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <project xmlns="http://maven.apache.org/POM/4.0.0"
 3   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 4   xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
 5 
 6   <parent>
 7     <groupId>org.jasig.cas</groupId>
 8     <artifactId>cas-server</artifactId>
 9     <version>3.4.12</version>
10   </parent>
11 
12   <modelVersion>4.0.0</modelVersion>
13   <groupId>h.usm.my</groupId>
14   <artifactId>cas</artifactId>
15   <packaging>war</packaging>
16   <version>1.0</version>
17   <name>HUSM CAS Web Application</name>
18 
19   <dependencies>
20     <dependency>
21       <groupId>org.jasig.cas</groupId>
22       <artifactId>cas-server-webapp</artifactId>
23       <version>${cas.version}</version>
24       <type>war</type>
25       <scope>runtime</scope>
26     </dependency>
27 
28     <dependency>
29      <groupId>org.jasig.cas</groupId>
30      <artifactId>cas-server-support-jdbc</artifactId>
31      <version>${cas.version}</version>
32    </dependency>
33 
34     <dependency>
35       <groupId>org.jasig.cas</groupId>
36       <artifactId>cas-server-integration-restlet</artifactId>
37       <version>${cas.version}</version>
38       <type>jar</type>
39       <exclusions>
40         <exclusion>
41           <groupId>org.springframework</groupId>
42           <artifactId>spring-web</artifactId>
43         </exclusion>
44       </exclusions>
45     </dependency>
46 
47     <dependency>
48       <groupId>org.hibernate</groupId>
49       <artifactId>hibernate-core</artifactId>
50       <version>${hibernate.core.version}</version>
51       <type>jar</type>
52     </dependency>
53     <dependency>
54       <groupId>org.hibernate</groupId>
55       <artifactId>hibernate-entitymanager</artifactId>
56       <version>3.6.0.Final</version>
57     </dependency>
58   </dependencies>
59 
60   <properties>
61     <cas.version>3.4.12</cas.version>
62     <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
63   </properties>
64 
65   <repositories>
66     <repository>
67       <id>ja-sig</id>
68       <url>http://oss.sonatype.org/content/repositories/releases</url>
69     </repository>
70   </repositories>
71 
72   <build>
73         <plugins>
74             <plugin>
75                  <artifactId>maven-war-plugin</artifactId>
76                              <configuration>
77                                  <warName>cas</warName>
78                              </configuration>
79                         </plugin>
80         </plugins>
81     </build>
82 </project>

3.cd到pom.xml所在的路徑下,然后執行mvn clean package,如下圖所示:

然后就會在pom.xml所在的路徑下得到一個target文件夾,里面的cas.war就是我們新打包好的cas server。

4.把生成的cas.war拷貝到\apache-tomcat-7.0.57\webapps下,啟動tomcat,如果沒有報錯(一個小tip,可從\apache-tomcat-7.0.57\logs\localhost.yy-mm-dd.log中查看具體錯誤),說明我們的cas.war是可以用的。這個時候訪問https://localhost:8443/cas/login即可跳轉到cas的登錄頁面了。

5.接下來配置cas server和MYSQL的連接,使得我們可以用MYSQL數據庫里面的用戶名和密碼登錄。詳細步驟我就省略了,參見上面提到的單點登錄系統CAS服務器端搭建及實現用戶名密碼由MYSQL數據庫驗證這篇文章。

上述5步以后,我們可以從https://localhost:8443/cas/login訪問到cas server的登錄頁面,並且可以用MYSQL中的用戶名和密碼登錄。

6.在G:\Lab\CAS\apache-tomcat-7.0.57\webapps\cas\WEB-INF\web.xml中添加一個servlet:

<!--add a servlet-->
    <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>

保存后打開:https://localhost:8443/cas/v1/tickets會出現如下界面:

說明server端的restful api配置好了。

7. 接下來新建一個eclipse工程,我這里叫做CasTest,然后新建一個類Client.java,內容如下(完整的工程見附錄):

  1 package cas;
  2 
  3 
  4 import java.io.BufferedReader;
  5 import java.io.BufferedWriter;
  6 import java.io.IOException;
  7 import java.io.InputStreamReader;
  8 import java.io.OutputStreamWriter;
  9 import java.net.MalformedURLException;
 10 import java.net.URL;
 11 import java.net.URLConnection;
 12 import java.net.URLEncoder;
 13 
 14 import javax.net.ssl.HttpsURLConnection;
 15 
 16 public class Client {
 17         
 18     
 19     public static void main(String... args) throws Exception
 20     {
 21         String username ="test01";
 22         String password ="psw01";
 23         validateFromCAS(username,password);
 24     }
 25     
 26     public static boolean validateFromCAS(String username, String password) throws Exception
 27     {
 28         
 29         String url = "https://localhost:8443/cas/v1/tickets";
 30         try 
 31         {
 32             HttpsURLConnection hsu = (HttpsURLConnection)openConn(url);
 33             String s =   URLEncoder.encode("username","UTF-8") + "=" + URLEncoder.encode("test01","UTF-8");
 34             s+="&" +URLEncoder.encode("password","UTF-8") + "=" + URLEncoder.encode("psw01","UTF-8");
 35             
 36             System.out.println(s);
 37             OutputStreamWriter out = new OutputStreamWriter(hsu.getOutputStream());
 38             BufferedWriter bwr = new BufferedWriter(out); 
 39             bwr.write(s);
 40             bwr.flush();
 41             bwr.close();
 42             out.close();
 43             
 44             String tgt = hsu.getHeaderField("location");
 45             System.out.println( hsu.getResponseCode());
 46             if(tgt != null && hsu.getResponseCode() == 201)
 47             {
 48                 System.out.println(tgt);
 49                 
 50                 System.out.println("Tgt is : " + tgt.substring( tgt.lastIndexOf("/") +1));
 51                 tgt = tgt.substring( tgt.lastIndexOf("/") +1);
 52                 bwr.close();
 53                 closeConn(hsu);
 54                 
 55                 
 56                 String serviceURL = "http://localhost:8080/CasClient";
 57                 String encodedServiceURL = URLEncoder.encode("service","utf-8") +"=" + URLEncoder.encode(serviceURL,"utf-8");
 58                 System.out.println("Service url is : " + encodedServiceURL);
 59                 
 60                 
 61                 
 62                 String myURL = url+ "/"+ tgt ;
 63                 System.out.println(myURL);
 64                 hsu = (HttpsURLConnection)openConn(myURL);
 65                 out = new OutputStreamWriter(hsu.getOutputStream());
 66                 bwr = new BufferedWriter(out); 
 67                 bwr.write(encodedServiceURL);
 68                 bwr.flush();
 69                 bwr.close();
 70                 out.close();
 71                 
 72                 System.out.println("Response code is:  " + hsu.getResponseCode());
 73                 
 74                 BufferedReader isr = new BufferedReader(   new InputStreamReader(hsu.getInputStream()));
 75                 String line;
 76                 System.out.println( hsu.getResponseCode());
 77                 while ((line = isr.readLine()) != null) {
 78                     System.out.println( line);
 79                 }
 80                 isr.close();
 81                 hsu.disconnect();
 82                 return true;
 83                 
 84             }
 85             else
 86             {
 87                 return false;
 88             }
 89             
 90             
 91         }
 92         catch(MalformedURLException mue)
 93         {
 94             mue.printStackTrace();
 95             throw mue; 
 96              
 97         }
 98         catch(IOException ioe)
 99         {
100             ioe.printStackTrace();
101             throw ioe;
102         }
103         
104         
105         
106         
107         
108     }
109     
110     
111     static URLConnection openConn(String urlk)  throws MalformedURLException, IOException
112     {
113         
114         URL url = new URL(urlk);
115         HttpsURLConnection hsu = (HttpsURLConnection) url.openConnection();
116         hsu.setDoInput(true);
117         hsu.setDoOutput(true);
118         hsu.setRequestMethod("POST");
119         return hsu;
120         
121         
122     }
123     
124     
125     static void closeConn(HttpsURLConnection c)
126     {
127         c.disconnect();
128     }
129     
130     
131     }

這段代碼參考了http://www.dzone.com/snippets/cas-restful-java-client

要配置的地方有4個:

  1)21,22行的username和password,這里改成你數據庫里面存放的username和password

  2)33,34行的username和password,這里改不改都行,因為它只是一行輸出,改了比較好看吧。

  3)29行server存放ticket的地址,這里的localhost需要換成你的server所在的ip地址。

  4)56行的service,即client端的服務網址,理論上可以隨便填,我這里的網址是我這篇單點登錄系統CAS客戶端demo里面建的client的工程,你可以換成百度什么的,我試過了。

8.根據自己的情況配置完上面4個地方后,直接運行工程,就有如下結果了:

可以看到我們成功的獲取到了TGT和ST。

附件:casTest.zip


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM