单点登录设计

sso介绍

sso是Single sign-on的缩写,翻译成中文是单点登录的意思,所谓的单点登录是指在有多个应用系统的情况下,成功登录任一应用系统后再登录其他的系统是不用再输入用户名密码登录而直接可以登录到系统。一般使用cookie技术实现。


使实现sso原理


条件

  1. 浏览器需要支持cookie
  2. 所有的应用系统在同一个顶级域内,比如:顶级域是www.ichaoying.com,那应用系统的域名是相同的:sso.ichaoying.com,cms.ichaoying.com,oa.ichaoying.com


实现原理

  1. 用户登录成功后,生成一个唯一的sso id,首先把sso id和对应用户信息写入session信息存储中,sso id作为主键,然后把sso id写入cookie,该cookie绑定的域是*.ichaoying.com,这样所有的子域系统也可以访问到这个cookie
  2. sso id的生成规则: md5(loginname + 姓名 + 时间戳 + salt),salt是我们配置的一个干扰字符串
  3. 请求任何应用系统时,自动把上面的cookie发送到应用系统,应用系统根据cookie的sso id去session信息存储查找用户信息,如果找到则继续提供服务,如果cookie没有sso id或者在session信息存储没有找到用户信息,则需要导向登录界面登录。
  4. 用户请求流程:

Sso design.png


session存储

  • 目前系统使用数据库存储,数据库表结构:
 create table session_info(
     sso_id varchar(64) not null comment 'sso id, md5(loginname+username+timestamp+salt)' primary key,
     create_time datetime not null comment '第一次登录的时间', 
     last_access_time datetime not null comment'最后一次访问的时间',
     user_info varchar(512) not null comment 'user info,json'
    )
  • 以后可以更新为nosql数据库

[编辑]验证

  1. 当用户访问某一服务或者资源url时,系统判断是否存在名字为sso_id的cookie,如果有,则从数据库读取session信息,如果不能读的信息,则需要重新登录;如果读到,则比较last_access_time + 超时时间和当前时间,如果当前时间>last_access_time + 超时时间则表示超时,需要重新登录;如果last_access_time + 超时时间>当前时间表示验证成功,然后更新last_access_time时间为当前时间。
  2. last_access_time更新策略,数据库的update操作与select相比,性能消耗会大几个数量级,为了提高数据库性能,需要采用一些策略:不是每次成功验证session后都更新last_access_time字段,比如我们这是session超时间隔是8个小时,那么sesson超时误差是20分钟,那么用户是能容忍这种误差的,我们可以利用这种误差,如果last_access_time + 超时时间和当前时间的时间间隔大于20分钟,那么本次不更新last_access_time,如果小于20分钟,则更新last_access_time。


应用程序权限判断

  1. 采用filter,实现一个filter,在filter中根据url判断用户的请求是否需要登录验证,如果需要则验证
  2. spring mvc,实现一个拦截器,功能类似filter


设计类图

Sso类图120605.png

猜你喜欢

转载自greenmoon.iteye.com/blog/1633406