搭建微服务授权中心

Siona

搭建微服务授权中心

微服务网关整合 OAuth2.0 设计思路

网关整合 OAuth2.0 有两种思路,一种是授权服务器生成令牌, 所有请求统一在网关层验证,判断权限等操作;另一种是由各资源服务处理,网关只做请求转发。 比较常用的是第一种,把API网关作为OAuth2.0的资源服务器角色,实现接入客户端权限拦截、令牌解析并转发当前登录用户信息给微服务,这样下游微服务就不需要关心令牌格式解析以及OAuth2.0相关机制了。

网关在认证授权体系里主要负责两件事:

(1)作为OAuth2.0的资源服务器角色,实现接入方访问权限拦截。 (2)令牌解析并转发当前登录用户信息(明文token)给微服务

微服务拿到明文token(明文token中包含登录用户的身份和权限信息)后也需要做两件事:

(1)用户授权拦截(看当前用户是否有权访问该资源) (2)将用户信息存储进当前线程上下文(有利于后续业务逻辑随时获取当前用户信息)

搭建

  1. 引入依赖
  2. 开启注解 @Enable
  3. cofigure 方法中设置

JWT 实现微服务间 token 增强

Spring Security OAuth2 引入 JWT 对 token 进行增强

jwt 在线测试open in new window

校验 token → checkToken 接口 获取公钥 → tokenKey 接口

再优化:非对称加密 (公钥、私钥) 验证时只需要公钥即可。

Token 增强器 TokenEnhancer 可以携带用户id 等信息

GlobalFilter 全局过滤器, InitialBean 去拿公钥 通过微服务 url 去调用认证中心获取 TokenKey

RibbonConfig 设置负载均衡器,调用初始化 Token 方法期间就调用 restful接口 如果要提前调用,就需要自己实现拦截器。【Bean 初始化期间,就拿到 TokenKey】

@Ribbon 注解是 Bean 初始化完成后,才调用。

  1. 过滤掉不需要认证的 url:比如 sso、oauth 认证、等不需要登录也可用的
  2. 获取 Token
  3. 校验 Token
  4. 校验通过后,从 Token 中获取用户信息存入请求头中

将 Token 存入 Redis,12 小时过期

关键:搭建授权中心 Spring Security OAuth2 + JWT 密码形式

Last Updated 8/18/2024, 10:22:42 AM