前言:
如果用java来写一个单点登录的CAS客户端,是很容易实现的,只要导入相关的jar包,再按要求配置就好了,关于java的单点登录的实现,在我前边的几篇文章中有重点描述,有兴趣的童鞋可以去看看。最近要做一个c++版的单点登录的客户端,在网上搜了一下,没有找到,所以只好自己想办法写了。
1.单点登录原理
为了了解单点登录的原理,我反编译了java版客户端jar包cas-client.jar代码,以下描述只是我的理解,如果有不当的地方,还望大家指出。
I.当用户第一次去访问客户端地址clientURL时,cas客户端检测到session中没有用户信息且浏览器中没有ticket,会重定向到casServer的地址serverURL,地址格式为serverURL/login?service=clientURL,service代表用户在server端成功登陆后页面跳转的地址,即客户端地址。
II.服务端接收到请求,判断到请求中没有ticket,会跳转到登录页面,用户在页面上填写正确的用户名密码完成登录后,页面跳转到客户端地址clientURL,格式为clientURL?ticket=XXX,并将ticket保存到浏览器缓存中(ticket的保存应该是由casServer完成的)。
III.此时地址跳回了客户端,cas客户端判断到此时session中没有用户信息,但请求中携带了ticket,因此向casServer发送ticket校验的请求,请求格式为serverURL/serviceValidate?ticket=XXX&service=clientURL,使用的方法是HTTPURLConnection.如果ticket验证成功,会返回如下xml文件格式的数据:
<cas:serviceResponse xmlns:cas='http://www.yale.edu/tp/cas'>
<cas:authenticationSuccess>
<cas:user>sa</cas:user>
</cas:authenticationSuccess>
</cas:serviceResponse>
IV.然后客户端通过解析该数据,获取用户名,并存储到session中。
当用户再次登录该系统时,判断到session中有用户信息,所以不再进行ticket验证;如果去登陆另外一个cas客户端,由于浏览器中存在ticket,所以会直接进行ticket验证的操作。
以上简单的对该流程进行了描述,下面的代码使用java是对ticket校验过程的简单模拟:
public class HttpUrlConnectionTest {
/**
* @param args
* @throws UnsupportedEncodingException
*/
public static void main(String[] args) throws Exception {
//cas server 校验地址
String serverValidateUrl="http://nagsh:8080/cas_server/serviceValidate";
//客户端地址
String service = "http://nagsh:8080/cas_cgi_client/cgi-bin/cas_client2.exe";
//ticket
String ticket ="ST-19-eBhtXb5cuIlAxHpqf5pA-cas01.example.org";
//组装url
String constructServiceUrl = serverValidateUrl+"?ticket="+ticket+"&service="+service;
URL url =new URL(constructServiceUrl);
HttpURLConnection conn = (HttpURLConnection)url.openConnection();
conn.setConnectTimeout(5*1000);
conn.setRequestMethod("GET");
InputStream inStream = conn.getInputStream();
final StringBuilder builder = new StringBuilder(255);
int byteRead;
while ((byteRead = inStream.read()) != -1) {
builder.append((char) byteRead);
}
String response = builder.toString();
}
}
获取到response后再使用XmlUtils去解析即可。
这里不对cas_client反编译的源码做过多的描述,有兴趣的童鞋可以去看一下源码,会有更多的收获
2.开发环境
开发前有很多准备工作,我也是一步步摸索过来的。
I.搭建CGI环境
c++一般是用来写后台的,一般编译后会形成exe文件,但我需要将其部署到tomcat下,所以需要配置tomcat使其支持c++,具体内容,请看我的另一篇文章:CGI编程–Tomcat下运行c++程序
II.编译libcurl,cgicc,tinyxml三个库
关于这三个库,在文章末尾的源码中都有