Sso 登陆实现初步方案

用户中心SSO流程和设计说明

一.名词解释

 

IDS        用户SSO中心,用户注册和登陆和检测都在这里实现

 

协作应用    其它Web应用,用户的所有功能依靠IDS来实现

 

 

二.基本架构

 

 

(图1

 

 

(图2

 

所有的协作应用只有在首次访问时从IDS进行登陆检测,之后都是在完成本地登陆检测

 

 

三.流程描述

SSO流程主要有以下几种形式,下面分别进行说明。

 

n         匿名访问

用户没有登陆,就访问协作应用的页面。

 

用户打开浏览器,访问协作应用地址 A,过滤器生成coSessionid,然后检查是否本地session,从而判断是否登陆,这种情况都是没有登陆。然后过滤器通过socket通信检查在IDS上是否存在与coSessionid对应的用户,这种情况下,也会没有。接着过滤器将跳转到IDS全局登陆地址:BB主要是生成gSeesionid。在B处理完之后将会跳回到A地址,这时会将gSessionid作为参数传递过来,同时还有匿名访问的参数。这个时候,过滤器不会生成新的coSessionid,然后检查本地session,以判断登陆。这个时候,依然没有登陆,过滤器会检查参数,是否是匿名访问。完成匿名访问的本地Cookie标识。流程结束。下次用户在此访问这个协作应用时,就可以直接从本地Cookie里判断了。

 

这里值得注意,如果用户在同一浏览器访问另外一个协作应用的话,gSessionId会一致。要深刻理解Jseesionid原理才能对这个问题理解透彻(Jsessionid,其实是浏览器与web应用之间的识别桥梁),当协作应用A跳转到B时,相当于当前浏览器窗口与B产生了一个新的Jsessionid,而不是协作应用AB产生了新的Jsessionid,所以以后只要在当前浏览器再此访问B时,都会是同一个Jsessionid。就算是其它协作应用通过跳转的方式访问BJsessionid也不变。因为当前浏览器与访问的web应用只会生成一个Jseesionid,当然这种情况与在协作应用里用程序请求B不一样,后面这种情况每次请求都会产生一个新的Jsessionid

 

还有其实Jsessionid对于协作应用来说,意义不大,主要是在IDS中心用来判断。

 

附:附匿名模式下流程图:

 

 

 

 

 

 

 

 

n      登陆访问

用户先登陆,然后访问协作应用的页面。

 

用户登陆时,用户名和密码正确登陆成功,会创建一个GlobalSession.然后在同一浏览器访问协作应用地址 AA的过滤器生成新coSessionid,然后检查本地session,是否登陆。这里结果是没有。然后过滤器通过socket通信检查在IDS上是否存在与coSessionid对应的用户,这种情况下,找不到,返回为空的登陆对象。过滤器跳转至IDS LoginServlet,LoginServlteGlobalSession中判断是否存在对应的coSession,没有的话就添加一个。然后跳转回写作应用地址AA的过滤器再次判断用户对象是否加载到本地Session中。这里结果是没有。然后过滤器通过socket通信检查在IDS上是否存在与coSessionid对应的用户,这种情况下,能找到,返回对应的用户对象SSOUser,执行本地Actor,将SSOUser对象加载到本地的session中。

流程结束。

 

附件:登陆模式下的SSO流程。

 

 

 

 

 

 

总结一下:

 

1.首次访问协作应用是,过滤器会执行两次。

 

2.浏览器与IDSJsessionid不变

 

 

n         登出流程

IDS接收退出请求,IDS将根据对应的gSessionid,遍历所有已经登陆并且没有失效的协作应用登陆记录。然后用HTTP方式请求通知每个协作应用指定的一个页面,这个页面没有任何功能但是必须被过滤器作用。这里注意发出请求时,必须将coSessionId作为cookie传给协作应用。这样在协作应用里才能找到对应的Session,并且将Session失效,完成退出请求。

四.对象描述

u        CoSession 单个协作应用对象

 一个用户登陆session的最小存储单元包括一下属性和方法

String  coAppName协作应用名

String  coSessionId;Session的标识

String  coUserName; 登陆用户名

boolean timeoutFlag;登陆超时标识

long    loginTime登陆的时间

String  sessCookieName; 保存的sessioncookie名字

String  loginIP;   登陆的IP

 

u        GlobalSession 维护用一个用户的CoSession 对象列表,因为一个用户可以在好几个协作应用上登陆,这里用coSessions Map对象来维护。

GlobalSession的主要属性是

    private String globalId;

    private long creationTime创建时间

    private long lastAccessTime; 最后一次时间

    private boolean loginFlag;

    private int loginBy;

    private String loginUserName;

    private User loginUser;     //用户信息对象

    private Map coSessions;

    private Set coAppNames;

private HttpSession idsHttpSession;

GlobalSession对象我们可以知道一个用户是否登陆,是否超时,在哪几个协作应用上登陆过,协作应用名是什么等其它信息。

 

 

u       SessionManager 管理和维护GlobalSession 对象主要提供一下方法

    public boolean login(String gSessionId, String coAppName, String coSessionId, int userId, String passwd, String clientIP)

该方法分为如下几个步骤

1.       在数据库取得user的信息。

2.       获得一个GlobalSession对象gSessionGlobalSession gSession = createSSO(gSessionId, coAppName, coSessionId, authedUser.getUserName(), clientIP, user, "用户全局登录", 0);

3.       赋值CoSession,并且将gSession对象添加到SessionManager Map对象:coSessionIndexs   public boolean addCoLogin(String coAppName, String coSessionId, GlobalSession gSession, String coUserName)

4.       将登陆请求发给其它协作应用,请求appurl,并将会话标识coSessionIdcookie的方式传递给协作应用。

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值