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非对称加密