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

如何在Django中分离普通用户与管理员的登录会话?

解决普通用户访问管理员后台的权限问题

问题原因

当前管理员面板的登录视图(Login_Page)仅检查用户是否登录,未验证用户是否具备商家身份;同时管理员仪表盘视图(Dashboard_Page)无权限校验逻辑,导致已登录的普通用户可直接进入管理员后台。

解决方案

1. 修改管理员登录视图的已登录跳转逻辑

在panel应用的Login_Page视图中,当用户已登录时,先验证其是否为商家身份,非商家用户直接跳转首页并提示无权限:

def Login_Page(request):
    if request.user.is_authenticated:
        # 验证当前登录用户是否为商家
        try:
            User_login.objects.get(user_auth=request.user, is_vendor_user='y', is_customer_user='n')
            return redirect('dashboard')
        except User_login.DoesNotExist:
            messages.error(request, '你没有访问管理员面板的权限')
            return redirect('home')
    # 以下保留原POST请求处理逻辑
    if request.method == "POST":
        username = request.POST.get('username')
        password = request.POST.get('password')
        try:
            user = User.objects.get(username = username)
        except:
            messages.error(request,'用户不存在!')
        try:
            vendor_authe = User_login.objects.get(user_auth=user, is_vendor_user='y',is_customer_user='n')
            user = authenticate(request, username= username, password = password)
            if user is not None:
                login(request, user)
                return redirect('dashboard')
            else:
                messages.error(request,'用户名或密码错误!')
        except:
            messages.error(request,'用户未找到!')
       
    else:
        pass
    context = {

    }
    return render(request,'panel/login.html',context)

2. 给管理员仪表盘视图添加权限校验

在panel应用的Dashboard_Page视图中,先验证用户登录状态和商家身份,不符合条件则跳转首页:

def Dashboard_Page(request):
    # 验证用户是否登录
    if not request.user.is_authenticated:
        return redirect('login_page')
    # 验证用户是否为商家
    try:
        User_login.objects.get(user_auth=request.user, is_vendor_user='y', is_customer_user='n')
    except User_login.DoesNotExist:
        messages.error(request, '你没有访问此页面的权限')
        return redirect('home')
    # 以下保留原仪表盘业务逻辑
    # ...
    context = {
        # 原上下文内容
    }
    return render(request, 'panel/dashboard.html', context)

3. (可选)封装权限验证装饰器复用逻辑

如果管理员面板有多个需要权限校验的视图,可封装装饰器避免重复代码:

# 在panel应用的views.py中添加装饰器
from django.contrib import messages
from django.shortcuts import redirect

def vendor_required(view_func):
    def wrapper(request, *args, **kwargs):
        if not request.user.is_authenticated:
            return redirect('login_page')
        try:
            User_login.objects.get(user_auth=request.user, is_vendor_user='y', is_customer_user='n')
            return view_func(request, *args, **kwargs)
        except User_login.DoesNotExist:
            messages.error(request, '你没有访问此页面的权限')
            return redirect('home')
    return wrapper

给所有管理员视图添加装饰器:

@vendor_required
def Dashboard_Page(request):
    # 视图逻辑
    # ...

@vendor_required
def Add_Product(request):
    # 添加商品视图逻辑
    # ...

效果说明

修改后,普通用户登录后访问管理员URL时:

  • 访问panel/login/会被直接跳转至首页并提示无权限
  • 直接访问panel/dashbord/也会被跳转至首页并提示无权限
    只有具备商家身份的用户才能正常访问管理员后台。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 00:43:15