如何在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
相关产品推荐
相关产品推荐

