共同父域下的单点登录

标签: SSO
2014-03-04 22:38 12686人阅读 评论(17) 收藏 举报

分类:
Java Web(12)

作者同类文章X

版权声明:本博客所有的原创文章,作者皆保留版权。

本文来自:高爽|Coder,原文地址:http://blog.csdn.net/ghsau/article/details/20466351,转载请注明。
       单点登录(Single Sign On),简称为SSO,SSO不仅在企业级开发很常用,在互联网中更是大行其道。随便举几个例子,比如我们登录新浪微博后,再访问新浪首页后,我们发现,已经自动登录了;再比如我们登录CSDN后,可以写博客、逛论坛、下载资源等等。前者是完全跨域的单点登录,下文会讲,后者是共同父域下(www.csdn.net、blog.csdn.net、bbs.csdn.net、passport.csdn.net)的单点登录,也就是本文的主要内容。
       单点登录实际上是“身份认证”的整合,当我们存在多个应用时,我们希望登录了其中的一个应用,再访问其他应用时,会自动登录,避免用户重复的体力劳动。单点登录的实现原理是比较简单的,如下图所示,当用户通过浏览器第一次访问应用系统1时,由于还没有登录,会被引导到认证系统进行登录。下面开始单点登录的过程:认证系统根据用户在浏览器中输入的登录信息,进行身份认证,如果认证通过,返回给浏览器一个证明ticket(票);用户再访问其它应用系统时,会带着ticket;应用系统接收到ticket后,会将其发送到认证系统进行合法性校验;校验通过后,用户就不需要再次输入用户名密码来登录了,从而实现了单点登录的功能。

上面描述的过程实际上是WEB-SSO。要实现SSO,首先必须要有统一的认证系统,其次每个应用系统都通过认证系统来校验用户,所以这需要两方面的配合。WEB-SSO是比较好实现的,尤其是共同父域的情况下,我们可以通过浏览器的cookie来保存ticket。今天我用Servlet技术实现了SSO的主要功能,可以在这里下载项目。

域名准备

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

[html] view plaincopyprint?
  1. 127.0.0.1 web1.ghsau.com
  2. 127.0.0.1 web2.ghsau.com
  3. 127.0.0.1 passport.ghsau.com
127.0.0.1 web1.ghsau.com
127.0.0.1 web2.ghsau.com
127.0.0.1 passport.ghsau.com

3个域名必须拥有共同父域(.ghsau.com),web1和web2用于访问应用系统,passport用于访问认证系统。

项目部署

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

[html] view plaincopyprint?
  1. <servlet>
  2. <servlet-name>SSOAuth</servlet-name>
  3. <servlet-class>com.ghsau.servlet.SSOAuth</servlet-class>
  4. <init-param>
  5. <!-- ticket名称 -->
  6. <param-name>cookieName</param-name>
  7. <param-value>SSOID</param-value>
  8. </init-param>
  9. <init-param>
  10. <!-- ticket作用域 -->
  11. <param-name>domainName</param-name>
  12. <param-value>.ghsau.com</param-value>
  13. </init-param>
  14. <init-param>
  15. <param-name>secure</param-name>
  16. <param-value>false</param-value>
  17. </init-param>
  18. <init-param>
  19. <!-- ticket内容加密密钥,必须为24个字符,中文算2个字符 -->
  20. <param-name>secretKey</param-name>
  21. <param-value>111111112222222233333333</param-value>
  22. </init-param>
  23. <init-param>
  24. <!-- 服务器中ticket的有效期,单位分钟 -->
  25. <param-name>ticketTimeout</param-name>
  26. <param-value>10080</param-value>
  27. </init-param>
  28. </servlet>
  29. <servlet-mapping>
  30. <servlet-name>SSOAuth</servlet-name>
  31. <url-pattern>/SSOAuth</url-pattern>
  32. </servlet-mapping>
<servlet><servlet-name>SSOAuth</servlet-name><servlet-class>com.ghsau.servlet.SSOAuth</servlet-class><init-param><!-- ticket名称 --><param-name>cookieName</param-name><param-value>SSOID</param-value></init-param><init-param><!-- ticket作用域 --><param-name>domainName</param-name><param-value>.ghsau.com</param-value></init-param><init-param><param-name>secure</param-name><param-value>false</param-value></init-param><init-param><!-- ticket内容加密密钥,必须为24个字符,中文算2个字符 --><param-name>secretKey</param-name><param-value>111111112222222233333333</param-value></init-param><init-param><!-- 服务器中ticket的有效期,单位分钟 --><param-name>ticketTimeout</param-name><param-value>10080</param-value></init-param></servlet><servlet-mapping><servlet-name>SSOAuth</servlet-name><url-pattern>/SSOAuth</url-pattern></servlet-mapping>

