当前位置: 首页 > 网络应用技术

后面的十张老鸟的照片谈论了单点登录。

时间:2023-03-08 00:53:18 网络应用技术

  Web应用程序采用浏览器/服务器体系结构,HTTP用作通信协议。HTTP是无状态协议。每个浏览器的请求将独立处理,并且不与先前或后续请求相关联。下图在下图中解释了此过程。与响应之间正确连接的三个请求/响应之间没有连接。

  但这也意味着任何用户都可以通过浏览器访问服务器资源。如果要保护服务器的某些资源,则必须限制浏览器请求;为了限制浏览器请求,您必须确定浏览器请求,响应法律请求,忽略忽略的请求;要确定浏览器请求,必须清除浏览器请求状态。由于HTTP协议不是状态,让服务器和浏览器一起维护状态!这是会话机制。

  浏览器首次请求服务器,服务器创建了一个会话,并将会话的ID作为对浏览器的响应的一部分发送。服务器中的服务器ID知道它是否是同一用户。该过程使用下面的图来解释,然后随后的请求与第一个请求相关联。

  服务器将会话对象保存在内存中。浏览器如何保存会话ID?您可能会想到两种方式

  会话ID用作每个请求的参数。接收请求的服务器可以自然分析参数以获取会话ID,并确定它是否来自同一会话。显然,此方法不可靠。然后浏览器将维护此会话ID本身。每次发送HTTP请求时,浏览器都会自动发送会话ID。Cookie机制仅用于执行此操作。Cookie是浏览器存储少量数据的机制。数据以“键/值”的形式存储。发送HTTP请求时,浏览器会自动与cookie一起使用

  当然,Tomcat会话机制也实现了Cookie。访问Tomcat服务器时,您可以看到一个称为“ JSessionIdid”的曲奇。这是Tomcat会话机制的会话ID。

  有了会话机制,登录状态很容易理解。用户是合法用户,应将本会话标记为“授权”或“登录”和其他状态。由于它是会话的状态,因此自然存储在会话对象中。

  当用户再次采访时,Tomcat检查会话对象中的登录状态

  浏览器请求的带有登录状态的服务器模型如下所述

  每次请求保护资源时,都会在会话对象中检查登录状态。只能访问Islogin = true的会话并实现登录机制。

  Web系统长期以来从长期的单系统发展到由多系统组成的应用程序组。面对这么多的系统,用户想一个一个一个登录,然后一一取消?如下所述

  Web系统开发为一个多系统应用程序组。复杂性应由系统而不是用户承担。对于用户而言,Web系统有多复杂,这是一个统一的整体。也就是说,访问Web系统的整个应用程序组与访问单个系统相同。足以登录/登录/取消。

  尽管单系统登录解决方案是完美的,但它不再适用于多系统应用程序组。为什么?

  单个系统登录解决方案的核心是cookie,携带会话ID的cookie以维护浏览器和服务器之间的会话。但是cookie受到限制。该限制是cookie的域(通常与网站的域名相对应)。当浏览器发送HTTP请求时,它将自动携带匹配域而不是所有cookie的cookie

  在这种情况下,为什么不统一Web应用程序组中所有子系统的域名,例如“*.baidu.com”,然后设置其cookie域玩具,甚至许多用于登录的系统在早期,与相同的域名共享cookie。

  但是,可行性并不意味着好的,共享cookie有很多限制。首先,应用程序组名称必须统一;其次,应用程序组系统系统使用的技术(至少是Web服务器)应相同,否则cookie的键值(tomcat是jsessionId),并且无法维护会话。例如Java,PHP,.NET系统;第三,饼干本身并不安全。

  因此,我们需要一种全新的登录方法来实现多系统应用程序组的登录。这是一个单点登录

  文章第一个公共帐户:代码猿技术专栏

  什么是单点登录?单个登录全名单签名(以下称为SSO)是指在多系统应用程序组中的系统中登录,可以在所有其他系统中授权所有其他系统,而无需再次登录,包括一个- 点登录和单点取消。

  与单个系统登录相比,SSO需要一个独立的认证中心。只有认证中心才能接受安全信息,例如用户的用户名和密码。其他系统不提供登录入口,仅接受认证中心的间接授权。通过代币授权,SSO认证中心验证用户的用户名和密码没有问题。创建授权令牌。在下一个跳跃过程中,授权令牌作为参数发送到每个子系统,并且子系统获取令牌卡。也就是说,要获得授权,您可以使用它来创建局的会话。本地会话登录方法与单个系统的登录方法相同。此过程,即一个点登录的原理,使用下图解释

  下图以下简要说明

  用户登录成功后,将使用SSO认证中心和每个子系统建立会话。用户和SSO认证中心建立的会话称为全球会话。子系统的保护资源将不再通过SSO认证中心。全球对话和本地会议有以下限制

  您可以通过网站的登录过程(例如Blog Garden,Baidu,CSDN,TAOBAO等)加深对单点登录的理解,请注意观察登录过程中的跳URL和参数

  自然,一个点登录也必须取消一个点。在子系统中登录。所有子系统的会议将被破坏。使用下面的图片解释

  SSO认证中心一直在听全球对话的状态。

  下图在上面简要说明

  单点登录涉及SSO认证中心和子系统。子系统和SSO认证中心需要进行交流以交换令牌,验证令牌和启动取消请求。因此,子系统必须集成SSO客户端。服务器,整个单点登录过程本质上是SSO客户端和服务器之间的通信过程。描述了下图

  与SSO认证中心与SSO客户端进行沟通有很多方法。这是一个简单而简单的用作httpclient的示例。Web服务,RPC,RESTFUL API可以全部

  这只是基于Java的实现过程的简要介绍。它不提供完整的源代码。我了解原则。我相信您可以自己实施。让我们首先看一下SSO-CLIENT和SSO服务器想要实现的功能(下图:SSO认证中心= SSO服务器)

  SSO客户

  SSO服务器

  *接下来,让我们根据原理逐步实现SSO!

  Java拦截请求是三种方法:servlet,过滤和侦听器。我们在sso-client中使用filter.construct.java类并实现过滤器界面,将截距()方法添加到dofilter()方法中

  从SSO客户到SSO认证中心不可用的请求,然后跳到登录页面。这个过程与SSO-CLIENT完全相同

  用户在登录页面上输入用户名密码,请求登录,SSO认证中心检查用户信息,验证成功,并且会话状态标记为“登录”

  授权令牌是一个随机字符。如何以哪种方式赚钱都没关系。只要您不重复,伪造就不容易。以下是一个示例。

  SSO认证中心登录后,跳回子系统并附加令牌后,子系统(SSO-CLIENT)获得令牌,然后转到SSO认证中心检查,向Loginfilter.java的Dofilter()添加几行

  使用httpclient实现了verify()方法。仅在这里简要介绍。有关HTTPCLIENT的详细使用,请参阅官方文档

  用户在SSO认证中心登录后,SSO服务器创建了一个授权的令牌并存储了令牌。因此,SSO服务器对令牌的验证是找出是否存在和到期。

  令牌和注册的系统地址通常存储在键值数据库中(例如REDIS),REDIS可以为token.redis的有效性周期设置有效时间在内存中运行,并且非常快,只是SSO,只是- 服务器不需要在任何数据中持续存在。

  令牌和注册的系统地址可以存储在下图中描述的redis中。您可能会问,为什么要存储这些系统的地址?如果未存储,则取消时会很麻烦。用户向SSO认证中心提交请求。SSO认证中心取消了全球对话,但是我发送了取消请求以取消本地会议

  令牌验证成功后,SSO-CLIENT将当前的本地会话标记为“登录”,修改loginfilter.java,添加几行

  SSO-CLIENT还需要将当前会话ID与令牌绑定,表明本会话的登录状态与令牌有关。可以通过Java的哈希图保存这种关系。

  用户将带有“注销”参数(取消请求)的请求发送到子系统。

  SSO认证中心还以相同的方式确定SSO-CLIENT的请求(使用“注销”参数),而SSO认证中心取消了全局会话

  SSO认证中心有一个全球听众。一旦取消全局会话,所有注册系统将被告知取消

  作者:代码猿技术专栏