单点登录系统技术(HttpClient)梳理(二)

系统中两种单点登录实现方式:

1、  直接登录单点登录认证系统。

2、  登录业务系统,如用户此时为首次登录,则跳转得到单点登录认证界面。如用户已通过认证,则直接登录到业务系统。

 

【补充说明】

单点登录认证服务器地址:http://192.168.61.124:8080/SSOAuth_v1.0.0/

业务系统服务器地址:http://192.168.61.134:8080/sepmis_v1.3.0/

 

直接登录单点登录认证系统流程:

1、  打开单点登录认证服务器登录页面,输入用户名密码。

2、  如果通过认证,此时页面跳转到系统主界面main.jsp。这个时候在加载main.jsp页面同时,页面后端通过ajax中jsonp方式,向单点登录认证服务器后台Action发送hello请求。需要传递参数,当前用户代码。

main.jsp页面核心代码如下:

3、  后台接受hello请求,通过传递的参数用户代码,在SysRealuser表中判断用户所能够访问到的业务系统对象。拿到业务系统对象中url参数,组织各个业务系统setCookie Url。然后通过json异步传回前台。

Url格式例如:(红色字体处为变量)

http://192.168.61.134:8080/sepmis_v1.3.0/setCookie.do?userCode=xxx&&callback=?

代码如下:

4、  前台main.jsp页面这时拿到传回的URL参数,此时执行Success代码段中的函数

此时function中参数data就是传回的URL参数,然后遍历执行Jquery中getJSON方法。此时通过AJAX技术异步又向各个业务系统发送setCookie请求,此操作可以视为一种透明的登录操作,用户是不能够感知到。

5、  业务系统接受setCookie action请求。

代码如下:

业务系统通过setCookie方法,将此用户在业务系统中Cookie存储到用户本地。

6、  输入业务系统连接。

业务系统同后台通过filter过滤所有请求,获取用户在当前服务器域下Cookie值,进行校验,通过校验进入系统,未通过校验返回单点登录认证页面。

SSOFilter.java核心代码如下

执行通过业务系统fileter将,根据不同的请求进行不同的操作。获取业务系统Cookie后同构使用HttpClient类方法调用单点认证中的authcookie方法,验证用户Cookie的合法性。

RealSysLoginAction.java类authcookie方法代码:

此种登录方法要修改原有业务系统中的登录action方法。

 

业务系统LoginSSOAction.java类,loginSSO登录方法

业务系统总filter 在web.xml文件中配置方法:

未通过认证,登录业务系统,跳转到单点登录认证。

1、  输入业务系统服务地址

2、  系统自动跳转到单点登录服务器,下边过程同上“直接登录单点登录认证系统流程”

其原理是通过filter实现类中dofilter方法进行过滤,判断用没有Cookie,则进行跳转到单点登录认证界面。

过滤代码如下:

单点登录系统技术(SSO)梳理(一)

1、 概念

单点登录概念:Single Sign On,简称SSO,即在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。

2、SSO实现方法

单点登录实现方法:

1、  例如:惠普灵越单点登录系统,只是通过向各个系统发送用户名和密码

2、  例如:例如淘宝、天猫大型网站所使用的SSO技术,只要登录一个另一个关联网站就不用在登录。

案例实现说明:

http://blog.chinaunix.net/uid-25508399-id-3431705.html

http://developer.51cto.com/art/201104/255729.htm

http://blog.csdn.net/clh604/article/details/20365967

单点登录网上有很多实现方法,例如:

  • 基于cookies实现
  • Broker-based(基于经纪人)
  • Agent-based(基于代理)
  • Token-based

本次单点系统的是基于Cookie技术实现的,但是使用cookie存在两个大问题:

1、  由于cookie是存储在客户端本地,所以在安全性是是存在问题。

解决方法:通过对cookie值进行加密操作。

2、  Cookie本身是不能跨域的,这个问题难解决。

解决方法:将cookie结合Ajax中的jsonp协议。

3、JSONP跨域原理

利用在页面中创建<script>节点的方法向不同域提交HTTP请求的方法称为JSONP,这项技术可以解决跨域提交Ajax请求的问题。JSONP的工作原理如下所述:

假设在http://example1.com/index.jsp这个页面中向http://example2.com/getinfo.jsp提交GET请求,我们可以将下面的JavaScript代码放在http://example1.com/index.jsp这个页面中来实现:

当GET请求从http://example2.com/getinfo.jsp返回时,可以返回一段JavaScript代码,这段代码会自动执行,可以用来负责调用http://example1.com/index.jsp页面中的一个callback函数。

  • JSONP的优点是:它不像XMLHttpRequest对象实现的Ajax请求那样受到同源策略的限制;它的兼容性更好,在更加古老的浏览器中都可以运行,不需要XMLHttpRequest或ActiveX的支持;并且在请求完毕后可以通过调用callback的方式回传结果。
  • JSONP的缺点则是:它只支持GET请求而不支持POST等其它类型的HTTP请求;它只支持跨域HTTP请求这种情况,不能解决不同域的两个页面之间如何进行JavaScript调用的问题。

 

下面我重点说明一下跨域问题:

什么是跨域:

之所以会有跨域问题,产生的根本原因是浏览器的同源策略限制,理解同源策略的限制是指代码获得或者更改从一个域名下获取文件或者信息,也就是说我们请求地址必须和当前网站的地址相同。同源策略通过隔离来实现对资源的保护。