在CentOS7环境中,实现使用openresty配置文件,达到jwt指定用户userid不能访问的效果

#在CentOS7环境中,实现使用openresty配置文件,达到jwt指定用户userid不能访问的效果。

首先,你需要安装 OpenResty 和 JWT 组件:

  1. 安装 OpenResty

参考 OpenResty 的官方安装文档,在终端执行如下命令:

$ sudo yum install yum-utils
$ sudo yum-config-manager --add-repo https://openresty.org/package/centos/openresty.repo
$ sudo yum install openresty
  1. 安装 LuaRocks 和 JWT
$ sudo yum install epel-release -y
$ sudo yum install lua-nginx* -y
$ sudo yum install curl -y
$ sudo yum install wget -y
$ sudo yum localinstall https://luarocks.org/releases/luarocks-3.5.0.tar.gz
$ sudo luarocks install lua-resty-jwt

接下来,你可以在 OpenResty 配置文件中实现需求:

  1. 在 nginx.conf 文件中,添加 http 块:
http {
...
}
  1. http 块中添加以下内容:
# 在 server 块中定义变量
lua_shared_dict jwt_dict 10m;
init_by_lua_block {
  local jwt = require "resty.jwt"
  local jwt_secret = "your-jwt-secret"

  -- 将 jwt 验证结果保存到共享内存中
  function save_jwt_result(jwt_result)
    local dict = ngx.shared.jwt_dict
    local key = ngx.var.http_authorization
    local expires = 60 * 60 -- 设置过期时间为一小时
    if jwt_result.valid then
      dict:set(key, jwt_result.payload, expires)
    else
      dict:set(key, 0, expires)
    end
  end

  -- 验证 jwt
  function validate_jwt()
    local auth_header = ngx.var.http_authorization
    if not auth_header then
      ngx.exit(401)
    end
    local jwt_token = string.match(auth_header, "^Bearer%s+(.+)$")
    if not jwt_token then
      ngx.exit(401)
    end
    local jwt_obj = jwt:verify(jwt_secret, jwt_token)
    save_jwt_result(jwt_obj)
    if not jwt_obj.valid then
      ngx.exit(401)
    end
  end
}

# 定义 server 块
server {
  listen 7000;
  server_name localhost;

  # 声明 location 块,匹配 /api/ 开头的请求
  location ^~ /api/ {
    # 验证 jwt
    access_by_lua_block {
      validate_jwt()
      -- 查询 PostgreSQL 数据库,获取 accountblack 表
      -- 如果用户 userid 被加入了黑名单,返回 403 状态码,否则继续执行
      local pgsql = require("resty.postgres")
      local pg = pgsql:new()
      pg:set_timeout(1000)

      -- 连接 PostgreSQL 数据库
      local ok, err = pg:connect{
          host = "your-postgres-db-host",
          port = 5432,
          database = "your-postgres-db-name",
          user = "your-postgres-db-username",
          password = "your-postgres-db-password"
      }

      if not ok then
          ngx.exit(ngx.HTTP_INTERNAL_SERVER_ERROR)
      end

      -- 查询用户是否在黑名单中
      local account_black_sql = string.format("SELECT accountid FROM accountblack WHERE userid = %s", ngx.var.jwt_payload.sub)
      local account_black_result, err = pg:query(account_black_sql)
      if not account_black_result then
          ngx.log(ngx.ERR, "Failed to query accountblack: ", err)
          ngx.exit(ngx.HTTP_INTERNAL_SERVER_ERROR)
      end

      if account_black_result[1] ~= nil then
          ngx_exit(ngx.HTTP_FORBIDDEN)
      end
    }

    # 转发请求
    proxy_pass http://172.16.01.6:8029/;
  }
}
  1. 其中,save_jwt_result(jwt_result) 函数用于将 jwt 验证结果存储到共享内存中,validate_jwt() 函数用于验证 jwt,access_by_lua_block 即 access 阶段执行的 Lua 代码块。在 access_by_lua_block 中,我们查询 PostgreSQL 数据库,获取 accountblack 表,如果用户 userid 在黑名单中,返回 403 状态码,否则继续执行,并将请求转发到 http://172.16.01.6:8029/

当用户请求 /api/ 接口时,将会首先执行 validate_jwt() 函数,验证 jwt 是否有效。如果 jwt 有效,我们将会查询 PostgreSQL 数据库,检查用户 userid 是否在黑名单表中。如果用户在黑名单中,请求将会被拒绝并返回 403 状态码;否则请求将会被转发到指定地址,并且在转发过程中会自动添加上验证后的 jwt 信息。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值