1 docker-compose 配置服务添加ForwardAuth
traefik 同样可以用来做网关鉴权。它的原理是将请求路由之前,先调用鉴权接口进行鉴权。 若鉴权不通过,直接返回失败。若请求成功,则将请求进行路由。
ForwardAuth 是一个中间件。我们修改服务的docker-compose 如下。
app2:container_name: app2image: app2:v1ports:# The Web UI (enabled by --api.insecure=true)- "10186:3000"expose:- "10186"networks:- mynetlabels:# 声明一个中间件,名称为app2-forwardauth,地址为http://cyqg45.natappfree.cc/auth(这是我本地的一个映射地址,方便调试)- "traefik.http.middlewares.app2-forwardauth.forwardauth.address=http://cyqg45.natappfree.cc/auth"# 声明router 路由转发规则为路径前缀匹配/app2- "traefik.http.routers.app2.rule=PathPrefix(`/app2`)"# 将 中间件添加到路由, 若多个中间件, 使用 "," 隔开, @docker的意思是从docker 中获取配置。- "traefik.http.routers.app2.middlewares=app2-forwardauth@docker"
这样就配置好了。
重新启动app2。 登录 traefik后台 ,可以看到中间件已经配置上了,并且状态是正常。
ForwardAuth 的文档中说明,当鉴权的响应码是2xx 才算成功,其他都是失败。下面对比测试
2 auth 接口编写
3 测试
3.1 测试请求通过
请求app2 的接口, 可以看到接口正确返回
后台打印了auth 说明请求经过了auth接口
3.1 测试请求拒绝
首先修改auth函数, 修改HTTP 响应码为401。
再次请求
响应401 鉴权失败。注意这个code 是Http请求的响应码如果为2xx 说明鉴权通过,否则鉴权失败。所以鉴权服务只需要做一件事就好了。 根据请求头用户的token 来判断用户是否合法即可。 不合法则返回一个非2xx的Code 即可。 关于code说明如下
https://doc.traefik.io/traefik/middlewares/http/forwardauth/
