Django 权限管理实战:基于角色的菜单与访问控制
在上一节中,我们已经完成了系统的基础功能开发。但如果你现在切换不同账号登录,会发现一个明显的问题:
所有用户几乎都可以访问所有 URL。
这显然是不合理的。
在本节中,我们将为项目引入真正可用的权限管理机制,实现以下两个目标:
- 🧭 不同角色,显示不同菜单
- 🔒 不同角色,只能访问被允许的 URL
我们将充分利用 Django 自带的权限机制,在尽量少写判断代码的前提下,实现一套清晰、可维护的权限体系。
1.权限需求分析
在开始编码之前,我们先明确规则。
1️⃣ 系统中的角色
当前系统中一共有三类用户角色:
| 角色 | 说明 | | - | | | admin | 管理员 | | teacher | 老师 | | student | 学生 |

角色信息已经在登录时写入了 session:
request.session['user_role']
2️⃣ 菜单显示规则
左侧菜单栏需要根据角色动态显示:
| 功能 | admin | teacher | student |
|---|---|---|---|
| 班级管理 | ✅ | ❌ | ❌ |
| 教师管理 | ✅ | ❌ | ❌ |
| 学生管理 | ✅ | ✅ | ❌ |
| 成绩管理 | ✅ | ✅ | ❌ |
| 我的成绩 | ❌ | ❌ | ✅ |
| 修改密码 | ✅ | ✅ | ✅ |
| 退出登录 | ✅ | ✅ | ✅ |

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 全栈课程」,查看后续完整讲解、案例演示和配套资料。
查看课程详情