#python #django
#python #джанго
Вопрос:
Я хочу ограничить панель администратора моих рабочих пользователей — например, не хочу, чтобы они создавали пользователей или удаляли определенные типы моделей.
Вот некоторый код, models.py
который настраивает моего пользовательского пользователя, и post_save
сигнал для добавления пользователей.
Обратите внимание, что я установил default_permissions = ()
так, чтобы пользователи не запускались с какими-либо разрешениями, но затем я предоставляю им разрешения группы, в name=workers
которую НЕ входят myapp.myuser_add
, поэтому они не должны иметь возможности добавлять новых пользователей при входе в консоль администратора.
# models.py
from django.db import models
from django.contrib.auth.models import (
BaseUserManager, AbstractBaseUser, PermissionsMixin, Group
)
from django.db.models.signals import post_save
from django.dispatch import receiver
@receiver(post_save, sender=settings.AUTH_USER_MODEL)
def apply_worker_group(sender, instance=None, created=False, **kwargs):
if instance.is_worker:
try:
worker_group = Group.objects.get(name='workers')
if instance not in worker_group.user_set.all():
instance.groups.add(worker_group)
instance.save()
except Group.DoesNotExist:
pass
class MyUser(AbstractBaseUser, PermissionsMixin):
email = models.EmailField(
verbose_name='email address',
max_length=255,
unique=True,)
is_active = models.BooleanField(default=True)
is_admin = models.BooleanField(default=False)
is_worker = models.BooleanField(default=False)
# ... skipping a bunch of stuff
class Meta:
default_permissions = () # (!) ALL USERS HAVE NO PERMS TO START
@property
def is_staff(self):
# so workers can log into the admin panel
return self.is_admin or self.is_worker
Затем в моем admin.py
:
# admin.py
from django.contrib.auth.admin import UserAdmin
from django.contrib import admin
from myapp.models import MyUser
class MyUserAdmin(UserAdmin):
pass
class MyAdminSite(admin.AdminSite):
pass
admin_site = MyAdminSite(name='myadmin')
admin_site.register(MyUser, MyUserAdmin)
Но когда я создаю пользователя под своей учетной записью суперпользователя is_worker=True
, я все равно могу войти с этим созданным пользователем в панель администратора и создать больше пользователей! А это совсем не то, чего я хочу.
Любые предложения о том, как ограничить права доступа пользователей с помощью подобных групп?