面向网上商城的单点登录系统的研究与实现

  • 投稿
  • 更新时间2018-07-08
  • 阅读量8次
  • 评分0
  • 0
  • 0

  摘要:文章对现有单点登录模型作出了优缺点分析,设计了一种基于SOA架构的单点登录系统。系统基于SOA架构使用Dubbo作为分布式服务框架,Zookeeper作为注册中心。系统将自定义生成的用户登录凭证(Ticket)保存到Redis缓存数据库和浏览器的Cookie中。登录校验时,拦截器会将浏览器中Cookie的值与Redis中的数据进行比对,以达到校验效果。本系统充分吸收了现有模型的优点,不仅具有很好的灵活性和易于管理用户数据的优势,而且维护简单,更重要的是它非常适用于高并发高可用需求的应用场景。关键词:单点登录;SOA;Redis;Cookie


  随着信息化的不断发展,普通的一体化架构已经无法满足大型互联网应用庞大规模的需求,分布式垂直架构逐渐成为大中型网站的主流选择。然而,在垂直架构中一个系统会被拆分成多个子系统,分别提供不同的服务。例如淘宝,京东这种大型网上商城,会被拆分成相当多的子系统,用户的一次购物操作就会涉及很多个子系统,若是所有子系统都需要用户来一次登录操作,这样不仅繁琐而且会增加系统的负担。在这样的背景需求下单点登录系统的出现显得尤为重要。单点登录(SingleSign-on,SSO),是指在一个应用系统群中,客户端只要登录一个系统就能够在其他应用系统也得到认汪授权,无需再次登录[1-2]。


  而且在现今环境下,日益增多的需求比如爆发式增长的数据、持续提高的负载等等,对应用系统提出了更严苛的挑战。系统的设计不仅要考虑到高并发高可用性的需求,还要从提高可维护性,资源利用最大化(也就是对服务进行差异化支撑)等方面去思考。本文提出的单点登录系统,采用面向服务架构(Service-OrientedArchitecture,SOA),具有优秀的可维护性以及可扩展性,而且易于针对服务差异化分别搭建服务器集群,可以有效地提高网站性能,提升用户体验。


  1相关技术


  目前主要的单点登录实现方案以及它们的优缺点分别如下:


  基于经纪人的单点登录方案的主要特点是引进了第三方的服务器作为经纪人[3](Broker)用来实现认证功能以及管理用户信息。该方案的主要优点是对用户数据进行集中管理和维护比较容易;主要缺点是需要修改原有应用服务器的认证模块。


  基于代理的单点登录方案(Agent-BasedSSO)的主要特点是引入了代理程序(Agent)来为不同的应用系统自动完成认证操作[4]。该方案的优点是不用对原有系统进行改动,具有很好的灵活性;缺点是每一个应用系统都要配置相应的代理插件,增加了维护时的难度。


  基于代理&经纪人的单点登录方案的主要特点是综合吸收了基于代理方案和基于经纪人方案的优点,不仅具有前者的灵活性而且兼备后者集中管理的优势[5]。基于网关的单点登录方案的主要特点是在网络的入口处设置一个网关,并且将资源保护在受信网段之内[6]。用户通过网关的认证授权后,才能进行后续的访问。该方案的优点是,网关的安装和设置相对方便;缺点是在多个安全网关的情况下,用户信息很难进行同步保存。


  2基于SOA的单点登录方案


  SOA具有松耦合、位置透明以及可以在异构平台间复用等好处[7]。它的最主要特点是表现层和服务层的解耦合,相当于将原来的系统从服务层—刀切开分成两个子系统,再通过接口联系起来。系统可拆分为Web和Service两个子系统。Web系统分为表现层和控制层,表现层提供统一的登录/注册界面.控制层处理接收到的用户请求。Service系统负责具体业务的实现,并对外提供业务接口。


  2.1注册流程


  用户填写完注册信息后,系统会生成随机验证码并将其保存在Redis缓存中,与此同时还经消息队列调用阿里大于短信接口[8],将验证码发送给用户。用户提交接收到的验证码,系统将其与保存在Redis中的信息进行对比,若相同则注册成功。成功后系统将用户信息保存在数据库中。具体流程如图l所示。


  2.2登录流程


  用户登录校验时,系统会将接收到的登录信息与存放在数据库中的信息进行对比,判断用户是否合法。若合法,则生成一个Ticket票据,然后将此票据存入用户浏览器Cookie中,同时还将Ticket和用户信息以键值对的形式存入Redis缓存数据库。


  Ticket是由系统生成的一个字符串,具有唯一性,用作登录凭证。我们使用MD5加密后的用户ID作为Ticket。由于Cookie不能被跨域访问,然而上级域名下的Cookie能够被下级域名下的网页获得。所以我们要将各个子系统的域名统一为二级域名,而且将Ticket存放在顶级域名下的Cookie中。考虑到数据库的存取操作耗时较大,而且Ticket不需要持久化存储,所以我们在服务器端将Ticket存放在Redis缓存中,以提高系统性能。具体流程如图2所示。


  2.3认证流程


  我们对必须登录以后才能进行的请求编写拦截器。拦截器在请求访问具体的控制器之前进行登录判断:


  (l)判断请求头部的Cookie中是否存在Ticket。如果不存在Ticket则说明没有登录,则重新定向跳转到登录页面。


  (2)如果存在Ticket,然后判断Ticket对应的用户信息数据是否也存在于Redis缓存中。如果存在用户信息则说明已经登录并且没有过期,那么放行;如果不存在用户信息那么说明用户的登录已经过期,重新定向跳转到登录页面。


  由于其他子系统和单点登录系统在不同的二级域名下,所以当其他子系统向单点登录系统请求获取用户信息时,属于跨域请求。而在同源策略[9]下,跨域請求可以正常发送,但是得不到返回值。资料格式的使用模式(JSONwithPadding,JSONP)[lo]构建于JSON之上,通过动态生成script标签加载另一个源上的JS文件来得到返回的JSON数据,我们使用JSONP实现跨域请求。


  2.4退出流程


  退出时,我们只需将Redis里的Ticket有效时间设置为立即失效即可。


  3实验结果分析


  登录前页iURL地址为“www.taotao.com”,导航栏显示“您好,欢迎来到淘淘![登录][免费注册]”,如图3所示。


  注册页面URL地址为“sso.taotao.com/register”,我们注册一个用户名为“小小阳光”的用户,如图4所示。


  登录后页面URL地址为“www.taotao.com”,导航栏显示为“小小阳光,欢迎来到淘淘![退出]”。说明登录成功,而且跨域从登录系统拿到了用户信息,如图5所示。


  4结语


  本文设计实现了一个面向网上商城的单点登录系统,适用于大中型网站建设。本系统将Ticket票据和用戶信息作为键值对放入Redis高速缓存,可提升系统应对高并发访问时的响应速度。同时系统采取将Ticket保存在Cookie中并使用JSONP技术,解决了跨域访问的问题。如何控制不同用户对相关资源的访问权限是本文还有没完成的,用户的权限管理是下一步的主要工作内容。


  作者:梅本样