本文主要讲的是常用的登陆认证机制。随手的笔记,可以快速了解这几种认证方式的原理。
1、HTTP Basic Auth
HTTP Basic Auth ,简单的来说就是每次请求API的时候,都提供用户的username和password。
用这种方式可以不用登陆,随时请求后台任何一个方法。但如何知道用户是否拥有权限的?可以在每次请求任何一个方法时候,都携带用户名和密码,然后后台每次都对用户名和密码进行校验,并且对角色进行校验,之后再选择是否放行。这就意味着每次都要做校验。
缺点:容易泄密。只适用于内部使用。
2、Cookie Auth(也叫Session认证)
登陆请求,当服务端校验通过之后,服务端会创建一个独立的Session来保存用户信息,以作为登陆成功的标记。每一个用户创建一个Session对象。服务端存储完session数据之后,那浏览器是如何知道该用户登陆过?
首先服务端会将Session对象的id放入Cookie的对象里,Cookie对象是键值对 key=value,对应的键是名字,值是id,然后通过响应头写回给浏览器,浏览器会将响应头信息自动存放到浏览器的缓存里。
用户登陆成功后,若想访问服务器端的其他需要权限的页面时,该请求必须要携带浏览器之前存储的session id ,也是通过请求头的方式,session id到服务端后会搜索是否有该session id 所对应的对象,有就能拿到,说明用户还处于登陆状态。
spring-security的流程其实也是一套对上述流程的封装,再到后来的整合CAS,依然还是此方式。
在分布式系统中,整合CAS的原因:
session认证的缺陷:利用服务器的内存资源来存储session,而一台服务器的内存是不可以共享的,所以如果要多台服务器之间共享session,所以就有了CAS整合。其实这就是session共享的方案。
3、OAuth
OAuth(开放授权)是一个开放的授权标准,允许用户让第三方应用访问该用户在某一个web服务器上的私密资源,而无需将用户名和密码提供给第三方应用。
Auth 允许用户提供一个令牌,而不是用户名和密码来访问它们存放在特定服务器提供者的数据。每一个令牌授权一个特定的第三方系统,在特定的时间段内访问特定的资源。
4、Token Auth
使用基于Token的身份验证,在服务端不需要存储用户登陆信息。
流程:
1、客户端使用用户名和密码请求登陆
2、服务端收到请求,去验证用户名和密码
3、验证完后,服务端会签发一个Token(包含用户信息的一个字符串),再把这个Token发送给客户端
4、客户端收到Token后存储起来,比如存储到Cookie又或者本地
5、客户端每次向服务端请求资源时,需要携带服务端签发的Token
6、服务端收到请求,然后去验证客户端请求里带着的Token(使用算法验证),验证成功,就返回数据给客户端。
其他服务器只要是使用同一套算法,就可以做信息的校验,就不需要做所谓的session共享。
Token Auth 的优点
Token 机制相对于 Cookie 机制又有什么好处呢?
支持跨域访问: Cookie 是不允许垮域访问的,这一点对 Token 机制是不存在的,
前提是传输的用户认证信息通过 HTTP 头传输.