nginx auth_request:认证成功后如何添加GET参数
实现方法
要实现认证后将用户组作为GET参数传递给Flask应用,需要分两步调整:修改Django认证接口返回用户组信息,再配置Nginx捕获该信息并拼接请求参数。
1. 修改Django认证接口,返回用户组响应头
在Django的/portal/auth视图中,认证成功后添加一个自定义响应头(比如X-User-Groups),将用户所属组以逗号分隔的字符串返回:
from django.http import HttpResponse from django.contrib.auth.decorators import login_required @login_required def portal_auth(request): # 获取当前用户的所有组,转换为逗号分隔的字符串 user_groups = ','.join(group.name for group in request.user.groups.all()) response = HttpResponse(status=200) # 添加自定义响应头传递用户组信息 response['X-User-Groups'] = user_groups return response
认证失败时保持返回401/403状态码,Nginx会自动拦截未通过认证的请求。
2. 配置Nginx捕获用户组并拼接请求参数
修改Nginx配置,使用auth_request_set指令捕获Django返回的用户组头,再将其作为GET参数添加到proxy_pass的请求中:
location /portal/heatmap/ { auth_request /auth; # 从/auth接口的响应头中读取用户组,存入变量$user_groups auth_request_set $user_groups $upstream_http_x_user_groups; # 拼接请求参数:保留原请求的URI和参数,再追加user_groups参数 # ${request_uri\?&} 用于判断原请求是否已有参数,自动选择?或&拼接 proxy_pass http://127.0.0.1:8080$request_uri${request_uri\?&}user_groups=$user_groups; } location /auth { internal; proxy_pass http://127.0.0.1:8000/portal/auth; # 传递原请求的必要头信息给Django(比如Cookie用于认证) proxy_pass_request_body off; proxy_set_header Content-Length ""; proxy_set_header X-Original-URI $request_uri; }
关键说明
auth_request_set:该指令用于捕获上游(Django)响应的头信息,$upstream_http_x_user_groups是Nginx内置变量,对应上游返回的X-User-Groups头(Nginx会自动将头名转为小写,横杠替换为下划线)。- 参数拼接逻辑:
$request_uri保留原请求的路径和已有GET参数,${request_uri\?&}是条件判断语法——如果原URI包含?则用&拼接新参数,否则用?,避免出现??或多余的&。 - 特殊字符处理:如果用户组名称包含空格、
&、=等特殊字符,需要在Django视图中对组名做URL编码,或者在Nginx中使用$escape_uri($user_groups)替代$user_groups,防止参数解析错误。 - 版本要求:
auth_request_set指令需要Nginx 1.11.3及以上版本,若版本过低需先升级Nginx。
内容的提问来源于stack exchange,提问作者geckels1
相关产品推荐
相关产品推荐

