在Django Web应用中实现需权限与手动激活的外网访问方案咨询
问题:基于Django实现带权限验证的外网访问开关功能
背景
我使用Django已有一年时间,搭建了一个可部署在VPC或远程服务器上的Web应用。当前VPN采用全隧道模式而非拆分隧道,用户必须使用VPC提供的网络与DNS。该Web应用已实现登录、认证、基于django-redis的会话管理、文件传输、类iMessage的聊天及私信功能,且所有功能的权限均已在后台配置完成。
核心需求
- 用户需具备外网(http/https)访问权限;
- 即便用户拥有权限,也需点击“Internet”按钮后才能激活外网访问。
已尝试的实现方案
方案1:Django直接调用iptables修改防火墙规则
最初尝试通过Django视图获取用户IP,添加iptables规则放行流量,代码如下:
@login_required @permission_required('accounts.proxy_access', raise_exception=True) def proxy(request): try: # 获取请求的远程IP地址 remote_ip = request.META['REMOTE_ADDR'] # 添加iptables规则允许该IP的流量 subprocess.run(['iptables', '-A', 'OUTPUT', '-d', remote_ip, '-j', 'ACCEPT']) messages.success(request, 'Proxy connected. You may now open a new tab and browse the web normally.') except: messages.error(request, 'Proxy failed. Please contact your administrator.') return redirect('home')
问题:不认可应用直接修改iptables或防火墙配置的思路,且对流量路由至外网的逻辑存疑。
方案2:结合Traefik ForwardAuth实现权限校验
计划用Traefik的ForwardAuth功能将认证请求转发至Django端点,通过记录用户是否点击激活按钮来控制访问,代码如下:
from django.contrib.auth.decorators import login_required from django.shortcuts import render, redirect from django.http import JsonResponse from .models import InternetAccess from .forms import InternetAccessForm @login_required def internet_access_view(request): user_access, created = InternetAccess.objects.get_or_create(user=request.user) if request.method == 'POST': form = InternetAccessForm(request.POST) if form.is_valid() and user_access.has_permission: user_access.has_clicked_button = form.cleaned_data['access_internet'] user_access.save() return redirect('some-success-url') else: form = InternetAccessForm() return render(request, 'internet_access.html', {'form': form}) def forward_auth_view(request): # 从请求中提取用户信息(如token或会话ID) user = get_user_from_request(request) if user: user_access, created = InternetAccess.objects.get_or_create(user=user) if user_access.has_permission and user_access.has_clicked_button: return JsonResponse({'auth': 'success'}) return JsonResponse({'auth': 'failure'}, status=403)
疑问:不确定该方案是否更优,本质上仍是应用间接控制反向代理配置。
求助
恳请专业人士提供实现该功能的合理思路与建议。
内容的提问来源于stack exchange,提问作者PawsBrake
相关产品推荐
相关产品推荐

