`

CAS单点登录 AJAX 跨域提交

阅读更多

 

       一直以来网上很多高手使用CAS平台时被埋在了不允许外部提交这个死胡同里,大家也见招拆招,iframe方式,以及修改webflow等方式来解决,但是效果一般般,看资料的人更是一头雾水,照着弄80%的人失败。

         经过公司项目上需要,研究了一下,实际上cas还可以这样玩来实现外部表单提交也就是ajax提交方式。

       长话短说,我使用的是tomcat8+JDK1.7+cas4.0,理论上本方法兼容新老版本(需要对应调整截取)。首先在cas默认首页,右键源码可以看到以下信息



 

lt和execution 这两个重要信息,其中execution 是随机码,提交数据后,系统会在后台去校验这个,

通过以下抓包,我们可以证明


       有了这些信息,我们就不用老想着去改cas来达到目的,我们有更好的办法,不动cas一点源码就能搞定ajax异步登录问题,

1.通过ajax获取CAS Login页面

2.得到Login页面后,解析出lt,execution等重要元素

3.再将这些信息post到login里面大功告成

 

贴上源码吧:

 

  
<a href="#" onclick="login()">点这测试</a>
<script type="text/javascript" src="/cas/js/jquery.min.js"></script>

<script>
 function login(){
	 $.ajax({
		 url: 'http://localhost/cas/login',
		 type: 'GET',
		 data:{Name:"keyun"},
		 dataType: 'html',
		 timeout: 1000,
		 async:false,
		 error: function(){alert('Error');},
		 success: function(result){
			 //如果用户本来就是登录着的,可以选择让用户直接跳转,还有个更妥当方法是注销用户,然后再掉login重新获取
			 if(result.indexOf("Log In Successful")!=-1){
				// window.location.href="http://localhost/test";
				logout();
				 return;
			 }
			 
			 

			 var ltsl=result.indexOf("\"LT"); //截取LT位置
			 var lt=result.substring(ltsl+1);
			 lt=lt.substring(0,lt.indexOf("\""));
			 
			 var evsl=result.indexOf("execution\" value=\""); //截取execution位置

			 var ev=result.substring(evsl+18);
			 ev=ev.substring(0,ev.indexOf("\""));
			 post(lt,ev);
		}
	  });
 }
 
 function logout(){
	 $.ajax({
		 url: 'http://localhost/cas/logout',
		 type: 'GET',
		 dataType: 'html',
		 timeout: 1000,
		 async:false,
		 error: function(){},
		 success: function(result){
			 login();
		}
	  });
 }
 
 //提交请求
 function post(lt,ev){
	 $.ajax({
		 url: 'http://localhost/cas/login',
		 type: 'POST',
		 async:false,
		 data:{"execution":ev,"lt":lt,"password":"1","submit":"LOGIN","username":"1","_eventId":"submit"},
		 //dataType: 'json',
		 timeout: 1000,
		 error: function(r){
			 debugger;
			 alert('Error');},
		 success: function(result){
			 //如果登陆成功,则跳转,否则提示错误
			 if(result.indexOf("Log In Successful")!=-1){
				 //alert('ok   lt:'+lt);
				 window.location.href="http://localhost/test";
			 } 
		}
	  });
 }
</script>

 

 

         以上方式需要注意的是:截取信息时可能由于版本不一样,截取的位置不一样,如果报错建议输出看看是否对了。

 

         本页面记得要放在CAS根目录下,比如访问地址:

         http://localhost/cas/testpost.jsp

         然后就是你其他域的用户名密码只需要post到这个页面,让这个页面自动去提交就OK了!

         

 

 

 

 

 
  • 大小: 13 KB
  • 大小: 27.7 KB
分享到:
评论
15 楼 inlhx 2016-04-12  
他的项目存在内网。这个怎么用cas登陆呢? 也就是说只能在客户端登陆了对吧
沙滩后浪 写道
楼主:我现在外网样上一个项目(存在用户登陆),领导想不把cas server 放到外网,其他的项目存在内网。这个怎么用cas登陆呢? 也就是说只能在客户端登陆了对吧。


你可以做一个双重拦截适配,也就是CAS他拦截的是*,那么你需要在他过滤器之前增加一个你的过滤器,你在你的过滤器里面随便拦截一个指定的地址,过滤器里面实现一个CAS伪登录,也就是第一次访问这个地址,以后都不用再访问这个地址了
14 楼 inlhx 2016-04-12  
u013085445 写道
楼主,我想问问那里面的name="keyun"是啥意思?

那个是他的一个随机码,必须要带上他,不然你往后台提交的东西全都不会通过
13 楼 u013085445 2016-02-23  
楼主,我想问问那里面的name="keyun"是啥意思?
12 楼 u013085445 2016-02-22  
楼主,那个ajax 里的 Name="keyun"是啥?还有总是报error,求解???
11 楼 沙滩后浪 2015-12-17  
楼主:我现在外网样上一个项目(存在用户登陆),领导想不把cas server 放到外网,其他的项目存在内网。这个怎么用cas登陆呢? 也就是说只能在客户端登陆了对吧。
10 楼 inlhx 2015-05-31  
秦2200 写道
楼主这不存在跨域问题啊 难道大家的cas和项目都是部署在一个tomcat上吗  ajax请求的时候如果跨域就歇菜了 忘回复


你说的是两件事情
第一:这个是跨域登陆,主要解决的是你在另外一个tomcat或域有个登陆框,想在那边输入用户名密码登陆cas,理论上cas是不允许外部提交的,这里就等于在提交时先提交到现在这个改造页面,将用户名和密码传进来,这个页面再来做用户名密码登陆

第二:的确有ajax跨域歇菜问题,这个我还在研究如何处理,这个是一个超级麻烦的问题,因为cas与应用服务器不在一起并且如果你的应用嵌入的是三方ajax,这时就要歇菜了,因为别人访问你的应用你做了模拟登陆,但是你的三方ajax还没登陆,你必须要初始化他,不然他就会跳转到你的cas服务器做认证,这时就出现跨域了,ajax就挂掉了,所以这种情况,在登录时还需要提前初始化一下ajax那个server的模拟登陆
9 楼 秦2200 2015-05-22  
楼主这不存在跨域问题啊 难道大家的cas和项目都是部署在一个tomcat上吗  ajax请求的时候如果跨域就歇菜了 忘回复
8 楼 inlhx 2015-05-08  
myh1090052425 写道
我尝试过你这种方式,有一个很严重的问题,ajax执行返回html后,ajax走完,还是会跳转页面,这个是什么情况?能帮忙解释下嘛我用的3.4.10

你这个版本我也尝试过,应该没问题的,你最好抓包看看,是不是什么地方写的有问题,或者标签没抓对
7 楼 myh1090052425 2015-05-06  
我尝试过你这种方式,有一个很严重的问题,ajax执行返回html后,ajax走完,还是会跳转页面,这个是什么情况?能帮忙解释下嘛我用的3.4.10
6 楼 inlhx 2015-03-26  
denger 写道
这个方法比较暴力~  不推荐, 其中还需要 ajax 下载和解析 login 页的 html,对于稍大型 应用 来说非常不适合 。。。 如果 html 代码结构发生变更了,就歇了

优化的方法就是提供一个暴露的票据,其实还是可以ajax解决,方法还是有很多,只不过安全第一
5 楼 lovesmutou 2015-03-18  
经过一段痛苦的经历,终于搞定java项目和php项目的集成,其中大量源码的重写,在回过头来看这种方案,跨域请求是一个问题,最佳选择还是重新定制cas-server登录界面更好
inlhx 写道
lovesmutou 写道
第一次查找到后,粗略看过,觉得没啥用处,再继续找,最后想通各种问题在回头看这篇文章,才觉得写的真心好。比较才能看出高低
这个是使用很复杂方法来解决该问题的方案:http://denger.iteye.com/blog/809170#
谢谢分享!

他那个好多年前发的,那个看到过,那个很复杂,在新版中基本上调不通,但是你如果你的目的是想要外部提交过来,那么只有这种办法是最简单的,不信你照着他的弄弄,再试试这个你就知道了,至少给你省一周的琢磨时间

4 楼 denger 2015-03-17  
这个方法比较暴力~  不推荐, 其中还需要 ajax 下载和解析 login 页的 html,对于稍大型 应用 来说非常不适合 。。。 如果 html 代码结构发生变更了,就歇了
3 楼 黑黑yy 2015-03-17  
感谢分享,这个方法简单很多,
我一开始也是看denger的方法各种调不通换版本,折腾了也快一周了,还是不行
2 楼 inlhx 2015-03-17  
lovesmutou 写道
第一次查找到后,粗略看过,觉得没啥用处,再继续找,最后想通各种问题在回头看这篇文章,才觉得写的真心好。比较才能看出高低
这个是使用很复杂方法来解决该问题的方案:http://denger.iteye.com/blog/809170#
谢谢分享!

他那个好多年前发的,那个看到过,那个很复杂,在新版中基本上调不通,但是你如果你的目的是想要外部提交过来,那么只有这种办法是最简单的,不信你照着他的弄弄,再试试这个你就知道了,至少给你省一周的琢磨时间
1 楼 lovesmutou 2015-03-06  
第一次查找到后,粗略看过,觉得没啥用处,再继续找,最后想通各种问题在回头看这篇文章,才觉得写的真心好。比较才能看出高低
这个是使用很复杂方法来解决该问题的方案:http://denger.iteye.com/blog/809170#
谢谢分享!

相关推荐

Global site tag (gtag.js) - Google Analytics