搭建微服务授权中心
搭建微服务授权中心
微服务网关整合 OAuth2.0 设计思路
网关整合 OAuth2.0 有两种思路,一种是授权服务器生成令牌, 所有请求统一在网关层验证,判断权限等操作;另一种是由各资源服务处理,网关只做请求转发。 比较常用的是第一种,把API网关作为OAuth2.0的资源服务器角色,实现接入客户端权限拦截、令牌解析并转发当前登录用户信息给微服务,这样下游微服务就不需要关心令牌格式解析以及OAuth2.0相关机制了。
网关在认证授权体系里主要负责两件事:
(1)作为OAuth2.0的资源服务器角色,实现接入方访问权限拦截。 (2)令牌解析并转发当前登录用户信息(明文token)给微服务
微服务拿到明文token(明文token中包含登录用户的身份和权限信息)后也需要做两件事:
(1)用户授权拦截(看当前用户是否有权访问该资源) (2)将用户信息存储进当前线程上下文(有利于后续业务逻辑随时获取当前用户信息)
搭建
- 引入依赖
- 开启注解 @Enable
- cofigure 方法中设置
JWT 实现微服务间 token 增强
Spring Security OAuth2 引入 JWT 对 token 进行增强
校验 token → checkToken 接口 获取公钥 → tokenKey 接口
再优化:非对称加密 (公钥、私钥) 验证时只需要公钥即可。
Token 增强器 TokenEnhancer 可以携带用户id 等信息
GlobalFilter 全局过滤器, InitialBean 去拿公钥 通过微服务 url 去调用认证中心获取 TokenKey
RibbonConfig 设置负载均衡器,调用初始化 Token 方法期间就调用 restful接口 如果要提前调用,就需要自己实现拦截器。【Bean 初始化期间,就拿到 TokenKey】
@Ribbon 注解是 Bean 初始化完成后,才调用。
- 过滤掉不需要认证的 url:比如 sso、oauth 认证、等不需要登录也可用的
- 获取 Token
- 校验 Token
- 校验通过后,从 Token 中获取用户信息存入请求头中
将 Token 存入 Redis,12 小时过期
关键:搭建授权中心 Spring Security OAuth2 + JWT 密码形式