首页 > 编程知识 正文

java单点登录原理,单点登录方式

时间:2023-05-04 07:51:30 阅读:149128 作者:4648

一.单点登录介绍

单点登录(Single Sign On )简称SSO,是比较流行的企业业务集成解决方案之一。 SSO的定义是,在多个APP应用程序系统中,用户可以通过一次登录访问所有相互信任的APP应用程序系统。

二.技术实现机制

用户第一次访问APP应用系统时,因为还没有登录,所以会被身份验证系统引导登录。 根据用户提供的登录信息,认证系统进行认证,认证合格的情况下,向用户返回认证的认证信息--ticket的用户访问其他APP应用时,带上该ticket,作为自己认证的证书。 如果验证通过,用户不需要再次登录就可以访问APP应用系统2和APP应用系统3。

实现SSO需要以下主要功能:

1 .所有APP应用共享一个认证系统。

统一的认证系统是SSO的前提之一。 验证系统的主要功能是将用户的登录信息与用户数据库进行比较,对用户进行登录验证。 认证成功后,认证系统应该生成统一的认证标记(ticket )并返回给用户。 另外,认证系统应该对ticket判断有效性。

2 .所有APP应用程序都可以标识并提取ticket信息。

为了实现SSO的功能,用户只需登录一次,APP应用系统就可以识别登录的用户。 APP应用程序应该能够识别和提取ticket,通过与认证系统的通信,可以自动判断当前用户是否登录,完成单点登录的功能。

3.CAS开源

官方网页: CAS

此代码实现的一部分可以引用CAS单点登录

4 .同域单点登录

一个企业通常只有一个域名,通过二级域名来区分不同的系统。 例如,有一个叫a.com的域名,有app1.a.com和app2.a.com两个业务系统。 要进行单点登录(SSO ),需要有名为sso.a.com的登录系统。

登录sso.a.com后,还会登录app1.a.com和app2.a.com。 在上述登录认证机制中,虽然登录了sso.a.com,但实际上sso.a.com的服务器端的session记录了登录状态,Cookie在浏览器端(Browser )的sso.a.com上写入了文件那么,怎样才能让app1.a.com和app2.a.com登录呢? 这里有两个问题:

Cookie不能跨越域。 我们Cookie的域属性是sso.a.com,不能向app1.a.com和app2.a.com发送请求。

so、app1、app2是不同的APP应用,它们的session存在于独特的APP应用中且不被共享。

那么如何解决这两个问题呢? 对于第一个问题,sso登录后,可以将Cookie的域设置为顶级域,即. a.com。 这将允许所有子域的系统访问顶级域的Cookie。 设置cookie时,只能设置顶级域和自己的域,而不能设置其他域。 例如,您不能在自己的系统上在baidu.com的域中设置Cookie。

饼干的问题解决了,我们来看看session的问题吧。 我们登录了sso系统,这时又访问了app1,把cookie也带到了app1的服务器端(Server )。 app1的服务端如何找到与这个cookie对应的Session? 在此,如图所示,共享三个系统的Session。 共享会话的解决方案有Spring-Session等很多。 这样也解决了第二个问题。

虽然在同一个域中实现了单点登录,但这还不是真正的单点登录。

5 .不同域上的单点登录

该域中的单点登录巧妙地使用了Cookie顶级域的特性。 如果是不同的域呢? Cookie不会在不同的域之间共享。 我该怎么办?

本节介绍了CAS流程,这是单点登录的标准流程。

上图为CAS官网的标准流程,具体流程如下。

1 .用户进入app系统,app系统需要登录,但用户现在没有登录。

2 .跳转到cas服务器,即SSO注册系统。 以下图中的casserver统称为SSO系统。 SSO系统也未登录,将显示用户登录页面。

3 .用户填写用户名、密码,SSO系统进行认证后,将登录状态写入SSO的session,浏览器写入SSO域下的Cookie。

4.SSO系统登录后,生成服务主题(ST ),跳转到app系统,并将ST作为参数传递给app系统。

5.app系统获取ST后,从后台向SSO发送请求,验证ST是否有效。

6 .认证通过后,app系统会将登录状态写入session,并设置app域下的Cookie。

这样就完成了域之间的单点登录。 以后访问app系统时,app会登录。 接下来,我们来看看访问app2系统时的流程。

1 .用户已访问app2系统,app2系统未登录。 跳

到SSO。

2.由于SSO已经登录了,不需要重新登录认证。

3.SSO生成ST,浏览器跳转到app2系统,并将ST作为参数传递给app2。

4.app2拿到ST,后台访问SSO,验证ST是否有效。

5.验证成功后,app2将登录状态写入session,并在app2域下写入Cookie。

这样,app2系统不需要走登录流程,就已经是登录了。SSO,app和app2在不同的域,它们之间的session不共享也是没问题的。

有的同学问我,SSO系统登录后,跳回原业务系统时,带了个参数ST,业务系统还要拿ST再次访问SSO进行验证,觉得这个步骤有点多余。他想SSO登录认证通过后,通过回调地址将用户信息返回给原业务系统,原业务系统直接设置登录状态,这样流程简单,也完成了登录,不是很好吗?

其实这样问题时很严重的,如果我在SSO没有登录,而是直接在浏览器中敲入回调的地址,并带上伪造的用户信息,是不是业务系统也认为登录了呢?这是很可怕的。

六.总结

单点登录(SSO)的所有流程都介绍完了,原理大家都清楚了。总结一下单点登录要做的事情:

1.单点登录(SSO系统)是保障各业务系统的用户资源的安全 。

2.各个业务系统获得的信息是,这个用户能不能访问我的资源。

3.单点登录,资源都在各个业务系统这边,不在SSO那一方。 用户在给SSO服务器提供了用户名密码后,作为业务系统并不知道这件事。 SSO随便给业务系统一个ST,那么业务系统是不能确定这个ST是用户伪造的,还是真的有效,所以要拿着这个ST去SSO服务器再问一下,这个用户给我的ST是否有效,是有效的我才能让这个用户访问。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。