Django多用户组设计咨询:人力资源服务平台用户权限实现方案
人力资源平台用户权限实现方案
不需要单独创建Admin、Owner、Employee、Employer四个独立模型类,基于Django的AbstractUser扩展用户模型,结合**内置用户组(Group)和权限(Permission)**系统就能满足需求,这种方式更易维护且符合Django最佳实践。
一、创建用户应用并扩展AbstractUser
- 新建用户应用:
python manage.py startapp accounts
- 在
settings.py中配置自定义用户模型:
AUTH_USER_MODEL = 'accounts.CustomUser'
- 在
accounts/models.py中编写扩展后的用户模型:
from django.contrib.auth.models import AbstractUser from django.db import models class CustomUser(AbstractUser): # 新增业务相关字段:关联企业(雇主专属)、员工编号(员工专属) company = models.ForeignKey('companies.Company', on_delete=models.SET_NULL, null=True, blank=True, related_name='employers') employee_id = models.CharField(max_length=50, null=True, blank=True) # 可选:添加用户类型标识,方便快速识别(核心权限仍依赖组控制) USER_TYPE_CHOICES = ( ('admin', '管理员'), ('owner', '平台所有者'), ('employer', '雇主'), ('employee', '员工'), ) user_type = models.CharField(max_length=20, choices=USER_TYPE_CHOICES, null=True, blank=True)
二、配置用户组与权限
利用Django内置的Group和Permission系统,直接通过组批量管理权限:
- 初始化用户组:通过Django后台手动创建4个组:Admin、Owner、Employer、Employee
- 为各组分配对应权限:
- Admin组:勾选所有模型的
add/change/delete/view权限 - Owner组:勾选所有模型的
add/change/view权限,取消delete权限 - Employer组:仅给岗位/活动模型分配
add/change/view权限,取消delete权限 - Employee组:给活动模型分配
view权限,以及活动状态修改的change权限
- Admin组:勾选所有模型的
三、对象级权限控制(雇主专属)
为了限制雇主只能操作自身企业的岗位/活动,需在视图中增加对象级判断:
from django.contrib.auth.decorators import login_required, permission_required from django.shortcuts import get_object_or_404 from django.http import HttpResponseForbidden @login_required @permission_required('jobs.change_job', raise_exception=True) def update_job(request, job_id): job = get_object_or_404(Job, id=job_id) # 验证当前用户是否为该岗位所属企业的雇主 if request.user.user_type == 'employer' and request.user.company != job.company: return HttpResponseForbidden("你无权修改其他企业的岗位") # 后续更新逻辑...
四、简化方案(Admin与Owner合并)
若要简化实现,直接将Owner组的权限配置为与Admin组几乎一致,仅去掉delete权限即可,无需单独创建Owner模型。也可直接复用Admin组,给特定用户单独取消delete权限(组管理方式更高效)。
五、模板中的权限判断
在前端模板中使用Django内置标签直接判断权限:
{% if perms.jobs.add_job %} <a href="{% url 'job_create' %}">发布新岗位</a> {% endif %} {% if user.groups.all.0.name == 'Admin' %} <button>删除岗位</button> {% endif %}
内容的提问来源于stack exchange,提问作者Anna
相关产品推荐
相关产品推荐