WebSSODemo/WEB-INF/web.xml:

[html] view plaincopyprint?
  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.ghsau.com:8080/WebSSOAuth/SSOAuth</param-value>
  8. </init-param>
  9. <init-param>
  10. <!-- 认证系统登录页面 -->
  11. <param-name>SSOLogin</param-name>
  12. <param-value>http://passport.ghsau.com:8080/WebSSOAuth/login.jsp</param-value>
  13. </init-param>
  14. <init-param>
  15. <!-- 认证系统ticket名称 -->
  16. <param-name>cookieName</param-name>
  17. <param-value>SSOID</param-value>
  18. </init-param>
  19. </filter>
  20. <filter-mapping>
  21. <filter-name>SSOAuth</filter-name>
  22. <url-pattern>*.jsp</url-pattern>
  23. </filter-mapping>
  24. <filter-mapping>
  25. <filter-name>SSOAuth</filter-name>
  26. <url-pattern>/logout</url-pattern>
  27. </filter-mapping>
<filter><filter-name>SSOAuth</filter-name><filter-class>com.ghsau.filter.SSOAuth</filter-class><init-param><!-- 认证系统服务 --><param-name>SSOService</param-name><param-value>http://passport.ghsau.com:8080/WebSSOAuth/SSOAuth</param-value></init-param><init-param><!-- 认证系统登录页面 --><param-name>SSOLogin</param-name><param-value>http://passport.ghsau.com:8080/WebSSOAuth/login.jsp</param-value></init-param><init-param><!-- 认证系统ticket名称 --><param-name>cookieName</param-name><param-value>SSOID</param-value></init-param></filter><filter-mapping><filter-name>SSOAuth</filter-name><url-pattern>*.jsp</url-pattern></filter-mapping><filter-mapping><filter-name>SSOAuth</filter-name><url-pattern>/logout</url-pattern></filter-mapping>

如果域名或端口号和我的不一致,可以修改对应配置项。最后部署到应用服务器中,启动服务器。

SSO使用

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

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

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

我们接着点击Logout注销用户,页面跳转到了登录页面,这时我们再回头访问第一个应用系统的页面,发现同样跳转到了登录页面。这给用户的使用效果就是,一个应用登录了,其它的应用都会自动登录,而一个应用中注销了,其它的应用也都会自动注销,好神奇的样子。
       项目中提供了源码,代码的实现思路就是上面的那个图,ticket保存在cookie中,利用cookie域的特性,实现了ticket在不同应用中都能够获取到,ticket的验证过程是使用了HttpClient来发送的验证请求,ticket的加密使用了3DES,具体可以看DESUtils.java,好了,就到这里吧,如果有什么问题,欢迎讨论。
       本文来自:高爽|Coder,原文地址:http://blog.csdn.net/ghsau/article/details/20466351,转载请注明。

22
1
  • 上一篇Cookie深度解析
  • 下一篇完全跨域的单点登录
相关文章推荐
  • SSO系列之——同域下单点登录系统介绍
  • 免费直播 神经网络的原理及结构设计--何宇健
  • SSM框架入门和搭建 十部曲
  • Apache Weex:移动研发的进阶之路--董岩
  • 如何在servlet中获取jsp中form表单提交的变量,以及jsp与servlet之间的数据传递
  • C++ 百万并发网络通信引擎架构与实现
  • 共同父域下的单点登录
  • PHP入门到精通及项目实战
  • 共同父域下的单点登录
  • Kotlin基本语法到实战开发
  • 共同父域下的单点登录
  • Android 实战开发 第三方SDK 讯飞语音SDK
  • 共同父域下的单点登录
  • 同父域sso单点登录源码SSO_SameFather
  • java实现sso单点登录(同域、同父域、跨域)
  • 单点登录SSO(同父域实现)

转载于:https://www.cnblogs.com/jobs-lgy/p/7813512.html

