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

