单点登录(一)

单点登录

  多系统,单一位置登录,实现多系统同时登录的一种技术。
  常出现在互联网应用和企业级平台中。
  如:京东。
  单点登录一般是用于互相授信的系统,实现单一位置登录,全系统有效的。
  
  三方登录:某系统,使用其他系统的用户,实现本系统登录的方式。如,在京东中使用微信登录。解决信息孤岛和用户不对等的实现方案。

一、Session跨域

   所谓Session跨域就是摒弃了系统(Tomcat)提供的Session,而使用自定义的类似Session的机制来保存客户端数据的一种解决方案。
  如:通过设置cookie的domain来实现cookie的跨域传递。在cookie中传递一个自定义的session_id。这个session_id是客户端的唯一标记。将这个标记作为key,将客户端需要保存的数据作为value,在服务端进行保存(数据库保存或NoSQL保存)。这种机制就是Session的跨域解决。
  什么跨域: 客户端请求的时候,请求的服务器,不是同一个IP,端口,域名,主机名的时候,都称为跨域。
  什么是域:在应用模型,一个完整的,有独立访问路径的功能集合称为一个域。如:百度称为一个应用或系统。百度下有若干的域,如:搜索引擎(www.baidu.com),百度贴吧(tie.baidu.com),百度知道(zhidao.baidu.com),百度地图(map.baidu.com)等。域信息,有时也称为多级域名。域的划分: 以IP,端口,域名,主机名为标准,实现划分。
  localhost / 127.0.0.1

  使用cookie跨域共享,是session跨域的一种解决方案。
  jsessionid是和servlet绑定的httpsession的唯一标记。

  cookie应用 - new Cookie("", “”).
  request.getCookies() -> cookie[] -> 迭代找到需要使用的cookie
  response.addCookie().
  cookie.setDomain() - 为cookie设定有效域范围。
  cookie.setPath() - 为cookie设定有效URI范围。

二、Spring Session共享 了解

  spring-session技术是spring提供的用于处理集群会话共享的解决方案。spring-session技术是将用户session数据保存到三方存储容器中,如:mysql,redis等。
  Spring-session技术是解决同域名下的多服务器集群session共享问题的。不能解决跨域session共享问题。
  使用: 配置一个Spring提供的Filter,实现数据的拦截保存,并转换为spring-session需要的会话对象。必须提供一个数据库的表格信息(由spring-session提供,找spring-session-jdbc.jar/org/springframework/session/jdbc/*.sql,根据具体的数据库找对应的SQL文件,做表格的创建)。
  spring-session表:保存客户端session对象的表格。
  spring-session-attributes表:保存客户端session中的attributes属性数据的表格。
  spring-session框架,是结合Servlet技术中的HTTPSession完成的会话共享机制。在代码中是直接操作HttpSession对象的。
在这里插入图片描述

三、Nginx Session共享

  nginx中的ip_hash技术能够将某个ip的请求定向到同一台后端,这样一来这个ip下的某个客户端和某个后端就能建立起稳固的session,ip_hash是在upstream配置中定义的,具体如下:

upstream nginx.example.com
{
    server 127.0.0.1:8080;
    server 127.0.0.1:808;
    ip_hash;
}
server
{
    listen 80;
    location /
    {
        proxy_pass
        http://nginx.example.com;
        proxy_set_header Host  $http_host;
        proxy_set_header Cookie $http_cookie;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        client_max_body_size  100m;
    }
}

  ip_hash是容易理解的,但是因为仅仅能用ip这个因子来分配后端,因此ip_hash是有缺陷的,不能在一些情况下使用:
  nginx不是最前端的服务器。
  ip_hash要求nginx一定是最前端的服务器,否则nginx得不到正确ip,就不能根据ip作hash。譬如使用的是squid为最前端,那么nginx取ip时只能得到squid的服务器ip地址,用这个地址来作分流是肯定错乱的。
  nginx的后端还有其它方式的负载均衡。
  假如nginx后端又有其它负载均衡,将请求又通过另外的方式分流了,那么某个客户端的请求肯定不能定位到同一台session应用服务器上。

四、Token机制

1、传统身份认证

  HTTP 是一种没有状态的协议,也就是它并不知道是谁是访问应用。这里我们把用户看成是客户端,客户端使用用户名还有密码通过了身份验证,不过下回这个客户端再发送请求时候,还得再验证一下。
  解决的方法就是,当用户请求登录的时候,如果没有问题,我们在服务端生成一条记录,这个记录里可以说明一下登录的用户是谁,然后把这条记录的 ID 号发送给客户端,客户端收到以后把这个 ID 号存储在 Cookie 里,下次这个用户再向服务端发送请求的时候,可以带着这个 Cookie ,这样服务端会验证一个这个 Cookie 里的信息,看看能不能在服务端这里找到对应的记录,如果可以,说明用户已经通过了身份验证,就把用户请求的数据返回给客户端。
  上面说的就是 Session,我们需要在服务端存储为登录的用户生成的 Session ,这些 Session 可能会存储在内存,磁盘,或者数据库里。我们可能需要在服务端定期的去清理过期的 Session 。
  这种认证中出现的问题是:
  Seesion:每次认证用户发起请求时,服务器需要去创建一个记录来存储信息。当越来越多的用户发请求时,内存的开销也会不断增加。
  可扩展性:在服务端的内存中使用Seesion存储登录信息,伴随而来的是可扩展性问题。
  CORS(跨域资源共享):当我们需要让数据跨多台移动设备上使用时,跨域资源的共享会是一个让人头疼的问题。在使用Ajax抓取另一个域的资源,就可以会出现禁止请求的情况。
  CSRF(跨站请求伪造):用户在访问银行网站时,他们很容易受到跨站请求伪造的攻击,并且能够被利用其访问其他的网站。
  在这些问题中,可扩展性是最突出的。因此我们有必要去寻求一种更有行之有效的方法。

2、Token身份认证

  使用基于 Token 的身份验证方法,在服务端不需要存储用户的登录记录。大概的流程是这样的:
  客户端使用用户名、密码请求登录
  服务端收到请求,去验证用户名、密码
  验证成功后,服务端会签发一个 Token,再把这个 Token 发送给客户端
  客户端收到 Token 以后可以把它存储起来,比如放在 Cookie 里或者 Local Storage 里
  客户端每次向服务端请求资源的时候需要带着服务端签发的 Token
  服务端收到请求,然后去验证客户端请求里面带着的 Token,如果验证成功,就向客户端返回请求的数据
  使用Token验证的优势:
  无状态、可扩展
  在客户端存储的Tokens是无状态的,并且能够被扩展。基于这种无状态和不存储Session信息,负载负载均衡器能够将用户信息从一个服务传到其他服务器上。
安全性。
  请求中发送token而不再是发送cookie能够防止CSRF(跨站请求伪造)。即使在客户端使用cookie存储token,cookie也仅仅是一个存储机制而不是用于认证。不将信息存储在Session中,让我们少了对session操作。

五、JSON Web Token(JWT)机制

  JWT是一种紧凑且自包含的,用于在多方传递JSON对象的技术。传递的数据可以使用数字签名增加其安全行。可以使用HMAC加密算法或RSA公钥/私钥加密方式。
  紧凑:数据小,可以通过URL,POST参数,请求头发送。且数据小代表传输速度快。
  自包含:使用payload数据块记录用户必要且不隐私的数据,可以有效的减少数据库访问次数,提高代码性能。
  JWT一般用于处理用户身份验证或数据信息交换。
  用户身份验证:一旦用户登录,每个后续请求都将包含JWT,允许用户访问该令牌允许的路由,服务和资源。单点登录是当今广泛使用JWT的一项功能,因为它的开销很小,并且能够轻松地跨不同域使用。
  数据信息交换:JWT是一种非常方便的多方传递数据的载体,因为其可以使用数据前面来保证数据的有效性和安全性。

1、JWT数据结构

JWT的数据结构是 : A.B.C。 由字符点‘.’来分隔三部分数据。
A - header 头信息
B - payload (有效荷载?)
C - Signature 签名

1.1 header

数据结构: {“alg”: “加密算法名称”, “typ” : “JWT”}
alg是加密算法定义内容,如:HMAC SHA256 或 RSA
typ是token类型,这里固定为JWT。

1.2 payload

  在payload数据块中一般用于记录实体(通常为用户信息)或其他数据的。主要分为三个部分,分别是:已注册信息(registered claims),公开数据(public claims),私有数据(private claims)。
  payload中常用信息有:iss(发行者),exp(到期时间),sub(主题),aud(受众)等。前面列举的都是已注册信息。
  公开数据部分一般都会在JWT注册表中增加定义。避免和已注册信息冲突。
  公开数据和私有数据可以由程序员任意定义。
  注意:即使JWT有签名加密机制,但是payload内容都是明文记录,除非记录的是加密数据,否则不排除泄露隐私数据的可能。不推荐在payload中记录任何敏感数据。

1.3Signature

  签名信息。这是一个由开发者提供的信息。是服务器验证的传递的数据是否有效安全的标准。在生成JWT最终数据的之前。先使用header中定义的加密算法,将header和payload进行加密,并使用点进行连接。如:加密后的head.加密后的payload。再使用相同的加密算法,对加密后的数据和签名信息进行加密。得到最终结果。

2、JWT执行流程

在这里插入图片描述

第六、七、八章内容点击 单点登录(二) 跳转


以下是书籍完整目录以及教学视频:
完整 书籍以及 教学视频
获取方式:关注公众号【贝西奇谈】 回复【单点登录】
在这里插入图片描述


单点登录目录
一、	Session跨域	
二、	Spring Session共享	
三、	Nginx Session共享	
四、	Token机制	
1	传统身份认证	
2	Token身份认证	
五、	JSON Web Token(JWT)机制	
1	JWT数据结构	
1.1	header	
1.2	payload	
1.3	Signature	
2	JWT执行流程	
六、	基于JWT机制的单点登录	
1	实现	
2	注意	
3	token保存位置	
4	webstorage	
七、	Restful接口设计	
1	Rest简述	
2	Restful简述	
3	Restful特性	
3.1	普通架构	
3.2	Restful架构	
3.3	Restful操作方式	
3.4	响应状态码	
4	SpringMVC使用Restful实例	
八、	接口安全机制	
1	DES加密	
2	AES加密	

教学视频
在这里插入图片描述
在这里插入图片描述
完整 书籍以及 教学视频
获取方式:关注公众号【贝西奇谈】 回复【单点登录】
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

贝西奇谈

你的鼓励将是我创作最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值