CAS单点登录客户端--C++版

前言:
如果用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三个库
关于这三个库,在文章末尾的源码中都有࿰

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

光光-Leo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值