You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将Webssh与Django集成?实现example.com:4433登录访问控制

实现Webssh与Django的登录集成方案

核心思路

把Webssh服务的访问请求先经过Django的登录校验,只有已登录用户才能转发到Webssh服务;或者直接将Webssh作为Django的视图组件,复用Django的登录态机制。

具体实现方式

方式一:Nginx反向代理+Django认证拦截

  1. 调整Nginx配置
    将4433端口的请求先转发到Django的Gunicorn服务,不再直接指向Webssh:
    server {
        listen 4433 ssl;
        server_name example.com;
        # 保留原有SSL相关配置
    
        location / {
            proxy_pass http://127.0.0.1:8000; # 转发到Gunicorn监听端口
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
            # 支持WebSocket转发(Webssh通常依赖)
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "upgrade";
        }
    }
    
  2. 编写Django代理视图
    创建带登录校验的视图,通过请求转发对接本地Webssh服务:
    from django.contrib.auth.decorators import login_required
    from django.http import HttpResponse
    import requests
    
    @login_required
    def webssh_proxy(request):
        # 假设Webssh本地监听127.0.0.1:2222(仅本地访问,不对外暴露)
        webssh_target = "http://127.0.0.1:2222" + request.path
        # 转发请求头与请求体
        forward_headers = {k: v for k, v in request.META.items() if k.startswith('HTTP_')}
        response = requests.request(
            method=request.method,
            url=webssh_target,
            headers=forward_headers,
            data=request.body,
            cookies=request.COOKIES,
            allow_redirects=False
        )
        # 构造返回响应
        django_response = HttpResponse(response.content, status=response.status_code)
        for header_key, header_val in response.headers.items():
            django_response[header_key] = header_val
        return django_response
    
  3. 配置Django路由
    在项目urls.py中添加路由规则:
    from django.urls import path
    from .views import webssh_proxy
    
    urlpatterns = [
        # 原有其他路由
        path('', webssh_proxy),
    ]
    
  4. 修改Webssh监听地址
    将Webssh服务的监听地址改为127.0.0.1:2222,禁止直接对外暴露端口。

方式二:将Webssh嵌入为Django应用

如果使用的是Python生态的Webssh库(比如webssh),可直接集成到Django项目:

  1. 安装依赖
    pip install webssh
    
  2. 配置带认证的Webssh路由
    在项目urls.py中用Django的登录装饰器保护Webssh视图:
    from django.contrib.auth.decorators import login_required
    from django.urls import re_path
    from webssh.views import WebSSHView
    
    # 用login_required强制登录校验
    protected_webssh = login_required(WebSSHView.as_view())
    
    urlpatterns = [
        # 原有其他路由
        re_path(r'^.*$', protected_webssh),
    ]
    
  3. 调整Nginx配置
    将4433端口请求直接转发到Gunicorn,路由会自动匹配到受保护的Webssh视图。

注意事项

  • 确保Django的会话Cookie能在4433端口正常传递,Nginx配置中需保留Cookie相关转发规则。
  • 测试时先验证未登录状态下访问4433端口是否会跳转到Django登录页,再检查登录后Webssh功能是否正常。
  • 若Webssh有自定义的静态资源路径,需在Django中配置静态文件转发或直接复用Webssh的资源处理逻辑。

内容的提问来源于stack exchange,提问作者Thomas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 10:15:40