跳到主要内容

Django 权限管理实战:基于角色的菜单与访问控制

在上一节中,我们已经完成了系统的基础功能开发。但如果你现在切换不同账号登录,会发现一个明显的问题:

所有用户几乎都可以访问所有 URL。

这显然是不合理的。

在本节中,我们将为项目引入真正可用的权限管理机制,实现以下两个目标:

  • 🧭 不同角色,显示不同菜单
  • 🔒 不同角色,只能访问被允许的 URL

我们将充分利用 Django 自带的权限机制,在尽量少写判断代码的前提下,实现一套清晰、可维护的权限体系。

1.权限需求分析​

在开始编码之前,我们先明确规则。

1️⃣ 系统中的角色​

当前系统中一共有三类用户角色:

| 角色 | 说明 | | - | | | admin | 管理员 | | teacher | 老师 | | student | 学生 |

image-20260128135134155

角色信息已经在登录时写入了 session:

request.session['user_role']

2️⃣ 菜单显示规则​

左侧菜单栏需要根据角色动态显示:

功能adminteacherstudent
班级管理✅❌❌
教师管理✅❌❌
学生管理✅✅❌
成绩管理✅✅❌
我的成绩❌❌✅
修改密码✅✅✅
退出登录✅✅✅

image-20260128135141959

3️⃣ URL 访问规则​

仅隐藏菜单是不够的。

我们还必须 限制 URL 访问权限,例如:

  • /students/ 👉 只允许 管理员和老师
  • /grades/create/ 👉 只允许 管理员
  • /grades/my_score/ 👉 只允许 学生

2.先实现:菜单级权限控制​

在 base.html 中,我们可以直接通过 session 判断当前角色。代码如下:

<div class="content">
<ul>
{% if request.session.user_role == 'admin' %}
<li><span class="iconfont icon-fangzi"></span>
<a href="/grades/">班级管理</a>
</li>
<li><span class="iconfont icon-kapian"></span>
<a href="/teachers/">老师管理</a>
</li>
{% endif %}
{% if request.session.user_role == 'admin' or request.session.user_role == 'teacher' %}
<li><span class="iconfont icon-ren"></span>
<a href="/students/">学生管理</a>
</li>
<li><span class="iconfont icon-shuben"></span>
<a href="/scores/">成绩管理</a>
</li>
{% endif %}
{% if request.session.user_role == 'student' %}
<li><span class="iconfont icon-bianji"></span>
<a href="{% url 'my_scores' %}">成绩列表</a>
</li>
{% endif %}
<li><span class="iconfont icon-bianji"></span>
<a href="/change_password/">修改密码</a>
</li>
<li><span class="iconfont icon-shangchuan"></span>
<a href="/logout/">退出登录</a>
</li>
</ul>
</div>

现在,菜单显示已经正确了。

但问题仍然存在—— 👉 用户仍然可以手动输入 URL 访问不该访问的页面。

学生账号登录,页面效果如下:

🔒 试读结束

继续阅读完整内容

以上为免费预览。前往「Django + Vue 全栈课程」,查看后续完整讲解、案例演示和配套资料。

查看课程详情