很久没写更新内容了,新的一年也开始了,是时候该把自己的东西整理一遍了。2018年也没少看书,但是真正属于自己的东西很少很少,或者学习的时候浅尝辄止,也是时候给自己清醒清醒了。
公司自己的项目是基于Spring Boot敏捷开发的,起初对于接口的鉴权等认证操作都很粗糙,网上也搜集了一下其他资料,总的来说。比较详细的鉴权的两种方式如下:
其一是认证与鉴权,对于请求的用户身份的授权以及合法性鉴权;其二是API级别的操作权限控制,这个在第一点之后,当鉴定完用户身份合法之后,对于该用户的某个具体请求是否具有该操作执行权限进行校验。
认证与鉴权
对于第一个需求,笔者调查了一些实现方案:
-
分布式
Session
方案
分布式会话方案原理主要是将关于用户认证的信息存储在共享存储中,且通常由用户会话作为 key 来实现的简单分布式哈希映射。当用户访问微服务时,用户数据可以从共享存储中获取。在某些场景下,这种方案很不错,用户登录状态是不透明的。同时也是一个高可用且可扩展的解决方案。这种方案的缺点在于共享存储需要一定保护机制,因此需要通过安全链接来访问,这时解决方案的实现就通常具有相当高的复杂性了。 -
基于
OAuth2 Token
方案
随着 Restful API、微服务的兴起,基于Token
的认证现在已经越来越普遍。Token和Session ID 不同,并非只是一个 key。Token 一般会包含用户的相关信息,通过验证 Token 就可以完成身份校验。用户输入登录信息,发送到身份认证服务进行认证。AuthorizationServer验证登录信息是否正确,返回用户基础信息、权限范围、有效时间等信息,客户端存储接口。用户将 Token 放在 HTTP 请求头中,发起相关 API 调用。被调用的微服务,验证Token
。ResourceServer返回相关资源和数据。
这边选用了第二种方案,基于OAuth2 Token
认证的好处如下:
- 服务端无状态:Token 机制在服务端不需要存储 session 信息,因为 Token 自身包含了所有用户的相关信息。
- 性能较好,因为在验证 Token 时不用再去访问数据库或者远程服务进行权限校验,自然可以提升不少性能。
- 现在很多应用都是同时面向移动端和web端,
OAuth2 Token
机制可以支持移动设备。 - OAuth2与Spring Security结合使用,有提供很多开箱即用的