SpringCloud进阶-基于JWT的微服务鉴权方案
在选型时调研了oauth2、oauth、JWT、shiro。
oauth
oauth2
OAuth2中包含四个角色:
· 资源拥有者(Resource Owner)
· 资源服务器(Resource Server)
· 授权服务器(Authorization Server)
· 客户端(Client)
OAuth2包含4种授权模式
· 授权码(认证码)模式 (Authorization code)
· 简化(隐形)模式 (Impilict
· 用户名密码模式 (Resource Owner Password Credential)
· 客户端模式 (Client Credential)
其中,OAuth2的运行流程如下图,摘自RFC 6749:
shiro
Shiro不会去维护用户、维护权限,这些需要我们自己去设计/提供,然后通过相应的接口注入给Shiro
在概念层,Shiro 架构包含三个主要的理念:Subject,SecurityManager和 Realm。下面的图展示了这些组件如何相互作用。
jwt
最终选用了JWT这种轻量级的协议,
优点是无状态,不需要频繁访问鉴权中心,造成过多短链,浪费资源,
缺点是token一旦派发无法收回,只能等待过期。
具体实现逻辑如下
拦截位置
1.可以通过filter与inteceptor进行拦截,缺点是每次请求都需要阻塞判断。
2.通过zuul网关统一鉴权,缺点穿透网管后,服务非安全。
3.通过feign inteceptor统一鉴权
用户填入用户名密码后,与数据库里存储的用户信息进行比对,如果通过,则认证成功。传统的方法是在认证通过后,创建sesstion,并给客户端返回cookie。现在我们采用JWT来处理用户名密码的认证。区别在于,认证通过后,服务器生成一个token,将token返回给客户端,客户端以后的所有请求都需要在http头中指定该token。服务器接收的请求后,会对token的合法性进行验证。验证的内容包括:
内容是一个正确的JWT格式
检查签名
检查claims
检查权限
可以