论坛首页 Java企业应用论坛

Yale CAS单点(不强制)登录问题

浏览 1820 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (12)
作者 正文
   发表时间:2011-04-15  
在单点登录时,如果A应用已登录,访问B应用时。

Yale CAS的单点登录机制是:
用户访问单点登录客户端时,如果session.getAttribute("edu.yale.its.tp.cas.client.filter.user") == null,并且request中的ticket也为空,会执行以下步骤
1. 客户端-->服务器端 https://xx.com/login
2. 如果已登录,单点登录的login会调回,并带来ticket。
3. 客户端调用服务器端的ServiceValidator得到登录的username。放到session中。
4. 继续后面的工作。


目前有多个客户端需要用到单点登录机制,但登录需要不是强制的(用户想登录就登录),而且访问量巨大。如果用现有的CAS Filter,如果还是访问单点登录服务器的login页面(而且不是强制用户登录嘛),或者其他转到单点登录服务器的方式。会很挫,但现在单点登录是基于Cookie的,必须客户端自己访问才可以得到Ticket。。。

因为登录可能共享给合作方的,所以共享cookie不可行。。。

我现在想单点登录服务器做一种机制,将用户request的唯一信息(ip、浏览器等信息组合出来的)、Ticket的对应信息放在Hashtable中。这样就可以判断是否同一个用户、同一个浏览器登录了。然而貌似不大可行,因为根据HttpServletRequest得不到足够信息保证用户唯一性。。。

有没有更好的机制?请赐教

难道不能在CAS基础上做了?但就算自己做应该还是一样要判定用户唯一性的!!
   发表时间:2011-04-16  
OK,有解决思路了。

改进登录流程,就是现有的Spring webflow,重新配置流程,在流程中初始化各个应用的session(是否登录,记录在session中!),不改变现在cas服务器校验cookie的认证和授权方式。不再考虑共享cookie,毕竟cas服务器的cookie是加密的,这样做非常安全,没必要改。

从模型上来说
以前是:进公园,那么去游乐场的时候会强制校验是否已经付钱,必须回到门口(CAS服务器)拿到票,然后才知道持票人是谁(AuthenticatedUser),然后进入游乐园。
现在:不是强制登录的,而且甚至非登录用户也可做一些业务,如果登录,那么在公园门口付钱,门口就给各个内场的门票。(因为这里必须利用用户的浏览器,目前方案是在流程中加一个view-state,就是一个页面,里面iframe各个应用的初始化登录状态的Servlet,这个页面完成后自动传入进入单点登录前的页面),这样一次性引导用户拿票,后面会测试一下性能,因为考虑到通讯很小(服务器在局域网),而且都是内存中应该不会是瓶颈。这样规划还有个好处,就是如果A、B、C3个应用,如果刚好B应用挂了,所以没通知到,那么B再登陆,转入登录流程,也可以迅速恢复登录状态,流程是通的、符合逻辑的,去掉了CAS Filter。

Over,下周继续工作,希望可以花3天攻克。
以前没有接触Spring的MVC和workflow,所以前几天看CAS的源码费了不少力气,一个星期基本上没有障碍了,而且改了很多源码,都合乎自己的设想,所以自己已经很满足,还要努把力,也希望自己这个帖子可以帮助后面有疑问的人!
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics