1 docker-compose 配置服务添加ForwardAuth

traefik 同样可以用来做网关鉴权。它的原理是将请求路由之前,先调用鉴权接口进行鉴权。 若鉴权不通过,直接返回失败。若请求成功,则将请求进行路由。
ForwardAuth 是一个中间件。我们修改服务的docker-compose 如下。

  1. app2:
  2. container_name: app2
  3. image: app2:v1
  4. ports:
  5. # The Web UI (enabled by --api.insecure=true)
  6. - "10186:3000"
  7. expose:
  8. - "10186"
  9. networks:
  10. - mynet
  11. labels:
  12. # 声明一个中间件,名称为app2-forwardauth,地址为http://cyqg45.natappfree.cc/auth(这是我本地的一个映射地址,方便调试)
  13. - "traefik.http.middlewares.app2-forwardauth.forwardauth.address=http://cyqg45.natappfree.cc/auth"
  14. # 声明router 路由转发规则为路径前缀匹配/app2
  15. - "traefik.http.routers.app2.rule=PathPrefix(`/app2`)"
  16. # 将 中间件添加到路由, 若多个中间件, 使用 "," 隔开, @docker的意思是从docker 中获取配置。
  17. - "traefik.http.routers.app2.middlewares=app2-forwardauth@docker"

这样就配置好了。
重新启动app2。 登录 traefik后台 ,可以看到中间件已经配置上了,并且状态是正常。
image.png

ForwardAuth 的文档中说明,当鉴权的响应码是2xx 才算成功,其他都是失败。下面对比测试

2 auth 接口编写

image.png

3 测试

3.1 测试请求通过

请求app2 的接口, 可以看到接口正确返回
image.png
后台打印了auth 说明请求经过了auth接口
image.png

3.1 测试请求拒绝

首先修改auth函数, 修改HTTP 响应码为401。
image.png
再次请求
image.png
响应401 鉴权失败。注意这个code 是Http请求的响应码如果为2xx 说明鉴权通过,否则鉴权失败。所以鉴权服务只需要做一件事就好了。 根据请求头用户的token 来判断用户是否合法即可。 不合法则返回一个非2xx的Code 即可。 关于code说明如下
https://doc.traefik.io/traefik/middlewares/http/forwardauth/
image.png