zl程序教程

您现在的位置是:首页 >  其他

当前栏目

实现单点登录的思路

思路 实现 登录 单点
2023-09-27 14:29:22 时间
       前段时间给xx旅游委做了一个综合业务管理平台的项目,项目被分割成了n多个独立模块。要求每个模块需要提供单独的登录、退出以及各自的数据库和页面等,而整合这些应用的是一款叫做dzz的php版的桌面系统,类似于webqq。
       前段时间给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)应用中获取。所以单点登录主要是为这些托管型的应用来服务的。详细步骤如下:        ①. 从统一登录入口登录,用户输入用户名、密码,点击“登录”按钮,然后程序会以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,并给登录入口反馈登录结果。        ⑦. 登录入口获取各个应用的登录反馈后,将未登录成功的子系统记录下载,然后跳转到桌面上。

       实现思路就是这样了,主要是在登录页为每个应用登录。当然这样做肯定会引起一些博友的批评。客观的来评价一下吧:
       优点:        最大的优点就是简单,绿色。让人一看就能明白。因为都是自己写的代码,哪出了问题,可以很快的定位。不会像现成的框架,如果只会用却不了解,出了问题就百、谷,找不到就两眼一抹黑了。        缺点:        最大的缺点就是不安全,把每个应用的真实的登录地址都呈现出来了。而且在应用特别多的时候,性能就会很受影响。        好了,单点登录的思路就介绍到这里,欢迎大家批评指正。
单点登录原理与简单实现 1、http无状态协议 web应用采用browser/server架构,http作为通信协议。http是无状态协议,浏览器的每一次请求,服务器会独立处理,不与之前或之后的请求产生关联,这个过程用下图说明,三次请求/响应对之间没有任何联系
龙轩8023 熟悉javaee开发,有多年支付领域的开发经验。关注开源~ httpclientUtil开源项目创建者。https://github.com/Arronlong