共同父域下的单点登录相关推荐

  1. 将一个域下的cookie传到另一个域_单点登录那些事儿(二)同域下的单点登录

    单点登录(SSO,Single Sign On)对我们来说已经不陌生了,一次登录,处处登录.企业旗下都是自己的应用系统,所有的应用系统都使用同一个一级域名,通过不同的二级域名来区分应用系统.例如:百度 ...

  2. 前端把cookie写在父域里_单点登录的三种实现方式

    前言 在 B/S 系统中,登录功能通常都是基于 Cookie 来实现的.当用户登录成功后,一般会将登录状态记录到 Session 中,或者是给用户签发一个 Token,无论哪一种方式,都需要在客户端保 ...

  3. Web应用跨域访问及单点登录解决方案汇总

    做过跨越多个网站的Ajax开发的朋友都知道,如果在A网站中,我们希望使用Ajax来获得B网站中的特定内容,如果A网站与B网站不在同一个域中,那么就出现了跨域访问问题.Ajax的跨域访问问题是现有的Aj ...

  4. cookie跨域,实现单点登录

      Cookie 跨域,实现单点登录 Table title                         最近在做一个单点登录的系统整合项目,之前我们使用控件实现单点登录(以后可以介绍一下).但现 ...

  5. 举个栗子!Tableau 技巧(158):如何实现双域的服务器单点登录

    单点登录(SingleSignOn,SSO),是指用户只需一次登录就可以访问所有相互信任的应用系统,不需要管理员对用户的登录状态或其他信息进行修改. 实际分析应用中,很多企业都有单点登录的需求.例如: ...

  6. java单点登录跨域_深入浅出让你理解跨域与SSO单点登录原理与技术

    原标题:深入浅出让你理解跨域与SSO单点登录原理与技术 一:SSO体系结构 SSO SSO英文全称Single Sign On,单点登录.SSO是在多个应用系统中,用户只需要登录一次就可以访问所有相互 ...

  7. asp 退出登录修改cookie能进入后台_深入浅出让你理解跨域与SSO单点登录原理与技术...

    一:SSO体系结构 SSO SSO英文全称Single Sign On,单点登录.SSO是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统.它包括可以将这次主要的登录映射到其他应用 ...

  8. 不同域名下的单点登录

    可以选择将 Session ID (或 Token )保存到浏览器的 LocalStorage 中,让前端在每次向后端发送请求时,主动将LocalStorage的数据传递给服务端 这些都是由前端来控制 ...

  9. linux单点登录命令,配置RHEV中LINUX 虚拟机使用ACTIVE DIRECTORY(AD域)实现单点登录的方法...

    要配置 Red Hat Enterprise Linux 虚拟机使用 GNOME 和 KDE 图形桌面系统和 Active Directory 服务器实现单点登录,您需要在虚拟机上安装 rhevm-g ...

最新文章

  1. java实现fread_fread函数读取到的数据和实际数据不一样
  2. STM32 KEIL中 负数绝对值处理
  3. 版本效果MoonWarrior cocos2d-x版本 --1
  4. php 企业号文本消息推送,Python如何实现微信企业号文本消息推送功能的示例
  5. 十分良心!全网最详细的Java 自动内存管理机制及性能优化教程
  6. 剑指offer--面试题12
  7. C# 检测dll的新版本号方法
  8. jquery.nicescroll完美滚动条使用方法
  9. [Buzz.Today]2013.03.28
  10. mac ssh远程登录linux,MAC使用SSH远程登录
  11. 【ZOJ - 3715】Kindergarten Election(枚举得票数,贪心)
  12. 超准!生活中48条让人匪夷所思的诡秘心理...
  13. 计算机教师继续教育心得,教师继续教育培训个人心得体会
  14. SQL Server 2008 R2 学习总结
  15. bitvise一个非常好用的ssh软件
  16. jq chosen下拉列表被遮挡
  17. Q1净亏损同比扩大222% 四通一达业绩垫底百世还能逆袭吗?
  18. 政府主办!百万奖金!大厂offer!山东省数据应用创新创业大赛等你来!
  19. 噪音消除小技巧--噪音匹配
  20. dede php,织梦(Dedecms){dede:php}{/dede:php}如何运用

热门文章

  1. 【Hive】distinct on different columns not supported with skew in data
  2. Android精品软件汇总(不断更新)
  3. 车载人机交互语音android,手机与车机如何实现语音智能交互?
  4. 大数据仓库技术实训任务2
  5. js java 图片上传_spring(java,js,html) 截图上传图片实例详解
  6. 【图解】什么是拥塞控制,这应该是把拥塞控制讲的最好的文章了
  7. 广义表的长度,深度及复制广义表的算法
  8. resultType=int 和 resultType=java.lang.Integer
  9. 更新包与已安装应用的签名不一致
  10. Java中三种代理方式—— 静态代理与两种动态代理的实现机制