什么是单点登录

单点登录

多系统,单一位置登录,实现多系统同时登录的一种技术

三方登录

某系统使用其他系统的用户,实现本系统登录的方式,比如使用微信登录就是使用第三方登录 。

跨域

跨域是指浏览器不能直接访问其他域名下的资源,包括不同协议、不同端口、不同域名等。这是由于浏览器的同源策略所

如何解决跨域

  1. JSONP:通过动态创建<script>标签,将需要获取的数据作为参数传递给服务器,服务器返回一段调用指定函数的JavaScript代码,浏览器执行该代码,从而实现跨域获取数据。

  2. CORS:即跨域资源共享,是一种官方标准的解决跨域问题的方案。通过在服务器端设置响应头Access-Control-Allow-Origin,允许指定的域名访问该资源。

  3. 代理:通过在同一域名下设置代理服务器,将跨域请求转发到目标服务器,然后将目标服务器的响应返回给浏览器,从而实现跨域访问。

  4. WebSocket:WebSocket协议可以在浏览器和服务器之间建立长连接,从而实现跨域通信。

单点登录的实现方式

Cookie

  1. 基于Cookie的单点登录:

    用户在第一次登录时,服务器在用户的浏览器中设置一个cookie,该cookie包含用户的登录信息。当用户访问其他应用程序时,这些应用程序会检查cookie中的信息,如果存在则认为用户已经登录。

  2. 跨域cookie 在默认情况下,浏览器会限制跨域请求的Cookie,以保护用户的隐私和安全。但是,有时候我们需要在不同域名之间共享Cookie,这就需要解决跨域问题。下面是一些解决跨域问题的方法:

Session

  1. session共享

    Session共享是指多个应用程序之间共享同一个用户Session信息的过程。在Web应用程序中,Session是用来存储用户状态信息的一种机制,它可以在用户访问同一个应用程序的不同页面时,保持用户的状态信息不变。

    然而,当用户访问不同的应用程序时,每个应用程序都会创建一个新的Session,这样就导致了Session信息的不一致性。为了解决这个问题,我们可以使用Session共享技术,将Session信息存储在一个外部存储中,比如Redis、MongoDB等,从而实现多个应用程序之间的Session共享。

    在实现Session共享时,我们需要考虑一些问题,比如Session的序列化和反序列化、Session的过期策略、Session的访问控制等。我们可以使用一些现成的框架来实现Session共享,比如Spring Session、Apache Shiro等。这些框架提供了一些方便的API和配置选项,使得Session共享变得更加容易和灵活。

  2. 如何实现session共享

    1. 数据库共享:将session存储在数据库中,不同的应用服务器通过访问同一数据库来实现session共享。

    2. 缓存共享:将session存储在缓存中,不同的应用服务器通过访问同一缓存来实现session共享。常用的缓存系统有Redis、Memcached等。

    3. 文件共享:将session存储在共享文件系统中,不同的应用服务器通过访问同一文件系统来实现session共享。

    4. Cookie共享:将session ID存储在cookie中,不同的应用服务器通过访问同一域名下的cookie来实现session共享。

  3. session跨域和解决方案

所谓 Session 跨域就是摒弃了系统(Tomcat)提供的 Session,而使用自定义的类似 Session 的机制来保存客户端数据的一种解决方案。 如:通过设置 cookie 的 domain 来实现 cookie 的跨域传递。在 cookie 中传递一个自定义 的 session_id。这个 session_id 是客户端的唯一标记。将这个标记作为 key,将客户端需要保 存的数据作为 value,在服务端进行保存(数据库保存或 NoSQL 保存)。这种机制就是 Session 的跨域解决。

  1. 使用同一顶级域名下的二级域名。比如,a.example.com和b.example.com都是example.com的子域名,它们可以通过设置Cookie的domain属性为“.example.com”来共享Cookie。

  2. 使用iframe或者JSONP跨域通信。这种方式可以通过在同一页面中嵌入iframe或者使用JSONP的方式来实现跨域通信,从而共享Cookie。

  3. 使用CORS(跨域资源共享)。CORS是一种浏览器技术,它允许服务器在HTTP响应头中指定允许跨域访问的域名,从而实现跨域共享Cookie。

    Token

基于Token的单点登录:

使用基于 Token 的身份验证方法,在服务端不需要存储用户的登录记录。

