╰☆把酒言欢
                               聪明出于勤奋,天才在于积累.

内容
SSO简介
利用OFBiz建立简单有效的SSO机制
相关资料
备注

--------------------------------------------------------------------------------

SSO简介

--------------------------------------------------------------------------------

Single Sign On (SSO)通常被翻译为单点登陆,最常见被使用在企业内部网络应用,当用户访问企业内部应用系统时候只需作一次身份认证,随后就可以对所有应用系统进行访 问,而不需要多次输入认证信息。SSO 可以提高普通用户工作效率,避免了各个系统都有自己独立的用户帐户和密码,减少了系统维护人员工作。本文只介绍一种利用OFBiz现有的架构建立一个简单 而有效的SSO机制,对于更完善,复杂SSO实现,请参考相关文档。


--------------------------------------------------------------------------------

利用OFBiz建立简单有效的SSO机制

--------------------------------------------------------------------------------

首先看一下OFBiz的登陆机制,打开任意webapp的controller.xml,会找到这一段:

  <request-map uri="checkLogin" edit="false">
    <description>Verify a user is logged in.</description>
    <security https="false" auth="false"/>
    <event type="java" path="org.ofbiz.securityext.login.LoginEvents" invoke="checkLogin" />
    <response name="success" type="view" value="main" />
    <response name="error" type="view" value="login" />
  </request-map>

对 于controller.xml里面定义任何的request-map, 如果其auth="true",那么OFBiz都会调用这个checkLogin来检测发出这个request的user是否已经在这个webapp登陆 过,如果没有登陆过则把当前request名称和post参数save在session里面,然后分发到login的view,让user来做登陆。在 user登陆完以后,会读取session里前面save内容,重定向到前面的请求。

接下来谈一下我们实现的SSO,首先必须要有统一登 陆入口和统一存储User account和password的数据库。假设我们现在统一登陆入口为一个跑在一台叫SSOServer服务器上的sso web应用。我们在这个SSO DB里面利用OFBiz自带的UserLogin再扩展一个field: ssoId,用来作为登陆以后的user一个独一无二标识。

修改checkLogin对于user没有登陆过这个webapp时候的处理,让他重定向到sso登陆入口:
<response name="error" type="url" value="
http://SSOServer/sso/control/main?redirect=http://thisserver/thisapp" />
这样就可以达到统一到SSO入口认证的目的了。

现在我们来看一下一个实例:

Step 1. 一个user打开浏览器,发出对A Server的abc应用某个request。

abc判断到这个user对于本身来说是一个新session,是没有登陆过的,重定向到sso的登陆入口。


Step 2. user在sso登陆入口输入用户名,密码。

sso webapp进行用户名,密码验证,生成一个独一无二的ssoId,save对应的UserLogin,利用前面获得redirect参数构造一个这样的链接: “
http://AServer/abc/control/autoLogin?ssoId=generatedSsoId”,进行重定向。


Step 3. 自动登陆AServer的abc应用

autoLogin 是我们实现的一个request-map,其作用是利用ssoId去统一存储UserLogin SSO DB获得对应的UserLogin,做一个自动登陆。登陆完以后,还是和原来的OFBiz一样的处理机制,会读取session里前面save的内容,重 定向到第一步发出的请求。
这个时候看起来还和原来的登陆方式没有什么区别,但是如果这个user继续操作:
Step 4. 发出对B Server的efg应用某个request。

efg判断到这个user对于本身来说是一个新的session,是没有登陆过的,重定向到sso的登陆入口。


Step 5. sso web app判断

sso web app会得知这个user前面已经在SSO登陆过,所有不用再次要求user登陆,利用ssoId, redirect参数构造一个这样的链接: “
http://BServer/efg/control/autoLogin?ssoId=generatedSsoId”,进行重定向。


Step 6. 自动登陆BServer的efg应用
OK,4 ~ 6就是SSO,对于user来说,完全是无缝的操作。

总结一下在OFBiz上做一个SSO实现的工作和要注意的地方:
1. 写一个SSO的web app,跑在一个统一的SSO Server,使用统一的SSO数据库。
2. 任何需要集成SSO的应用,修改web apps checkLogin方法,新增加一个autoLogin的方法。
3. 在实际实施的时候,我们写的SSO登陆的web app会把用户登陆信息写在一个cookie中,这样用户就算是打开新的浏览器访问的话,sso web app可以从cookie中得到用户是否登陆过的信息。
4. 在实际实施的时候,考虑到有可能会被构造ssoId来做多次尝试登陆的问题,ssoId长度可以考虑加大(255个字符),这样被暴力尝试破解的机会几乎为0。
5. 这种方法不仅仅限制在ofbiz,完全可以适用在其他java web app,asp, php等等。只要其他web应用的登陆统一到sso web app通过ssoId验证,就可以一样集成sso,以asp为例子:我们只需要重定向到http: //CServer/hij/autoLogin.asp?ssoId=xxx,即可。(在实际应用中,我们利用这种方式集成了旧有notes,asp, php等系统。)

--------------------------------------------------------------------------------

相关资料

--------------------------------------------------------------------------------

本文介绍的是一种简单有效的SSO的方法,其设计想法来自于MSN的.Net passport的登陆(
http://www.msn.com/,通过跟踪它的登陆过程,会发现它也是利用类似的重定向来实现)。下面是一些其他相关的SSO的资料

WebSphere环境下的SSO
The Server Side上对SSO的介绍
利用Web Service实现SSO
耶鲁大学的一个opensource的SSO lib
Opengroup的SSO 介绍

--------------------------------------------------------------------------------

备注

--------------------------------------------------------------------------------

补充几点对于本文的解释:

Q1. 如果一个用户在原有的几个系统中都有不同的用户名?SSO如何处理这个情况?

我们的这个简单实现不能解决这个问题。


Q2. 原系统的登录是否都要在SSO DB 维护,应用系统的db中是还要维护userLogin?

各 个应用系统DB里面是没有UserLogin这样的表的,但是这样会带来一些问题,如果应用里面有和UserLogin建立view entity,需要进行修改,但是这样的view entity很少,通常都是为了获取partyId, 但是由于party的数据还是在各个应用系统db里面,通常修改到Party既可以解决,另外有和UserLogin建立外键的entity定义,也需要 修改,因为大部分数据库不支持跨DB的外键。


Q3. 如果统一在SSO DB维护。 userLogin对应的权限,维护在哪里?

UserLogin对应的 security group维护还是在各自的应用系统里面进行,因为一个user在各个系统里面的权限设置肯定有各种变化,不能在SSO中统一作。

 

转载自: http://www.4ucode.com/Study/Topic/1782506

posted on 2012-12-16 17:50  把酒言欢  阅读(2403)  评论(0编辑  收藏  举报