热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

CAS之集成RESTfulAPI

国内私募机构九鼎控股打造APP,来就送20元现金领取地址:http:jdb.jiudingcapital.comphone.html内部邀请码ÿ
国内私募机构九鼎控股打造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代码  收藏代码
  1. <dependency>  
  2.     <groupId>org.jasig.casgroupId>  
  3.     <artifactId>cas-server-integration-restletartifactId>  
  4.     <version>3.4.2.1version>  
  5.     <type>jartype>  
  6. dependency>  

     然后再在 web.xml 中加入: 
Xml代码  收藏代码
  1. <servlet>  
  2.         <servlet-name>restletservlet-name>  
  3.         <servlet-class>com.noelios.restlet.ext.spring.RestletFrameworkServletservlet-class>  
  4.         <load-on-startup>1load-on-startup>  
  5.     servlet>  
  6.   
  7.     <servlet-mapping>  
  8.         <servlet-name>restletservlet-name>  
  9.         <url-pattern>/v1/*url-pattern>  
  10.     servlet-mapping>  


    因为使用到了 Restlat 框架&#xff0c;所以还需要依赖几个 jar 包&#xff0c;分别是: 
  •      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已经打包在附件中了&#xff0c;另外 restlet.org 的 maven库中也有&#xff0c;需要的话可以去 maven.restlet.org 上找。
   另外关于 restlet的配置在 cas-server中已经存在在&#xff1a; /WEB-INF/restlet-servlet.xml文件。 

   配置OK之后直接启动Server&#xff0c;下面来进行简单登录验证的测试&#xff1a; 

   1. 提交用户名密码及Service 进行登录验证 
      
Shell代码  收藏代码
  1. DengerMacBook:cas-server denger$ curl -i -X  POST -d "username&#61;admin&password&#61;123456&service&#61;http://www.google.com" http://192.168.41.107:8080/member/v1/tickets/  
  2.   
  3. HTTP/1.1 201 Created  
  4. Date: Wed, 23 Mar 2011 12:42:52 GMT  
  5. Location: http://192.168.41.107:8080/member/v1/tickets/TGT-14-gDOn9hhSYmq3xfeTRNhTAjZgOMdCdyuVNfsuLRs6onNv7fVmmX-cas  
  6. Accept-Ranges: bytes  
  7. Server: Noelios-Restlet-Engine/1.1.6  
  8. Content-Type: text/html;charset&#61;ISO-8859-1  
  9. Content-Length: 437  
  10.   
  11. "-//IETF//DTD HTML 2.0//EN">

    TGT Created

    "http://192.168.41.107:8080/member/v1/tickets/TGT-14-gDOn9hhSYmq3xfeTRNhTAjZgOMdCdyuVNfsuLRs6onNv7fVmmX-cas" method&#61;"POST">Service:"text" name&#61;"service" value&#61;"">
    "submit" value&#61;"Submit">  

    在以上Response信息及 Header中可以看到生成的 TGT&#xff0c;接下来是再重新根据 TGT 获取 ST&#xff0c;将请求的 URI 地址就是以上 Header中的 Location地址。 

   2. 根据返回的 TGT 来获取 ST 
   
Shell代码  收藏代码
  1. DengerMacBook:cas-server denger$ curl -i  -X POST -d "service&#61;http://www.google.com" http://192.168.41.107:8080/member/v1/tickets/TGT-14-gDOn9hhSYmq3xfeTRNhTAjZgOMdCdyuVNfsuLRs6onNv7fVmmX-cas  
  2.   
  3. HTTP/1.1 200 OK  
  4. Date: Wed, 23 Mar 2011 12:48:03 GMT  
  5. Accept-Ranges: bytes  
  6. Server: Noelios-Restlet-Engine/1.1.6  
  7. Content-Type: text/plain;charset&#61;ISO-8859-1  
  8. Content-Length: 29  
  9.   
  10. ST-2-lJfQyJMMEnNGnKcglf1d-cas  

    获取成功之后则返回了 ST&#xff0c;这时候对于客户端而言就已经拿到了登录的TIcket, 如果需要在Web中自动登录的话&#xff0c;只需要弹出浏览器&#xff0c;将ST作为 ticket参数传入即可。如&#xff0c;用户中心的后台地址首页是&#xff1a;http://www.google.com.hk/userCenter 则URL为:  http://www.google.com.hk/userCenter?ticket&#61;ST-3-9QkpLsFmCEqIXSVvGH9P-cas 并可进行登录。 当然前提是在该Web应用中需要部署cas-client应用。 

   3. 注销用户 
  
Shell代码  收藏代码
  1. DengerMacBook:cas-server denger$ curl -i  -X DELETE http://192.168.41.107:8080/member/v1/tickets/TGT-14-gDOn9hhSYmq3xfeTRNhTAjZgOMdCdyuVNfsuLRs6onNv7fVmmX-cas  
  2.   
  3. HTTP/1.1 200 OK  
  4. Date: Wed, 23 Mar 2011 12:54:28 GMT  
  5. Accept-Ranges: bytes  
  6. Server: Noelios-Restlet-Engine/1.1.6  
  7. Content-Length: 0  
  注销用户就很简单了&#xff0c;直接 SUBMIT DELETE 删除 TGT即可. 

  Java代码调用示例: 
Java代码  收藏代码
  1. package cas;  
  2.   
  3. import java.io.IOException;  
  4. import java.util.logging.Logger;  
  5. import java.util.regex.Matcher;  
  6. import java.util.regex.Pattern;  
  7.   
  8. import org.apache.commons.httpclient.HttpClient;  
  9. import org.apache.commons.httpclient.NameValuePair;  
  10. import org.apache.commons.httpclient.methods.PostMethod;  
  11.   
  12.   
  13. public final class Client  
  14. {  
  15.   private static final Logger LOG &#61; Logger.getLogger(Client.class.getName());  
  16.   
  17.   private Client()  
  18.   {  
  19.     // static-only access  
  20.   }  
  21.   
  22.   public static String getTicket(final String server, final String username,  
  23.       final String password, final String service)  
  24.   {  
  25.     notNull(server, "server must not be null");  
  26.     notNull(username, "username must not be null");  
  27.     notNull(password, "password must not be null");  
  28.     notNull(service, "service must not be null");  
  29.   
  30.     return getServiceTicket(server, getTicketGrantingTicket(server, username,  
  31.         password), service);  
  32.   }  
  33.   
  34.   private static String getServiceTicket(final String server,  
  35.       final String ticketGrantingTicket, final String service)  
  36.   {  
  37.     if (ticketGrantingTicket &#61;&#61; null)  
  38.       return null;  
  39.   
  40.     final HttpClient client &#61; new HttpClient();  
  41.   
  42.     final PostMethod post &#61; new PostMethod(server &#43; "/" &#43; ticketGrantingTicket);  
  43.   
  44.     post.setRequestBody(new NameValuePair[] { new NameValuePair("service",  
  45.         service) });  
  46.   
  47.     try  
  48.     {  
  49.       client.executeMethod(post);  
  50.   
  51.       final String response &#61; post.getResponseBodyAsString();  
  52.   
  53.       switch (post.getStatusCode())  
  54.       {  
  55.         case 200:  
  56.           return response;  
  57.   
  58.         default:  
  59.           LOG.warning("Invalid response code (" &#43; post.getStatusCode()  
  60.               &#43; ") from CAS server!");  
  61.           LOG.info("Response (1k): "  
  62.               &#43; response.substring(0, Math.min(1024, response.length())));  
  63.           break;  
  64.       }  
  65.     }  
  66.   
  67.     catch (final IOException e)  
  68.     {  
  69.       LOG.warning(e.getMessage());  
  70.     }  
  71.   
  72.     finally  
  73.     {  
  74.       post.releaseConnection();  
  75.     }  
  76.   
  77.     return null;  
  78.   }  
  79.   
  80.   private static String getTicketGrantingTicket(final String server,  
  81.       final String username, final String password)  
  82.   {  
  83.     final HttpClient client &#61; new HttpClient();  
  84.   
  85.     final PostMethod post &#61; new PostMethod(server);  
  86.   
  87.     post.setRequestBody(new NameValuePair[] {  
  88.         new NameValuePair("username", username),  
  89.         new NameValuePair("password", password) });  
  90.   
  91.     try  
  92.     {  
  93.       client.executeMethod(post);  
  94.   
  95.       final String response &#61; post.getResponseBodyAsString();  
  96.   
  97.       switch (post.getStatusCode())  
  98.       {  
  99.         case 201:  
  100.         {  
  101.           final Matcher matcher &#61; Pattern.compile(".*action&#61;\".*/(.*?)\".*")  
  102.               .matcher(response);  
  103.   
  104.           if (matcher.matches())  
  105.             return matcher.group(1);  
  106.   
  107.           LOG  
  108.               .warning("Successful ticket granting request, but no ticket found!");  
  109.           LOG.info("Response (1k): "  
  110.               &#43; response.substring(0, Math.min(1024, response.length())));  
  111.           break;  
  112.         }  
  113.   
  114.         default:  
  115.           LOG.warning("Invalid response code (" &#43; post.getStatusCode()  
  116.               &#43; ") from CAS server!");  
  117.           LOG.info("Response (1k): "  
  118.               &#43; response.substring(0, Math.min(1024, response.length())));  
  119.           break;  
  120.       }  
  121.     }  
  122.   
  123.     catch (final IOException e)  
  124.     {  
  125.       LOG.warning(e.getMessage());  
  126.     }  
  127.   
  128.     finally  
  129.     {  
  130.       post.releaseConnection();  
  131.     }  
  132.   
  133.     return null;  
  134.   }  
  135.   
  136.   private static void notNull(final Object object, final String message)  
  137.   {  
  138.     if (object &#61;&#61; null)  
  139.       throw new IllegalArgumentException(message);  
  140.   }  
  141.   
  142.   public static void main(final String[] args)  
  143.   {  
  144.     final String server &#61; "http://192.168.41.107:8080/member/v1/tickets";  
  145.     final String username &#61; "admin";  
  146.     final String password &#61; "111111";  
  147.     final String service &#61; "http://localhost:8080/service";  
  148.   
  149.     LOG.info(getTicket(server, username, password, service));  
  150.   }  
  151. }  

   参考&#xff1a;https://wiki.jasig.org/display/CASUM/RESTful&#43;API
  • restlet.zip (457.7 KB)
  • 下载次数: 434

