单点登陆

Posted doit8791

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了单点登陆相关的知识,希望对你有一定的参考价值。

早上饭后坐在电脑前有点犯愁,不知道写点什么好。有些想法算法好,都是都还不成体系,凡是哪些不能清晰表达的,如果不能自己持续追问想清楚,写下来不仅对自己没什么帮助,对别人就更没啥价值。

即便可能随笔质量写的很差,但也应该努力用心写,而不是就那几分钟应付一下,否则就是真的浪费时间。

登录验证在开发中还经常遇到,尤其是几个系统要集成时必然要考虑单点登录的方案,目前用的最多的也还是CAS单点。看草稿箱有这样的一篇文章就发一下。

一、实现分析

当用户第一次访问应用系统1的时候,因为还没有登录,会被引导到认证系统中进行登录(1);根据用户提供的登录信息,认证系统进行身份效验,如果通过效验,应该返回给用户一个认证的凭据--ticket(2);用户再访问别的应用的时候(3,5)就会将这个ticket带上,作为自己认证的凭据,应用系统接受到请求之后会把ticket送到认证系统进行效验,检查ticket的合法性(4,6)。如果通过效验,用户就可以在不用再次登录的情况下访问应用系统2和应用系统3了。
技术分享图片
从上面的视图可以看出,要实现SSO,需要以下主要的功能:
  • 所有应用系统共享一个身份认证系统。
    统一的认证系统是SSO的前提之一。认证系统的主要功能是将用户的登录信息和用户信息库相比较,对用户进行登录认证;认证成功后,认证系统应该生成统一的认证标志(ticket),返还给用户。另外,认证系统还应该对ticket进行效验,判断其有效性。
  • 所有应用系统能够识别和提取ticket信息
    要实现SSO的功能,让用户只登录一次,就必须让应用系统能够识别已经登录过的用户。应用系统应该能对ticket进行识别和提取,通过与认证系统的通讯,能自动判断当前用户是否登录过,从而完成单点登录的功能。
 
上面的功能只是一个非常简单的SSO架构,在现实情况下的SSO有着更加复杂的结构。有两点需要指出的是:
  • 单一的用户信息数据库并不是必须的,有许多系统不能将所有的用户信息都集中存储,应该允许用户信息放置在不同的存储中,如下图所示。事实上,只要统一认证系统,统一ticket的产生和效验,无论用户信息存储在什么地方,都能实现单点登录。
 技术分享图片
  • 统一的认证系统并不是说只有单个的认证服务器,如下图所示,整个系统可以存在两个以上的认证服务器,这些服务器甚至可以是不同的产品。认证服务器之间要通过标准的通讯协议,互相交换认证信息,就能完成更高级别的单点登录。如下图,当用户在访问应用系统1时,由第一个认证服务器进行认证后,得到由此服务器产生的ticket。当他访问应用系统4的时候,认证服务器2能够识别此ticket是由第一个服务器产生的,通过认证服务器之间标准的通讯协议(例如SAML)来交换认证信息,仍然能够完成SSO的功能。
 技术分享图片

二、方案对比

1、OpenSSO

曾经Sun的一款开源产品,从很少的那一点点中文资料上来看,这个能实现我需要的那种SSO模式。从SUN被Oracle收购之后,Oracle便关闭了OpenSSO这个项目,现在在网上下不到OpenSSO的安装文件。而且以前的那些在SUN发布的很多相关的帮助文档,大多数链接都失效了,全都指向了Oracle的同一个页面,找不到文档中对应的安装文件。
2、OpenAM
OpenAM的原型应该就是OpenSSO,据说是在Oracle关闭OpenSSO时,被“解救”下来的。在OpenAM的官网上能找到相关的帮助文档,这种方法使用的LDAP服务器是OpenDS,而既存系统在OAS上使用的是OID(Oracle Internet Directory),客户希望沿用OID这个LDAP服务器,(恨死他们了),从OpenAM的安装过程来看,OpenAM似乎不支持OID,但是,在网上找到一些资料似乎修改一些配置还是可以做到的。
OpenAM 是一个领先的开源认证、授权的产品,可用于替换即将被取消的 OpenSSO。
OpenAM 提供核心的标识服务用来简化实现在一个网络架构中的透明单点登录,包括集中式或者分布式的单点登录。主要的特性有: 
    完全符合开源AAA产品; 
    AAA协议:计算机安全领域的协议,AAA指:鉴权,授权,计费(Authentication, Authorization, Accounting)
    简单易用、易配置;
    纯Java开发;
    可轻松配置联合认证系统,并集成到已有项目中。
最新的功能: 
    支持 XACML 协议 
    100%支持 OAuth 认证协议
    企业监控
3、Kerberos 也提供另外一种方式的 SSO ,即基于 Windows 域的 SSO
Spring Security Kerberos:将Windows Active Directory认证(或其它支持Kerberos的设施)与Spring Security集成来实现单点登录。
Spring Security Kerberos:Spring Security SAML:Spring Security CAS:都是针对单点登录服务器的客户端实现
4、CAS 是 Yale 大学发起的一个开源项目,据统计,大概每 10 个采用开源构建 Web SSO 的 Java 项目,就有 8 个使用 CAS 。这些统计可能言过其实,但有一点可以肯定的是, CAS 是最简单实效,而且足够安全的 SSO 选择,旨在为 Web 应用系统提供一种可靠的单点登录方法,CAS 在 2004 年 12 月正式成为 JA-SIG 的一个项目。CAS具有以下特点: 
开源的企业级单点登录解决方案。
CAS Server 为需要独立部署的 Web 应用。
CAS Client 支持非常多的客户端(这里指单点登录系统中的各个 Web 应用),包括Java, .Net, php, Perl, Apache, uPortal, Ruby 等。
5、shiro能不能做单点登录?
shiro的单点登录是通过集成cas实现的
6、通过session共享,需要做的太多,比如
不能实现跨域,需要自己实现(即使各service可以访问同一个session服务器,但是浏览器端跨域后,用户没有凭证TGT证明自己登陆了)
退出登陆需要自己实现,可以参考cas系统的退出
要自己做权限管理
要自己实现sevice控制,把非法的service排除在外
需要自己实现oauth
而上面这些CAS都做好了
http://blog.csdn.net/matthewei6/article/details/50636301

以上是关于单点登陆的主要内容,如果未能解决你的问题,请参考以下文章

单点登陆的测试

08-微服务版单点登陆系统(SSO)实践(2107)

SpringBoot实现用户统一管理与单点登陆

单点登陆TOKEN的处理

09-微服务版的单点登陆系统设计及实现

同一账户同时只能在一处登陆(单点登陆)