彻底跨域的单点登陆

版权声明:本文为博主原创文章,转载请注明出处http://blog.csdn.net/ghsau。html

       本文来自:高爽|Coder,原文地址:http://blog.csdn.net/ghsau/article/details/20545513,转载请注明。
       彻底跨域的单点登陆实现方案基本和上篇文章介绍的同样,只不过生成ticket的过程更复杂些。上篇文章中的项目是不能彻底跨域的,因为多个应用系统以及认证系统域不一样,也没有共同的父域,致使登陆后,认证系统向浏览器写的ticket在其它应用系统中获取不到,这时访问其它应用系统时,没有携带着ticket的cookie,没法认证也没法单点登陆。那解决的方案是每一个应用系统都向浏览器cookie中写入ticket,请看下图,图中浅蓝色圆角区域表明不一样的域,当用户经过浏览器第一次访问应用系统1时,因为尚未登陆,会被引导到认证系统进行登陆。下面开始单点登陆的过程:认证系统根据用户在浏览器中输入的登陆信息,进行身份认证,若是认证经过,返回给浏览器一个证实[认证系统_ticket];这时再经过浏览器将[认证系统_ticket]发送到到应用系统1的设置cookie的url,应用系统1返回给浏览器一个证实[应用系统1_ticket],这时再将请求重定向到最初访问的页面,之后应用系统1就能够自动登陆了。如今用户访问了应用系统2,因为应用系统2没有生成过cookie(可是用户已经在应用系统1登陆过一次了),将请求重定向到认证系统;认证系统检测到已经生成过[认证系统_ticket]了,认证经过;再经过浏览器将[认证系统_ticket]发送到到应用系统2的设置cookie的url,应用系统2返回给浏览器一个证实[应用系统2_ticket],这时再将请求重定向到最初访问的页面。应用系统3也一样原理,咱们等于将ticket作了一次同步,保证了每一个应用系统都有一份认证系统产生的ticket。剩余的ticket验证过程和上篇文章同样了。web

       ticket同步的过程用jsonp应该也能够实现,我基于上篇文章中的项目实现了彻底跨域的单点登陆,能够在这里下载项目。json

域名准备跨域

       修改hosts文件,映射3个域名:浏览器

[html] view plain copy服务器

 print?在CODE上查看代码片派生到个人代码片cookie

  1. 127.0.0.1 web1.com  
  2. 127.0.0.1 web2.com  
  3. 127.0.0.1 passport.com  

       三个域名都是独立的,没有共同父域,web1和web2用于访问应用系统,passport用于访问认证系统。app

 

项目部署jsp

       项目中包含的是两个Eclipse Project,导入到Eclipse/MyEclipse后,可能须要设置下JavaEE类库。WebSSOAuth为认证系统,WebSSODemo为应用系统,若是映射的域名和我设置的同样,不须要设置,直接部署便可。若是不同,须要修改下WebSSODemo/WEB-INF/web.xml文件。关键配置信息以下:jsonp

[html] view plain copy

 print?在CODE上查看代码片派生到个人代码片

  1. <filter>  
  2.     <filter-name>SSOAuth</filter-name>  
  3.     <filter-class>com.ghsau.filter.SSOAuth</filter-class>  
  4.     <init-param>  
  5.         <!-- 认证系统服务 -->  
  6.         <param-name>SSOService</param-name>  
  7.         <param-value>http://passport.com:8080/WebSSOAuth/SSOAuth</param-value>  
  8.     </init-param>  
  9.     <init-param>  
  10.         <!-- 认证系统ticket名称 -->  
  11.         <param-name>cookieName</param-name>  
  12.         <param-value>SSOID</param-value>  
  13.     </init-param>  
  14. </filter>  
  15. <filter-mapping>  
  16.     <filter-name>SSOAuth</filter-name>  
  17.     <url-pattern>*.jsp</url-pattern>  
  18. </filter-mapping>  
  19. <filter-mapping>  
  20.     <filter-name>SSOAuth</filter-name>  
  21.     <url-pattern>/logout</url-pattern>  
  22. </filter-mapping>  
  23. <filter-mapping>  
  24.     <filter-name>SSOAuth</filter-name>  
  25.     <url-pattern>/setCookie</url-pattern>  
  26. </filter-mapping>  

       若是域名或端口号和个人不一致,能够修改对应配置项。最后部署到应用服务器中,启动服务器。

 

SSO使用

       首先输入第一个应用系统的访问地址,http://web1.com:8080/WebSSODemo/index.jsp,若是是第一次访问的话,会自动跳转到登陆页,以下图:

       系统中内置了3个用户,张3、李4、王五,用户名和密码皆为拼音全拼,输入zhangsan/zhangsan登陆后,会自动跳转到咱们刚才访问的页面,页面中显示了登陆的用户名及欢迎信息,以下图:

       这时,咱们再输入第二个应用系统的访问地址,http://web2.com:8080/WebSSODemo/index.jsp,咱们发现,没有进行第二次登陆,一样页面中显示了登陆的用户名及欢迎信息,以下图:

       咱们接着点击Logout注销用户,页面跳转到了登陆页面,这时咱们再回头访问第一个应用系统的页面,发现一样跳转到了登陆页面。
       互联网中的彻底跨域登陆的站点也有不少,如淘宝天猫,但确定不是我这样实现的。个人实现中,认证系统和应用系统是经过url参数来传递ticket,可能存在一些不稳定因素。应用系统的每次请求都会经过HTTP远程到认证系统进行验证ticket,速度上应该会慢一些,这里能够改进一步,在每一个应用系统中也维护一份tickets,验证时,首先到本系统中验证,若是不存在,再远程到认证系统进行验证,但这也增长了应用系统的代码量。本文完,若是有什么问题,欢迎讨论。
       本文来自:高爽|Coder,原文地址:http://blog.csdn.net/ghsau/article/details/20545513,转载请注明。

相关文章
相关标签/搜索