大概的流程 是这样的: 客户端使用用户名、密码请求登录 服务端收到请求,去验证用户名、密码 验证成功后,服务端会签发一个 Token,再把这个 Token 发送给客户端 客户端收到 Token 以后可以把它存储起来,比如放在 Cookie 里或者 Local Storage 里 客户端每次向服务端请求资源的时候需要带着服务端签发的 Token 服务端收到请求,然后去验证客户端请求里面带着的 Token,如果验证成功,就向客户 端返回请求的数据 使用 Token 验证的优势:

无状态、可扩展 在客户端存储的 Tokens 是无状态的,并且能够被扩展。基于这种无状态和不存储 Session 信息,负载负载均衡器能够将用户信息从一个服务传到其他服务器上。 安全性 请求中发送 token 而不再是发送 cookie 能够防止 CSRF(跨站请求伪造)。即使在客户端使 用 cookie 存储 token,cookie 也仅仅是一个存储机制而不是用于认证。不将信息存储在 Session 中,让我们少了对 session 操作。

Oauth2

基于OAuth2.0的单点登录:OAuth2.0是一种授权框架,可以用于实现单点登录。用户在第一次登录时,服务器会将用户的授权信息存储在OAuth2.0服务器中。当用户访问其他应用程序时,这些应用程序会向OAuth2.0服务器请求授权信息,如果授权信息有效则认为用户已经登录。

jwt

1 JWT(JSON Web Token)是一种用于身份验证和授权的开放标准。它可以在不同的应用程序之间共享用户身份信息,从而实现单点登录(SSO)。

  1. JWT 是一种紧凑且自包含的,用于在多方传递 JSON 对象的技术。

  2. 传递的数据可以使用 数字签名增加其安全行。可以使用 HMAC 加密算法或 RSA 公钥/私钥加密方式。

  3. 紧凑:数据小,可以通过 URL,POST 参数,请求头发送。且数据小代表传输速度快。

  4. 自包含:使用 payload 数据块记录用户必要且不隐私的数据,可以有效的减少数据库访 问次数,提高代码性能。

JWT 一般用于处理用户身份验证或数据信息交换。 用户身份验证:一旦用户登录,每个后续请求都将包含 JWT,允许用户访问该令牌允许 的路由,服务和资源。单点登录是当今广泛使用 JWT 的一项功能,因为它的开销很小,并 且能够轻松地跨不同域使用。

2 实现JWT单点登录的一般步骤如下:

  1. 用户在应用程序A中登录,应用程序A验证用户身份成功后,生成一个JWT Token,并将该Token返回给用户。

  2. 用户在访问应用程序B时,将该Token作为请求头或请求参数发送给应用程序B。

  3. 应用程序B接收到请求后,解析Token,验证Token的有效性和正确性。

  4. 如果Token验证通过,则应用程序B认为用户已经登录,并且可以使用Token中包含的用户信息进行授权和访问控制。

3 在实现JWT单点登录时,我们需要注意以下几点:

  1. JWT Token需要使用安全的算法进行签名和加密,以防止Token被篡改或伪造。

  2. JWT Token中应该只包含最少的用户信息,比如用户ID、用户名等,而不应该包含敏感信息,比如密码等。

  3. JWT Token应该设置有效期,以防止Token被滥用。

  4. 应用程序需要对Token进行管理和撤销,比如在用户退出登录时,需要将Token失效。

框架实现

shiro和spring security

Shiro和Spring Security都是用于身份验证和授权的Java安全框架,它们的主要区别如下:

  1. 架构设计:Shiro是一个轻量级的框架,它的设计目标是简单、易用、灵活,可以与任何框架和应用程序集成;而Spring Security是一个全面的安全框架,它是基于Spring框架的,因此可以很好地与Spring应用程序集成。

  2. 功能特点:Shiro提供了身份验证、授权、加密、会话管理等基本安全功能,同时还支持Web应用程序和非Web应用程序;而Spring Security提供了与Spring框架集成的全面安全功能,包括基于URL的访问控制、方法级别的访问控制、LDAP集成、OpenID集成、OAuth集成等。

  3. 配置方式:Shiro的配置方式比较简单,可以通过INI文件、XML文件、Java代码等方式进行配置;而Spring Security的配置方式比较复杂,需要使用XML或Java配置文件进行配置。

  4. 社区支持:Spring Security是由Spring社区维护和支持的,因此拥有更多的开发者和用户,可以获得更好的技术支持和文档资料;而Shiro的社区相对较小,但是Shiro的文档和示例比较丰富,易于学习和使用。

综上所述,Shiro适合小型应用程序和非Spring应用程序,它的设计简单、易用、灵活;而Spring Security适合大型应用程序和Spring应用程序,它提供了全面的安全功能和与Spring框架的深度集成。