黑马程序员技术交流社区
标题: 单点登录的一种实现 [打印本页]
作者: 小江哥 时间: 2018-1-25 20:52
标题: 单点登录的一种实现
本帖最后由 小江哥 于 2018-1-25 20:52 编辑
一、什么是单点登录SSO(Single Sign-On)
SSO是一种统一认证和授权机制,指访问同一服务器不同应用中的受保护资源的同一用户,只需要登录一次,即通过一个应用中的安全验证后,再访问其他应用中的受保护资源时,不再需要重新登录验证。
二、单点登录解决了什么问题
解决了用户只需要登录一次就可以访问所有相互信任的应用系统,而不用重复登录。
例如淘淘项目中的订单系统,购物车系统,前台系统等。我们只要在taotao项目中访问任何一个子应用后,再访问其他应用站点的时候就不需要在进行登录。
一.用户第一次访问站点。1. 用户第一次访问>www.taotao1.com ,这个时候该站点下没有记录之前登录的Cookie,2. 所以在发现没有用户登录的情况下>跳转到了Login 页面。3. 用户现在输入用户名,密码登录,请求SSO登录API,登录成功,在Redis里面缓存一条Key=SessioID,Values=UserInfo这样一条记录,缓存时间可配置。Response 返回登录验证状态,和用户信息。4. 用户登录成功,记录下凭证,即此刻的SessionID写入Cookie.然后跳转到www.taotao1.com5. 这个时候有了Cookie,将记录的Cookie,也就是SessioID请求SSO验证Token接口,因为登录成功记录了Key=SessionID,所有可以获取到Values=即用户信息,Response 返回用户信息。6. 用户现在去访问www.taotao2.com站点,B站点无Cookie,这里SessionID还是当前会话的SessionID,所有区请求SSO主站点验证 Token接口,发现存在Key=SessionID,返回登录状态成功,用户信息。在B站点下记录Cookie 即token 配置。 这样用户第一次访问taotao1站点,从第一次登录,到访问其他站点的流程就走完了。
二.用户中途关闭浏览器,然后打开浏览器,访问B站点:1. 发现存在Cookie, 即Token凭证,去SSO主站的,验证发现存在Key=SessioID,获取Values将UserInfo返回给用户,返回用户任在登录状态。这样访问应用之前访问过的站点依旧在登录状态。2. 如果用户在执行访问第二个应用,这时候Redis缓存的登录状态过期,则返回验证凭证失败。这时候第二个应用跳转到登录状态,走用户登录的流程以及后续验证流程。注意记录Cookie的过期时间应该保证与Redis的过期时间一致性,不能在Redis缓存的过期时间之后过期,这样在用户此时访问第一个应用站 点的时候,发现Cookie不存在,就会通过SessionID去验证凭证,发现这时候是过期后重新登陆,会将此时的登陆状态写入Cookie.
三.退出只需要清除本地Cookie,调用SSO站点接口清除登陆缓存的状态即可实现登出。
四.注意:在实际的项目开发中会遇到各种情况,比如子站点和SSO主站点的接口调用参数约束,签名,加密等。
五.可能存在的两个问题
1.Cookie 不安全 2.不能跨域免登对于第一个问题一般都是通过加密 Cookie 来处理,第二个问题是硬伤,其实这种方案的思路的就是要把这个信任关系存储在客户端.采用类似与 redis 的分布式缓存的方案,既能提供可扩展数据量的机制,也能提供高效访问。对于第二个问题,一般采取数字签名的方法,要么通过数字证书签名,要么通过像 md5 的 方式,这就需要 SSO 系统返回免登 URL 的时候对需验证的参数进行 md5 加密,并带上 token 一起返回,最后需免登的系统进行验证信任关系的时候,需把这个 token 传给 SSO 系统,SSO 系统通过对 token 的验证就可以辨别信息是否被改过。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |