• 【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.57webapps下,启动tomcat,如果没有报错(一个小tip,可从apache-tomcat-7.0.57logslocalhost.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:LabCASapache-tomcat-7.0.57webappscasWEB-INFweb.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

  • 相关阅读:
    与IBM的Lin Sun关于Istio 1.0和微服务的问答
    与IBM的Lin Sun关于Istio 1.0和微服务的问答
    与IBM的Lin Sun关于Istio 1.0和微服务的问答
    各种排序算法汇总
    更改一个链接的文本、URL 以及 target
    使用javascript中读取Xml文件做成的一个二级联动菜单
    HTML DOM 实例
    HTML DOM
    js中邦定事件与解绑支持匿名函数
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
  • 原文地址:https://www.cnblogs.com/sunshineatnoon/p/4119565.html
Copyright © 2020-2023  润新知