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

Django实现普通用户与管理员独立认证系统的问题求助

解决普通用户与管理员页面互访问题的方案

一、修复登录逻辑漏洞

现有代码的核心问题是登录环节未严格校验用户身份类型,且跳转逻辑不明确,导致两类用户能随意访问对方页面。

1. 完善普通用户登录视图

确保只有非管理员(is_staff=False)的用户能通过普通登录入口登录:

def userlogin(request):
    error = ""
    if request.method == 'POST':
        u = request.POST['emailid']
        p = request.POST['pwd']
        user = authenticate(username=u, password=p)
        try:
            # 增加身份校验:仅允许非管理员用户登录
            if user and not user.is_staff:
                login(request, user)
                error = "no"
                return redirect('profile')  # 建议使用路由反向解析,如reverse('profile')
            else:
                error = "yes"
        except:
            error = "yes"
    return render(request, 'login.html', locals())

2. 完善管理员登录视图

管理员登录后直接跳转至专属后台页面,避免停留在登录页:

def login_admin(request):
    error = ""
    if request.method == 'POST':
        u = request.POST['uname']
        p = request.POST['pwd']
        user = authenticate(username=u, password=p)
        try:
            if user and user.is_staff:
                login(request, user)
                error = "no"
                return redirect('admin_dashboard')  # 替换为你的管理员首页路由名称
            else:
                error ="yes"
        except:
            error = "yes"
    return render(request,'login_admin.html', locals())

二、给页面添加访问权限拦截

仅靠登录校验不够,需给每个页面加上权限校验,从根源阻止越权访问。

1. 使用Django装饰器限制访问

普通用户页面(如profile视图):

仅允许非管理员用户访问:

from django.contrib.auth.decorators import user_passes_test

# 自定义校验函数:判断是否为普通用户
def is_normal_user(user):
    return user.is_authenticated and not user.is_staff

@user_passes_test(is_normal_user)
def profile(request):
    # 你的普通用户页面逻辑
    return render(request, 'profile.html')

管理员页面:

仅允许管理员(staff)访问,可直接使用Django自带装饰器:

from django.contrib.auth.decorators import staff_member_required

@staff_member_required(login_url='login_admin')  # 未登录时跳转到管理员登录页
def admin_dashboard(request):
    # 你的管理员后台逻辑
    return render(request, 'admin_dashboard.html')

2. 模板中隐藏越权入口(可选)

如果页面中有跳转链接,通过模板标签隐藏不符合权限的入口:

<!-- 普通用户页面仅显示普通用户入口 -->
{% if not user.is_staff %}
    <a href="{% url 'profile' %}">我的主页</a>
{% endif %}

<!-- 管理员页面仅显示管理员入口 -->
{% if user.is_staff %}
    <a href="{% url 'admin_dashboard' %}">管理后台</a>
{% endif %}

三、优化角色一致性(可选)

你的Signup模型包含role字段,可在用户注册时将其与Django用户的is_staff字段绑定,确保角色统一:

# 示例注册视图
def signup(request):
    if request.method == 'POST':
        username = request.POST['username']
        email = request.POST['email']
        password = request.POST['pwd']
        role = request.POST['role']
        
        # 创建Django用户并设置管理员标识
        user = User.objects.create_user(username=username, email=email, password=password)
        user.is_staff = (role == 'admin')
        user.save()
        
        # 创建Signup关联记录
        Signup.objects.create(
            user=user,
            contact=request.POST['contact'],
            branch=request.POST['branch'],
            role=role,
            username=username
        )
        return redirect('userlogin')
    return render(request, 'signup.html')

内容的提问来源于stack exchange,提问作者SAFIQUL ISLAM UZZAL 203-15-144

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 04:50:24