本文共 1414 字,大约阅读时间需要 4 分钟。
Cloud-Admin项目里的api网关项目是ace-gate,采用的是Spring Cloud Gateway组件,对外提供一个统一的api入口,并实现了api鉴权的功能。
从前端项目的配置里可以看到,所有的api请求首先都转到localhost:8765网关服务器
1、网关配置
转到ace-gate配置文件,几处主要设置包括:
配置网关注册到注册中心,端口8500
consul: enabled: true host: 127.0.0.1 port: 8500 discovery: healthCheckPath: /actuator/health healthCheckInterval: 5s instanceId: ${spring.application.name}:${vcap.application.instance_id:${spring.application.instance_id:${random.value}}} register: true enabled: true
api鉴权属性 id: ace-gate, secret: 123456
auth: serviceId: ace-auth user: token-header: Authorization client: token-header: x-client-token id: ace-gate #不填则默认读取spring.application.name secret: 123456
redis和rabbitmq设置
redis: database: 2 host: 127.0.0.1 jedis: pool: max-active: 20 rabbitmq: host: ${RABBIT_MQ_HOST:localhost} port: ${RABBIT_MQ_PORT:5672} username: guest password: guest
2、拦截器
网关的核心逻辑是在AccessGatewayFilter,它继承GlobalFilter接口并实现filter方法,
filter方法核心只做了3件事:
1从request请求拿到访客的user信息 2判断用户是否有权限访问api 3给合法的请求生成一个新的token
这个地方,前端用户会传来一个用户的token,后端api鉴权也需要检查客户端的token,很容易让人误解它们是同一个token,但其实它们不是同一个值,虽然它们都是存放在head的Authorization属性
用户的token仅做身份认证,api的token由网关负责管理,不对外暴露
3、auth认证
翻看认证源码发现,Cloud-Admin没有用第三方组件,自己手动实现了一个基于非对称RSA加密的鉴权模块,
声明AuthServerRunner继承CommandLineRunner接口,
在鉴权服务器启动时,生成鉴权所需的公钥和私钥,并缓存在redis里,
然后用公钥加密,私钥解密
更底层调用JDK的KeyPairGenerator实现RSA非对称加密
转载地址:http://ythwi.baihongyu.com/