简单Web单点登录SSO

       最近在写一个Web的单之间点登录模块,所谓的单点登录就是使多个互相信任的应用系统之间只需要登录一次,就可以在访问所有这些系统。这里要强调的就是一个信任问题,直接判断session或者cookie么?要知道session是维持在一个会话里的,不同会话是无法直接就取到相同的session的,也即session的跨域问题;cookie也存在跨域的问题,一开始我想cookie不是存在浏览器的吗?同一个浏览器不就能够取得到?但是如果当我们两个系统的域不相同的时候,也是无法直接取到在其他域里设置的cookie的。比如现在有A跟B系统,它们的域不同,现在在A系统登录并设置cookie,访问B系统,判断是否存在cookie,这时候是永远取不到在A系统设置的cookie的,虽然就在同一个浏览器上。所以自己在做这个单点登录的时候首先考虑的就是如何解决各系统应用之间的共同凭证以及凭证的安全性,做的相对比较简单。

       我的做法跟网上大多的做法一样的地方是单独独立出一个单点登录的认证中心系统,由该系统来做判断,访问其他系统需要登录验证的话都会在该认证中心进行认证是否登录,并返回一个认证结果。下面简单讲下自己的认证过程:

 

      1、 我给每个系统都增加了几个负责与SSO认证系统交互的中间代理类(其实就是Servlet),但我们访问某个系统的时候,如果判断此时的session为null则将会跳转到一个中间代理类,该类负责跳转(response.sendRidrect)至SSO系统的登陆验证,注意跳转前需要再次判断是否当前会话中的session是否为null(防止一些非法访问),不为空则返回来源页面。跳转的时候,需要封装一个对象,里面包含的属性有一个随机产生的id以及用户的一些信息如user_id,这时只需要给随机id赋值,便于后面返回的时候验证是否是同一个对象,而不是伪造的对象,将对象加密为字符串cert(使用RSA加密),取得来源页面路径url,将cert与url作为参数随着跳转传到SSO系统。

 

      2、SSO登录验证中心(其实也是个Servlet),当接受到请求的时候需要分析几种情况:

           当前系统下是否存在登录设置过的cookie(cookie名是已经规定好了)

           ·如果存在,将cert取出解密为对象,再将cookie中带有的用户信息封装到对象中,再次加密成cert作

             为参数跳转回A系统负责验证cert的代理类。

           ·如果不存在则需要判断是否有表单传参,有表单传参以为着是从登录页面登录提交的请求,对表单

              数据进行验证并封装cert返回,否则就会跳转至SSO的登录页面。

 

      3、SSO中心不管是哪种情况最终处理完了都会封装好对应的证书返回到源系统的负责验证证书的路径。

            该验证类负责验证证书中的cert所对应的对象是否跟之前的对象中的随机id一致,如果是则设置

             session并返回源页面,否则其他跳转到对应的出错页面。

 

简单的流程图:



 该方案还不是很完善,只是一种可行的方案!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值