手机sso.

  1. 我们知道,CAS SSO是一种WEB SSO,对针对WEB应用的单点登录解决方案。随着移动互联网应用崛起,通常应用群不仅包括WEB应用,常常也包含手机原生应用、桌面应用等C/S架构应用。如何让这些应用也纳入CAS认证服务器的管辖范围,统一认证、统一调度,是我们需要解决的问题。  

手机和桌面应用访问CAS,我们不能直接使用CAS提供的web api。不过CAS提供了一个插件,叫CAS Restlet Integration,该插件提供了CAS API的Restful接口,这个接口可以被程序级调用,这样就给我们手机应用认证带来一种思路。首先,手机应用可以程序方式CAS认证服务器,获得TGT和ST,然后访问配置好CAS Client的应用Server,Server与CAS进行通信验证ST的有效性,如果有效即登录成功。登出处理比较简单,直接访问CAS API删除TGT即可,CAS会通知删除所有登录过应用的登录信息。

 

对 CAS Server,我们要安装Restlet Integration插件,

以CAS Server 3.4.5为例(CAS Server的基本配置参见 CAS Server 部署基本步骤),首先下载CAS Restlet Integration插件包及其依赖包(http://mvnrepository.com/artifact/org.jasig.cas/cas-server-integration-restlet/3.4.5),所需包名列表如下:

cas-server-integration-restlet-3.4.5.jar
cglib-nodep-2.1_3.jar
com.noelios.restlet.ext.servlet-1.1.1.jar
com.noelios.restlet.ext.spring-1.1.1.jar
com.noelios.restlet-1.1.1.jar
org.restlet.ext.spring-1.1.1.jar
org.restlet-1.1.1.jar

然后在web.xml中加入:

 

[html]  view plain copy
  1. <!--   for restful api -->  
  2.   
  3. <servlet>  
  4.     <servlet-name>restlet</servlet-name>  
  5.     <servlet-class>com.noelios.restlet.ext.spring.RestletFrameworkServlet</servlet-class>  
  6.     <load-on-startup>1</load-on-startup>  
  7. </servlet>  
  8.   
  9. <servlet-mapping>  
  10.     <servlet-name>restlet</servlet-name>  
  11.     <url-pattern>/v1/*</url-pattern>  
  12. </servlet-mapping>  


 程序获取TGT,ST和Logout,我们可以参考官方的例子:

                    

[html]  view plain copy
  1. /*   获取tgt和st的API接口是 /v1/tickets */  
  2. private String getTicketGrantingTicket(final String server,final String username, final String password) {  
  3.     final HttpClient client = new HttpClient();  
  4.     final PostMethod post = new PostMethod(server);  
  5.     post.setRequestBody(new NameValuePair[] {  
  6.             new NameValuePair("username", username),  
  7.             new NameValuePair("password", password) });  
  8.     try {  
  9.         client.executeMethod(post);  
  10.         final String response = post.getResponseBodyAsString();  
  11.         switch (post.getStatusCode()) {  
  12.             case 200:  
  13.                 return response;  
  14.             default:  
  15.                 break;  
  16.         }  
  17.     } catch (Exception e) {  
  18.                   
  19.                  } finally {  
  20.         post.releaseConnection();  
  21.     }  
  22.     return null;  
  23. }  
  24.   
  25. @SuppressWarnings("unchecked")  
  26. private String getServiceTicket(final String server,final String ticketGrantingTicket, final String service) {  
  27.     if (ticketGrantingTicket == null) return null;  
  28.     final HttpClient client = new HttpClient();  
  29.     final PostMethod post = new PostMethod(server + "/"+ ticketGrantingTicket);  
  30.     post.setRequestBody(new NameValuePair[] { new NameValuePair("service",service) });  
  31.     try {  
  32.         client.executeMethod(post);  
  33.         final String response = post.getResponseBodyAsString();  
  34.         switch (post.getStatusCode()) {  
  35.             case 200:   
  36.                 return response;  
  37.             default:  
  38.                 break;  
  39.         }  
  40.     } catch (Exception e) {  
  41.           
  42.     } finally {  
  43.         post.releaseConnection();  
  44.     }  
  45.     return null;  
  46. }  

 

[html]  view plain copy
  1. /*   删除tgt的API接口是 /v1/tickets/<tgt> ,delete方法 */  
  2.   
  3. public String logout(String tgt) {  
  4.       
  5.     String result = "success";                
  6.     final HttpClient client = new HttpClient();   
  7.             final DeleteMethod delete = new DeleteMethod(server + "/" + tgt);   
  8.             try {   
  9.                 client.executeMethod(delete);   
  10.                 final String response = delete.getResponseBodyAsString();   
  11.                 switch (delete.getStatusCode()) {   
  12.                         case 200:   
  13.                                         break;   
  14.                         default:   
  15.                                     result = "error";  
  16.                 break;   
  17.                 }   
  18.             } catch (IOException e) {   
  19.                         result = "error";  
  20.   
  21.     }finally{   
  22.                 delete.releaseConnection();   
  23.             }   
  24.             return result;  
  25. }  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值