实现单点登录的思路

       前段时间给xx旅游委做了一个综合业务管理平台的项目,项目被切割成了n多个独立模块。要求每一个模块须要提供单独的登录、退出以及各自的数据库和页面等。而整合这些应用的是一款叫做dzz的php版的桌面系统,类似于webqq。每一个模块要在桌面系统中以图标的方式进行显示。所以一般我们叫这些模块为应用。


       正题来了,我们开发小组有php、java2组4个人(移动端的未计算在内)。php和java开发者每一个人都分配了5-10个应用的任务,另一些系统自带的应用。最后整合的时候。就须要考虑单点登录的问题了,总不能每点个图标就让用户登录一次吧。


       事实上本来是想使用cas来完毕单点登录的。可是pm说php那边对cas不了解,须要花费时间去了解,还不能保证整出来。

另外还须要为cas跑一个服务,太麻烦了。

结果仅仅能自己来实现了。


       我的想法是在用户登录的时候,对全部须要登录的应用发送登录请求。然后再记录每一个应用的登录结果反馈后,跳转到桌面系统的桌面上,这个桌面仅仅载入须要登录的应用。这样的在登录的时候发送多个请求的方式。在CSDN、淘宝与天猫都使用过。

当时CSDN原先的登录页面是用iframe嵌套在页面上的一个表单。而提交的网址就是如今的登录页面。点击登录后,用浏览器的开发人员工具你会发现csdn自己主动会给blog.csdn.net、write.blog.csdn.net等发送login请求。

淘宝和天猫也是在登录登录的时候会发送多个登录请求。

至少在半年前还是这样的方式呢。只是如今好像都改了(或者说如今变隐秘了。没有被我发现)。


       基本思路定了,经过几次的具体的讨论,终于敲定了以下这个解决方式:


       上图是我们设计的单点登录的逻辑图。我们这里差点儿相同全部的应用都是“托管型应用”。

所谓“托管型应用”,就是自身没实用户信息表,用户信息要从UC(用户中心,User Center)应用中获取。所以单点登录主要是为这些托管型的应用来服务的。

具体过程例如以下:



       ①. 从统一登录入口登录,用户输入username、password,点击“登录”button,然后程序会以ajax+jsonp方式发送name+pwd到UC。


       ②. UC接收到请求以后,首先验证用户身份,对于通过验证的用户,UC会推断用户的权限,并以jsonp格式返回拥有授权的应用列表信息。

每一个列表项的信息是app_id+login_url。


       ③. 登录入口在ajax的回调函数中,获取UC反馈的应用列表信息,对这些应用发送ajax+jsonp登录请求:
name+pwd+app_id。

       ④. 各应用接收到登录申请后,因为是托管型应用,所以须要从UC中获取数据。

使用java代码用java.net.URL模拟浏览器向UC发送用户权限验证:name+pwd+app_id。


       ⑤. UC再次验证用户身份,并验证用户权限,验证通过,则返回jsonp格式的用户具体信息。

       ⑥. 各应用保存用户信息到各自的session,并给登录入口反馈登录结果。

       ⑦. 登录入口获取各个应用的登录反馈后。将未登录成功的子系统记录下载,然后跳转到桌面上。



       实现思路就是这样了。主要是在登录页为每一个应用登录。当然这样做肯定会引起一些博友的批评。

客观的来评价一下吧:


       长处
       最大的长处就是简单,绿色。

让人一看就能明确。

由于都是自己写的代码。哪出了问题。能够非常快的定位。

不会像现成的框架,假设仅仅会用却不了解,出了问题就百、谷。找不到就两眼一抹黑了。


       缺点
       最大的缺点就是不安全,把每一个应用的真实的登录地址都呈现出来了。并且在应用特别多的时候,性能就会非常受影响。

       好了。单点登录的思路就介绍到这里。欢迎大家批评指正。


原文地址:https://www.cnblogs.com/zfyouxi/p/5351681.html