tomcat7.05
cas-server-3.4.5
cas-client-3.2.0
呃,你没看错,是用iframe实现。这个不算是一个好的方案,甚至我自己都有点看不起自己的感觉。但却是一个简单易用并最能兼容以后CAS-server更新的一套方案(还用说么,你都用iframe了)。目前项目比较紧急没时间去研究Spring WebFlow 3的情况下只好出此下策了,大神请喷。

这个题目相信使用过CAS的朋友都不会陌生了。由于安全性的问题,CAS-Server 一直不建议把验证放到客户端之上。所以不提供验证表单的接口,或者说必须我们去开发扩展。而在实际应用中,很多单点登录的表单却是在客户端中完成,例如在某门户首页的登陆框。这些是不可能在Cas-Server上直接改造成门户的。所以造成了必须在门户中进行CAS服务器表单验证的局面。
当然这一切都是建立在我目前对CAS的熟悉程度来说的,欢迎指教。
其实网上也有比较多的方案,但基本上是版本对不上了,我也逼于无奈才采取这种比较傻瓜式的方法进行验证。
不管怎样,虽然觉得说名字大家都知道实现原理了,但也应该照顾一些不理解的。
1.自己的登录页面中用iframe加载cas-server的登录页面。
2.当用户输入账号密码登录的时候,同时把账号密码信息传入cas-server登录页面,并且提交。
3.若成功则刷新页面,登录窗口消失。若失败则提示用户。这个iframe相对用户来说是不可见的。
引用一下前辈的客户端实现目标描述:
引用
客户端实现目标
客户端实现主要需要满足5个case:
1. 用户未在中央认证服务器登陆,访问客户端受保护资源时,客户端重定向到中央认证服务器请求TGT认证,认证失败,转回客户端登陆页面,保证受保护资源URL信息不丢失
2. 用户未在中央认证服务器登陆,访问客户端登陆页面时,客户端重定向到中央认证服务器请求TGT认证,认证失败,转回客户端登陆页面,此次登录页面不再受保护,允许访问
3. 用户已在中央认证服务器登陆,访问客户端受保护资源时,客户端重定向到中央认证服务器请求TGT认证,认证成功,直接转回受保护资源
4. 用户在客户端登陆页面提交用户名密码,客户端将用户名密码信息提交给服务器端,认证失败,转回客户端登陆页面,携带失败信息并保证转到登陆页面前受保护资源URL信息不丢失
5. 用户在客户端登陆页面提交用户名密码,客户端将用户名密码信息提交给服务器端,认证成功,转回转到登陆页面前受保护资源
客户端实现主要需要满足5个case:
1. 用户未在中央认证服务器登陆,访问客户端受保护资源时,客户端重定向到中央认证服务器请求TGT认证,认证失败,转回客户端登陆页面,保证受保护资源URL信息不丢失
2. 用户未在中央认证服务器登陆,访问客户端登陆页面时,客户端重定向到中央认证服务器请求TGT认证,认证失败,转回客户端登陆页面,此次登录页面不再受保护,允许访问
3. 用户已在中央认证服务器登陆,访问客户端受保护资源时,客户端重定向到中央认证服务器请求TGT认证,认证成功,直接转回受保护资源
4. 用户在客户端登陆页面提交用户名密码,客户端将用户名密码信息提交给服务器端,认证失败,转回客户端登陆页面,携带失败信息并保证转到登陆页面前受保护资源URL信息不丢失
5. 用户在客户端登陆页面提交用户名密码,客户端将用户名密码信息提交给服务器端,认证成功,转回转到登陆页面前受保护资源
而技术方面没什么太大的要求,最主要是一些基本的javascript知识。
一、改造Cas-Server默登陆页面,让它对反馈信息支持。
打开 WEB-INF\view\jsp\default\ui\casLoginView.jsp
在
<%-- add by Kenny Begin --%> <%-- add by Kenny End --%>
其中cas_serverFrame为我自定义登陆页面中iframe的id,稍后会看到。判断其实可以简化些,或者其他可以自由发挥了,供参考。
查找页面中的submit表单提交按钮,如果name为submit的话记得改掉(默认是name=submit), 因为如果在html中有任何一个元素的name属性为submit时,则用javascript操作form元素时是无法执行submit(),会提示'不存在的方法'。这个卡了我不少时间。
二、门户中自定义登陆表单页面
<%-- Document : login Created on : 2011-1-11, 3:07:16 Author : Kenny --%> <%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%><% } else { %>远程CAS客户端登陆页面 远程CAS客户端登陆页面
<% if (request.getRemoteUser() == null) { %>
您好:<%= request.getRemoteUser() %>
<% } %>