转:https://www.cnblogs.com/AloneSword/p/3321780.html



推荐阅读
  • boot集成的邮箱 spring_spring boot集成mybatis(2) – 使用pagehelper实现分页
    章节SpringBoot介绍SpringBoot开发环境搭建(Eclipse)SpringBootHelloWorld(restful接口)例子spri ... [详细]
  • Android系统移植与调试之如何修改Android设备状态条上音量加减键在横竖屏切换的时候的显示于隐藏
    本文介绍了如何修改Android设备状态条上音量加减键在横竖屏切换时的显示与隐藏。通过修改系统文件system_bar.xml实现了该功能,并分享了解决思路和经验。 ... [详细]
  • r2dbc配置多数据源
    R2dbc配置多数据源问题根据官网配置r2dbc连接mysql多数据源所遇到的问题pom配置可以参考官网,不过我这样配置会报错我并没有这样配置将以下内容添加到pom.xml文件d ... [详细]
  • iOS超签签名服务器搭建及其优劣势
    本文介绍了搭建iOS超签签名服务器的原因和优势,包括不掉签、用户可以直接安装不需要信任、体验好等。同时也提到了超签的劣势,即一个证书只能安装100个,成本较高。文章还详细介绍了超签的实现原理,包括用户请求服务器安装mobileconfig文件、服务器调用苹果接口添加udid等步骤。最后,还提到了生成mobileconfig文件和导出AppleWorldwideDeveloperRelationsCertificationAuthority证书的方法。 ... [详细]
  • Activiti7流程定义开发笔记
    本文介绍了Activiti7流程定义的开发笔记,包括流程定义的概念、使用activiti-explorer和activiti-eclipse-designer进行建模的方式,以及生成流程图的方法。还介绍了流程定义部署的概念和步骤,包括将bpmn和png文件添加部署到activiti数据库中的方法,以及使用ZIP包进行部署的方式。同时还提到了activiti.cfg.xml文件的作用。 ... [详细]
  • 七、使用Angular命令行界面的渐进式网络应用正如我们在第3章中提到的理解A ... [详细]
  • 转载自http:blog.csdn.netzhifeiyu2008articledetails8829637打开Java的JAR文件我们经常可以看到文件中包含着一个META-INF ... [详细]
  • 本文讨论了Alink回归预测的不完善问题,指出目前主要针对Python做案例,对其他语言支持不足。同时介绍了pom.xml文件的基本结构和使用方法,以及Maven的相关知识。最后,对Alink回归预测的未来发展提出了期待。 ... [详细]
  • 本文介绍了在SpringBoot中集成thymeleaf前端模版的配置步骤,包括在application.properties配置文件中添加thymeleaf的配置信息,引入thymeleaf的jar包,以及创建PageController并添加index方法。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • flowable工作流 流程变量_信也科技工作流平台的技术实践
    1背景随着公司业务发展及内部业务流程诉求的增长,目前信息化系统不能够很好满足期望,主要体现如下:目前OA流程引擎无法满足企业特定业务流程需求,且移动端体 ... [详细]
  • centos安装Mysql的方法及步骤详解
    本文介绍了centos安装Mysql的两种方式:rpm方式和绿色方式安装,详细介绍了安装所需的软件包以及安装过程中的注意事项,包括检查是否安装成功的方法。通过本文,读者可以了解到在centos系统上如何正确安装Mysql。 ... [详细]
  • 开发笔记:spring boot项目打成war包部署到服务器的步骤与注意事项
    本文介绍了将spring boot项目打成war包并部署到服务器的步骤与注意事项。通过本文的学习,读者可以了解到如何将spring boot项目打包成war包,并成功地部署到服务器上。 ... [详细]
  • 于2012年3月份开始接触OpenStack项目,刚开始之处主要是与同事合作共同部署公司内部的云平台,使得公司内部服务器能更好的得到资源利用。在部署的过程中遇到各种从未遇到过的问题 ... [详细]
  • Java开发基础——JSON数据的构造与解析
    JSON是我们在数据传输中最常用的格式,一般在RESTful的接口设计中返回的一般都是JSON。在Java中经常要来完成数据解析的任务。本文就来实现如何在Java中如 ... [详细]
author-avatar
小屁孩你不懂cl
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有