nginx可通过location+if、map指令、auth_request模块或jwt解析模块实现基于资源的acl:将资源映射为路径/头/参数等,再结合ip、用户、权限标签或外部鉴权服务动态控制访问。

Nginx 本身不提供原生的“基于资源的 ACL”(如 RBAC 或细粒度资源策略),但可以通过组合 location 匹配、变量、map 指令、auth_request 模块或第三方模块,实现等效的资源级访问控制。关键在于:把“资源”映射为可识别的路径、请求头、参数或用户属性,并据此动态拒绝或放行。
用 location + if + allow/deny 控制静态资源路径
适用于按 URL 路径区分资源(如 /api/v1/users/ 只允许管理员,/public/ 全放行):
- 在 server 或 location 块中使用 allow/deny,配合 if 判断 $remote_user 或自定义变量
- 注意:
if在 location 外部不推荐嵌套,且deny all应放在最后作为兜底 - 示例:限制 /admin/ 下所有资源仅允许特定 IP 段和已认证用户
auth_basic "Admin Area";
auth_basic_user_file /etc/nginx/.htpasswd;
if ($remote_addr !~ ^(192\.168\.10\.|10\.0\.0\.) ) { return 403; }
# 允许内网 IP + 认证用户
}
用 map 构建资源-权限映射关系
适合将资源路径与所需权限标签关联(如 /reports/ → "read:report"),再交由后端或 auth_request 校验:
- 在 http 块中定义 map,将请求路径映射为权限标识或角色要求
- 例如:
map $uri $required_permission { /api/v1/orders/ "write:order"; /api/v1/orders/{id} "read:order"; ... } - 把
$required_permission通过proxy_set_header透传给上游服务,由应用层做最终鉴权
用 auth_request 实现动态资源级校验
这是最灵活的方式:Nginx 将请求转发到一个内部鉴权服务(如轻量 API),由它根据 URI、method、user、token 等判断是否允许访问该资源:
- 配置一个内部 location(如
location = /_auth)指向你的鉴权服务 - 在目标 resource location 中添加
auth_request /_auth; - 鉴权服务返回 200 表示允许,401/403 表示拒绝;还可通过
auth_request_set提取响应头用于后续逻辑 - 示例:对
/files/<uuid></uuid>请求,鉴权服务查数据库确认当前用户是否有该文件的 read 权限
结合 JWT 或 API Token 解析用户权限
若客户端携带 JWT(如 Authorization: Bearer xxx),可用 nginx-jwt(OpenResty)或 ngx_http_auth_jwt_module(商业版/部分发行版)解析 token 并提取 scope/roles:
- 验证签名后,将
jwt_claim_scope或jwt_claim_roles存入变量 - 再用
if或map关联资源路径与所需 scope,例如:if ($jwt_claim_scope !~ "read:config") { return 403; } - 注意:纯开源 Nginx 不支持 JWT 解析,需 OpenResty 或反向代理到鉴权中间件











