利用Cas的原理实现其他系统的接入,跳过登录页面

906 阅读2分钟

需求

最近领导让我开发为一个老的项目添加功能,实现其他系统接入到我们的系统中来,老项目使用的是cas进行单点登录,为此我去了解了一下cas的使用原理

思路分析

  • 我在网上搜索了一套cas的基础教程cas的入门;
  • 看了这位作者的一系列文章,发现可以利用cas集成restful进行认证,通过rest来或得cas的那些票据进行认证,从而实现跳过登录的免登操作;
  • 但是遗憾的是,无论我怎么操作,实验,都无法实现文章中介绍的效果,无法将cas与restful整合好,无法获取票据; -于是我在参考了网上各种例子,并且参考了官方文档,都无法实现我的要求,于是我决定该换思路;
  • 幸运的是,我阅读了另外一片文章,里面没有讲述实现的方法,但是给了我一个新的思路;
  • 当访问一个cas客户端的时候,因为没有登录,他都会跳转到cas服务端的login这个地址,但是不同于直接访问cas的login地址,通过客户端地址访问,会产生这么一个地址,login?service=客户端的地址;
  • 这里我发现,我可以使用一种取巧的操作,直接修改登录页面,实现我的免登功能

功能实现

  • 首先找到服务端的casLoginView.jsp页面
  • 添加js方法,获取url上的参数
//获取网址上的url
function getQueryVariable(variable)
    {
        var query = window.location.search.substring(1);
        var vars = query.split("&");
        for (var i=0;i<vars.length;i++) {
            var pair = vars[i].split("=");
            if(pair[0] == variable){return pair[1];}
        }
        return(false);
    }
  • 在页面加载函数中添加方法,判断参数中的service是否符合你需要免登操作的地址,进行免登操作
$(function(){
    //获取url上的service参数
    var service =  getQueryVariable("service"); 
    //判断service地址和我们需要免登的地址是否一致
    if(unescape(service)=='http://127.0.0.1:8080/eventcore/'){
            //如果地址一致,将原来的页面隐藏掉,提升用户感受
            $("#loginBody").hide();
            //注入用户名密码
            $("#username").val('admin');
            $("#password").val('111111');
            //将表单地址修改为我们需要跳转的地址,否则无效
            $('#fm1').action = "http://127.0.0.1:8081/cas/login?service=http%3A%2F%2F172.20.41.198%3A8080%2Feventcore%2F";
            //触发提交按钮,实现类似免登效果
            $("#sub_button").click();
        }
}

结语

因为我自身暂时无法整合restful的api,才采用这种方式进行取巧,且该项目为内部项目,所以没有考虑一些安全性的因素,后续看业务需求在进行修改.