Docker部署 apisix 并使用golang插件(自定义鉴权方式)

文章目录

  • apisix 使用golang插件(自定义鉴权方式)
    • 1. 安装apisix
      • 1.1 下载部署文件(example目录)
      • 1.2 保存example目录,修改docker-compose.yaml
    • 2. 自定义golang插件
      • 2.1 下载插件
      • 2.2 修改插件
      • 2.3 编译插件(需要golang环境)
    • 3 使用golang自定义插件
      • 3.1 修改apisix配置文件
      • 3.2 修改apisix的启动文件(docker-compose.yml)
      • 3.3 重启程序
      • 3.4 创建路由,并指定插件
    • 4 结果测试

apisix 使用golang插件(自定义鉴权方式)

1. 安装apisix

1.1 下载部署文件(example目录)

github
百度网盘 提取码: keap

1.2 保存example目录,修改docker-compose.yaml

# 1.修改镜像版本
# 2.启动apisix
# 3.默认账号密码: admin/admin

调整镜像alpine为centos(后续使用插件需要)



Docker部署 apisix 并使用golang插件(自定义鉴权方式)_第1张图片

2. 自定义golang插件

2.1 下载插件

github
百度网盘 提取码: vgnr

Docker部署 apisix 并使用golang插件(自定义鉴权方式)_第2张图片

2.2 修改插件

首先进入目录,按照模板增加插件功能(增加自定义逻辑)
增加认证文件
vim cmd/go-runner/plugins/auth.go


package plugins

import (
	"encoding/json"
	"net/http"

	pkgHTTP "github.com/apache/apisix-go-plugin-runner/pkg/http"
	"github.com/apache/apisix-go-plugin-runner/pkg/log"
	"github.com/apache/apisix-go-plugin-runner/pkg/plugin"
)

func init() {
	err := plugin.RegisterPlugin(&Auth{})
	if err != nil {
		log.Fatalf("failed to register plugin say: %s", err)
	}
}

// Auth is a demo to show how to return data directly instead of proxying
// it to the upstream.
type Auth struct {
}

type AuthConf struct {
	Body string `json:"body"`
}

// 此处必须实现三个方法Name,ParseConf,Filter
// 主要逻辑在Filter中

func (p *Auth) Name() string {
	return "auth"
}

func (p *Auth) ParseConf(in []byte) (interface{}, error) {
	conf := AuthConf{}
	err := json.Unmarshal(in, &conf)
	return conf, err
}

func (p *Auth) Filter(conf interface{}, w http.ResponseWriter, r pkgHTTP.Request) {
	// 如果认证通过(不对请求做拦截,直接转发服务),直接return即可,不要操作response对象
	// 如果未通过,则可以在response增加http状态码,返回body等拦截返回

	// 根据访问path做限制
	// 1. 如果path等于/login表示原封不动转发到其他服务
	if string(r.Path()) == "/login" {
		// 直接return即可转发到路由配置的upstream中
		return

		// 如果path等于/auth则表示当前接口需要认证
	} else if string(r.Path()) == "/auth" {
		// 通过http调用内部认证,成功则正常返回,认证失败则返回异常信息,此处示例为认证失败
		httpResponseCode := 409
		if httpResponseCode == 200 {
			// 如果认证接口返回200则认证通过,直接return转发接口
			return

			// 如果调用认证接口失败,则返回认证失败
		} else {
			// 不通过则构建响应对象,返回给前端
			body := `"code":"409","desc":"auth err"`
			// 自定义Header
			w.Header().Add("X-Resp-A6-Runner", "Go")
			w.Header().Add("Content-Type", "application/json")
			w.WriteHeader(409)
			_, err := w.Write([]byte(body))
			if err != nil {
				log.Errorf("failed to write: %s", err)
			}
			return
		}
	}
	// 其他接口则将path拦截,原封不动返回
	w.Header().Add("X-Resp-A6-Runner", "Go")
	_, err := w.Write(r.Path())
	if err != nil {
		log.Errorf("failed to write: %s", err)
	}
	return
}


2.3 编译插件(需要golang环境)

make build
Docker部署 apisix 并使用golang插件(自定义鉴权方式)_第3张图片

3 使用golang自定义插件

3.1 修改apisix配置文件

进入example目录,修改配置文件,增加启动插件命令
cd example
vim apisix_conf/config.yaml

ext-plugin:
  cmd: ["/usr/local/apisix/apisix-go-plugin-runner/go-runner", "run"]

Docker部署 apisix 并使用golang插件(自定义鉴权方式)_第4张图片

3.2 修改apisix的启动文件(docker-compose.yml)

  1. 增加挂载目录,将的目录映射到apisix中(此处可以只挂在go-runner,我为了方便调试,直接挂载映射整个目录)
  2. 设置apisix运行runner的环境变量配置
    vim docker-compose.yml
# 此处可以直接替换整个apisix配置
  apisix:
    image: apache/apisix:2.12.1-centos
    restart: always
    environment:
      - APISIX_LISTEN_ADDRESS=unix:/tmp/runner.sock
      - APISIX_CONF_EXPIRE_TIME=3600
    volumes:
      - ./apisix-go-plugin-runner:/usr/local/apisix/apisix-go-plugin-runner
      - ./apisix_log:/usr/local/apisix/logs
      - ./apisix_conf/config.yaml:/usr/local/apisix/conf/config.yaml:ro
    depends_on:
      - etcd
    ##network_mode: host
    ports:
      - "9080:9080/tcp"
      - "9091:9091/tcp"
      - "9443:9443/tcp"
      - "9092:9092/tcp"
    networks:
      apisix:

Docker部署 apisix 并使用golang插件(自定义鉴权方式)_第5张图片

3.3 重启程序

docker-compose restart
Docker部署 apisix 并使用golang插件(自定义鉴权方式)_第6张图片

3.4 创建路由,并指定插件

  • 可以通过本地curl直接创建,也可以通过页面创建(body内容可以根据情况,自定义一些安全信息认证等功能)

curl创建

curl http://172.17.0.1:9080/apisix/admin/routes/1 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
{
  "uri": "/*",
  "name": "auth",
  "plugins": {
    "ext-plugin-pre-req": {
       "conf": [
         {"name":"auth", "value":"{\"body\":\"hello\"}"}
       ]
    } 
  },
  "upstream": {
         "type": "roundrobin",
         "nodes": {
             "www.baidu.com": 1
         }
     }
}
'

页面创建

Docker部署 apisix 并使用golang插件(自定义鉴权方式)_第7张图片

Docker部署 apisix 并使用golang插件(自定义鉴权方式)_第8张图片

Docker部署 apisix 并使用golang插件(自定义鉴权方式)_第9张图片

Docker部署 apisix 并使用golang插件(自定义鉴权方式)_第10张图片

最后点击下一步提交即可

  • 登录dashborad查看结果

Docker部署 apisix 并使用golang插件(自定义鉴权方式)_第11张图片

4 结果测试

Docker部署 apisix 并使用golang插件(自定义鉴权方式)_第12张图片
Docker部署 apisix 并使用golang插件(自定义鉴权方式)_第13张图片
Docker部署 apisix 并使用golang插件(自定义鉴权方式)_第14张图片

你可能感兴趣的:(apisix,docker,插件,apisix-golang插件)