如何设计一个单点登录系统(1)?

单点登录系统的由来

随着互联网技术的发展,目前各大公司都在疯狂扩张业务,比如像阿里巴巴,旗下就有淘宝,天猫,支付宝等业务线,按照目前的互联网产品,基本上每个产品都会涉及到账户体系,不管是社交也好,电商也罢,都省不了需要一套账号体系,我们在平时的生活过程中其实也经常遇到这样的问题,比如下载某个APP,就得来一次注册的流程,虽然目前的注册流程相对简单,但是对用户来讲依然比较麻烦,对此第三方登录便应运而生,比如我们经常会在登录页看到类似“微信登录”,“人人网账号登录”,“微博账号登录”等登录入口,其本质也是为了简化用户的登录逻辑,但是由于微信,人人网,微博的账号也不互通,这种第三方登录的方式仍然解决不了根本问题,最理想的情况是我们在某一个地方登录后进任何网站都不需要再登录,但这终究也只会是个设想,因为每个公司的账号体系都早已成熟,集成所有公司的账号体系显然代价很大,而且企业基于安全问题也不会愿意合作,那既然公司与公司间不能互通,公司内的系统直接能否互通呢,比如阿里系的淘宝和天猫,我们发现其实现在已经做到了互通,我在淘宝上登录后,再进天猫的时候就不需要再登录了,还有就是比如企业内部的管理系统,企业内部可能会有wiki,bbs,gitlab,oa等系统,如果每个账号都需要单独注册,单独登录,这对于公司每个人来讲都是不可接受的,所以单点登录系统应运而生。

单点登录的概念

对于很多技术人来讲,可能看到“单点”这个字眼就觉得是单点部署,甚至会有高可用的问题,其实不然,此处的“单点”并不是是部署上的“单点”,而是指所有系统的登录,认证逻辑都挪到同一个系统,而不再是分散到各个系统中。

一个好的单点登录系统需要做些什么?

  1. 跨域

这是一个很重要的考核标准,很多单点登录的实现都不能做到跨域,必须都在同一个父域名下,比如 a.xxx.com,b.xxx.com,c.xxx.com这种域名,如果再有a.yyy.com就做不到了,这样都话很显然就有局限性,必须限制服务部署的域名

2.账号同步

比如我在A系统注销登录,那么进入B系统时也必须是注销状态,否则单点登录的价值就不存在了

3.接入方便

要实现单点登录,肯定需要开发者介入开发,如果接入流程繁琐的话,恐怕就会很难推进

本人前段时间基于兴趣写了一个单点登录的工程,在此先介绍一下此系统

源码地址:https://github.com/zhoudapeng/zsso

本工程一共分为4个模块:zsso-client,zsso-client-demo,zsso-common,zsso-server

职责划分如下:

zsso-client:客户端相关代码,以jar包形式存在,客户端接入时需要依赖此模块,此模块集成了跟server端的交互逻辑已经对于zsso命名空间的支持

zsso-server:服务端实现,以war包形式存在,直接部署

zsso-common:公共模块

zsso-client-demo:客户端demo,供使用者参考

先介绍下使用方式

  1. 在web.xml中配置过滤器

<filter><filter-name>zssoFilter</filter-name><filter-class>com.zdp.zsso.client.filter.ZssoFilter</filter-class></filter><filter-mapping><filter-name>zssoFilter</filter-name><url-pattern>/*</url-pattern> </filter-mapping>

2.在应用层spring配置文件配置自动驱动

<zsso:auto-driven/>

3.配置zsso-client配置文件,配置文件可以分环境配置,分别见src/main/profiles/(dev|beta|product),配置项示例如下:

#系统名,需要在server端备案zsso.system.name=wiki #本地cookie的domain zsso.system.cookie.domain=.wiki.com #server端url前缀 zsso.server.url.prefix=http://www.zsso.com:8080

4.按需拓展相关组件,组件一共包括4个部分,且都有默认实现,接入方可以按需自己实现相关组件:

UrlHelper:拼接url的组件,如无特殊需求不建议重新实现

ZssoClient:跟服务端交互的组件,如无特殊需求不建议重新实现

ZssoConfigResolver:解析配置文件的组件,默认实现是读取本地classpath下zsso-client.properties配置文件,如无特殊需求不建议重新实现

UserStore:存取用户信息的组件,包括根据token解析用户信息,绑定token与userId关系,解绑token,默认实现只是为了演示用,接入方请务必自己实现此接口

5.快速使用:

5.1.为了模拟跨域的情况,先绑定本地host

127.0.0.1 www.zsso.com127.0.0.1 www.wiki.com 127.0.0.1 www.bbs.com

5.2.启动zsso-server端,使用8080端口

5.3.启动zsso-client-demo,使用8081端口

5.4.访问http://www.wiki.com:8081/profile/detail?id=123

5.5.在zsso登录页登录,账号:zhoudapeng 密码:12345

由于篇幅原因,具体的设计思路我将在下一篇文章中介绍,敬请期待!

posted @ 2018-05-18 11:09  javaobject  阅读(662)  评论(0编辑  收藏  举报