`
liujiawinds
  • 浏览: 136234 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

CAS在客户端进行验证

    博客分类:
  • cas
阅读更多

1.原理:

用户在发起登录请求,把自己的用户名和密码传到后台,后台使用httpclient进行模拟登录

登录成功后,CAS服务器会给httpclient发一个cookie(TGT,ticket granting ticket),

服务器会把这个cookie返回给用户,完成一次模拟登录的过程。

2.核心代码:

001 package ecen.mip.sys.action;
002  
003 import java.io.BufferedReader;
004 import java.io.IOException;
005 import java.io.InputStreamReader;
006 import java.util.ArrayList;
007 import java.util.List;
008  
009 import org.apache.http.HttpEntity;
010 import org.apache.http.HttpResponse;
011 import org.apache.http.NameValuePair;
012 import org.apache.http.client.entity.UrlEncodedFormEntity;
013 import org.apache.http.client.methods.HttpGet;
014 import org.apache.http.client.methods.HttpPost;
015 import org.apache.http.cookie.Cookie;
016 import org.apache.http.impl.client.DefaultHttpClient;
017 import org.apache.http.message.BasicNameValuePair;
018 import org.apache.http.protocol.HTTP;
019 import org.apache.log4j.Logger;
020 import org.apache.struts2.convention.annotation.Action;
021 import org.apache.struts2.convention.annotation.Namespace;
022 import org.apache.struts2.convention.annotation.Result;
023 import org.apache.struts2.convention.annotation.Results;
024 import org.springframework.stereotype.Component;
025  
026 @Namespace("/")
027 @Action("sysSingleSignOnAction")
028 @Component("sysSingleSignOnAction")
029 @Results({ @Result(name = "SUCCESS", location = "/sys/sys_new_index.jsp") })
030 public class SysSingleSignOnAction extends BaseAction {
031  
032     private static final long serialVersionUID = -2096730223578871319L;
033     private static final Logger log = Logger.getLogger(SysSingleSignOnAction.class);
034     final String server = "http://192.168.0.142:8080/cas/login";
035     private String username;
036     private String password;
037  
038     @Override
039     public String execute() throws Exception {
040         Cookie cookie = getTicketGrantingTicket(server, username, password);
041         if(cookie!=null){
042             getResponse().addCookie(convertToServletCookie(cookie));
043             log.info("The user authenticated successfully whose nickname code is "+username+" ! ");
044             return "SUCCESS";
045         }
046         return super.execute();
047     }
048  
049  
050     private Cookie getTicketGrantingTicket(final String server,final String username, final String password) throws IOException {
051         DefaultHttpClient client = new DefaultHttpClient();
052         HttpPost post = new HttpPost(server);
053  
054         List <NameValuePair> nvps = new ArrayList <NameValuePair>(); 
055         nvps.add(new BasicNameValuePair("username", username));
056         nvps.add(new BasicNameValuePair("password", password));
057         nvps.add(new BasicNameValuePair("lt", doCasLoginRequest(client, server)));
058         nvps.add(new BasicNameValuePair("_eventId""submit"));
059         post.setEntity(new UrlEncodedFormEntity(nvps, HTTP.UTF_8)); 
060         try {
061             HttpResponse response = client.execute(post);
062             HttpEntity entity = response.getEntity(); 
063             if(entity!=null){
064                 Cookie cookie = getCookieValue(client, "CASTGC");
065                 entity.consumeContent();
066                 return cookie;
067             }
068         catch (Exception e) {
069             e.printStackTrace();
070         }
071         return null;
072     }
073  
074      
075     private Cookie getCookieValue(DefaultHttpClient httpclient, String name) {
076         List<Cookie> cookies = httpclient.getCookieStore().getCookies();
077         if (cookies.isEmpty()) {
078             return null;
079         else {
080             for (int i = 0; i < cookies.size(); i++) {
081                 Cookie cookie = cookies.get(i);
082                 if (cookie.getName().equalsIgnoreCase(name)) {
083                     return cookie;
084                 }
085             }
086         }
087         return null;
088     }
089      
090      
091     private String doCasLoginRequest(DefaultHttpClient httpclient, String url) throws IOException { 
092              String result = ""
093              HttpGet httpget = new HttpGet(url); 
094                 HttpResponse response = httpclient.execute(httpget); 
095                 HttpEntity entity = response.getEntity(); 
096                 BufferedReader rd = new BufferedReader(new InputStreamReader(entity.getContent(), "UTF-8")); 
097                 String tempLine = rd.readLine(); 
098                 String s = "<input type=\"hidden\" name=\"lt\" value=\""
099                 while (tempLine != null){ 
100                   int index = tempLine.indexOf(s); 
101                      if(index != -1) { 
102                       String s1 = tempLine.substring(index + s.length()); 
103                      int index1 = s1.indexOf("\""); 
104                      if(index1 != -1
105                       result = s1.substring(0, index1); 
106                      
107                     tempLine = rd.readLine(); 
108                 
109                 if (entity != null) { 
110                     entity.consumeContent(); 
111                 
112                 return result; 
113             }
114  
115      
116     private javax.servlet.http.Cookie convertToServletCookie(Cookie cookie){
117         javax.servlet.http.Cookie retCookie = new javax.servlet.http.Cookie(cookie.getName(), cookie.getValue());
118         retCookie.setComment(cookie.getComment());
119         retCookie.setDomain(cookie.getDomain());
120         retCookie.setHttpOnly(false);
121         retCookie.setSecure(false);
122         retCookie.setPath(cookie.getPath());
123         retCookie.setVersion(cookie.getVersion());
124         retCookie.setMaxAge((int) ((cookie.getExpiryDate().getTime()-System.currentTimeMillis())/1000));
125         return retCookie;
126     }
127      
128     public String getUsername() {
129         return username;
130     }
131  
132     public void setUsername(String username) {
133         this.username = username;
134     }
135  
136     public String getPassword() {
137         return password;
138     }
139  
140     public void setPassword(String password) {
141         this.password = password;
142     
143      
144 }

 

 

写完就贴上来了,所以没写注释,不过,应该都能看懂吧

3.注意事项:

通过这种途径登录后,request.getRemoteUser()不能使用,具体原因还不知道。

0
0
分享到:
评论

相关推荐

    cas .net客户端的配置代码

    1. **安装CAS客户端库**:通常,我们可以通过NuGet包管理器安装`Castle.Services.Ticket`或`CasClient2`等CAS客户端库。 2. **配置web.config**:在项目的web.config文件中添加相应的CAS配置节。这包括设置CAS...

    CAS的ASP.NET客户端配置及验证

    本篇文章将深入探讨如何在ASP.NET应用程序中配置CAS客户端,并进行验证流程。 首先,理解SSO的基本概念是至关重要的。SSO允许用户只需一次登录就能访问多个相互关联的应用系统,而无需在每个系统上单独进行身份验证...

    cas客户端登陆配置文档

    在配置CAS客户端时,以下是一些关键步骤和知识点: 1. **安装和配置CAS Server**:首先,你需要在服务器上安装并配置CAS服务器。这通常涉及下载CAS服务器的软件包,配置服务器的主配置文件(如`cas.properties`),...

    CAS单点登录(SSO)服务端自定义认证+CAS客户端配置+CAS完整使用文档+CAS4.2.7 cas-serv服务端源码 cas-client客户端源码

    压缩包中包含的文档将指导你如何配置CAS客户端,包括在Spring或Web.xml中添加必要的配置项,设置服务URL,以及处理TGT(Ticket Granting Ticket)和ST(Service Ticket)。 3. **CAS4.2.7源码**: CAS 4.2.7是CAS...

    单点登录CAS.net客户端源码

    单点登录(Single Sign-On, SSO)是一...此源码提供了一个基础的.NET CAS客户端实现,可以帮助开发者快速集成SSO功能,减少重复的身份验证过程,提升用户体验。不过,具体实现可能需要根据实际项目需求进行调整和优化。

    整合spring+springWebMVC+cas客户端

    CAS客户端则负责与CAS服务器进行交互,验证用户的身份。 整合Spring、Spring Web MVC和CAS客户端的步骤如下: 1. **配置Spring**:创建Spring配置文件(如`applicationContext.xml`),声明必要的bean,包括数据源...

    cas客户端java版

    在Java环境中,CAS客户端库使得应用程序能够与CAS服务器进行交互,实现用户的身份验证。 标题“cas客户端java版”指的是在Java环境下使用的CAS客户端库,它允许Java应用与CAS服务器进行集成,从而实现用户认证过程...

    cas的客户端

    CAS客户端是实现与CAS服务器交互的关键部分,它允许用户通过CAS服务器进行身份验证,而无需在每个应用中单独登录。 在深入探讨CAS客户端之前,我们先理解一下SSO的概念。SSO允许用户通过一次登录就能访问多个相互...

    Cas登录客户端jAR包

    开发者应遵循最佳实践,比如使用HTTPS进行通信,定期更新Cas客户端版本以获取安全补丁。 9. **SSO的优缺点**: 单一登录提供了一致的用户体验,简化了用户管理和密码管理。然而,它也增加了集中式认证的风险,如果...

    CAS服务端和客户端war包.rar

    2. **CAS客户端war包(casClientApp1.war和casClientApp2.war)** 这两个war包代表了使用CAS服务进行身份验证的应用程序。每个客户端应用在用户尝试访问受保护的资源时,会重定向到CAS服务器进行身份验证。完成认证...

    CAS客户端php版

    在本案例中,"CAS客户端php版"是一个用于PHP开发的CAS客户端库,它实现了CAS服务器的交互,使PHP应用程序能够利用CAS进行身份验证。 首先,我们需要了解CAS的工作流程: 1. 用户尝试访问受保护的资源。 2. 如果用户...

    cas客户端jar包

    在这个场景中,"cas客户端jar包"是指用于与CAS服务器通信的Java库,方便开发者集成到他们的Java应用程序中,实现单点登录功能。 首先,我们需要了解CAS客户端的主要组件和工作原理。当用户尝试访问一个受CAS保护的...

    CAS4.1.4服务端和客户端实例

    CAS(Central Authentication Service)是...通过这个实例,你可以深入了解SSO的工作原理,学习如何配置和部署CAS服务,以及如何在自己的应用中实现CAS客户端,这对于提升企业级应用的安全性和用户体验有着重要的作用。

    让CAS支持客户端自定义登陆页面——客户端篇

    通过以上步骤,你可以使CAS客户端应用支持自定义登录页面,从而提供更个性化的用户体验。记住,每个CAS服务器的实现和配置可能会有所不同,因此在实际操作中需要根据具体情况进行调整。同时,为了确保安全性,务必...

    cas客户端集成单点登录代码

    CAS服务器作为一个中心认证服务,用户只需在该服务器上进行一次身份验证,之后便可以在所有已集成的CAS客户端应用中自由切换,而无需再次登录。这种机制极大地提升了用户体验和安全性。 集成CAS客户端的步骤通常...

    CAS服务器端与客户端jar包(服务器端)

    当用户通过CAS服务器验证后,服务器会返回一个Ticket Granting Ticket (TGT),之后每次访问其他受保护的应用时,CAS客户端会使用TGT换取特定服务的Service Ticket,然后将Service Ticket提交给服务端验证。...

    java-cas客户端client安装包

    Java CAS客户端库允许Java应用与CAS服务器进行通信,处理登录验证、票证验证等功能。这个客户端库包含了Servlet过滤器、Spring安全支持和其他相关组件,便于开发者快速集成到自己的应用程序中。 三、集成步骤 1. ...

    单点登录cas服务器demo及springboot客户端demo

    总结起来,这个"单点登录cas服务器demo及springboot客户端demo"项目提供了一个实践单点登录概念的实例,涵盖了CAS服务器的搭建、Spring Boot应用的CAS客户端集成,以及Shiro或Pac4j的使用。对于想要学习和理解SSO...

Global site tag (gtag.js) - Google Analytics