1

私は 4 つのレベルのユーザーが存在する Django システムで作業しています。 ) 4. 開発者 (真のスーパーユーザー)

私はパーミッションをいくらか把握していると思います:

    from django.conf import settings
from django.contrib.auth.models import (
    BaseUserManager, AbstractBaseUser
)
from django.core.validators import RegexValidator
from django.db import models
from django.db.models.signals import post_save


class CustomUserManager(BaseUserManager):
    """Customer User."""

    def create_user(self, email, password=None):
        """Creates and saves a user."""
        if not email:
            raise ValueError('Users must have an email address')

        user = self.model(
            email=self.normalize_email(email),
        )

        user.set_password(password)
        user.save(using=self._db)
        return user

    def create_admin(self, email):
        """Creates and saves an admin user with a temporary password."""
        user = self.create_user(
            email,
            password=BaseUserManager.make_random_password(self, 12)
        )
        user.is_admin = True
        user.save(using=self.db)
        return user


    def create_gatekeeper(self, email, password):
        """Creates and saves a gatekeeper."""
        user = self.create_user(
            email,
            password=password,
        )
        user.is_admin = True
        user.is_gatekeeper = True
        user.save(using=self.db)
        return user

    def create_superuser(self, email, password):
        """Creates and saves a superuser."""
        user = self.create_user(
            email,
            password=password,
        )
        user.is_admin = True
        user.is_gatekeeper = True
        user.is_developer = True
        user.save(using=self._db)
        return user


class CustomUser(AbstractBaseUser):
    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_gatekeeper = models.BooleanField(default=False)
    is_developer = models.BooleanField(default=False)

    objects = CustomUserManager()

    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = []

    # def __str__(self):
    #     return self.email

    def __str__(self):
        return self.email

    def has_perm(self, perm, obj=None):
        # Does the user have a specific permission?
        # Simplest possible answer: Yes, always
        return True

    def has_module_perms(self, app_label):
        # "Does the user have permissions to view the app `app_label`?"
        # Simplest possible answer: Yes, always
        return True

    class Meta:
        db_table = 'customuser'
        verbose_name = 'CustomUser'

ただし、ゲートキーパーと管理者の作成方法については触れていません。コマンドラインから実行できることは知っていますが、

a) 開発者がゲートキーパーを作成できるフォーム b) ゲートキーパーが管理者を作成できるフォーム

管理サイトは大幅にカスタマイズする必要があるため、Django Admin は使用せず、独自の機能を構築する可能性があります。create_gatekeeperDjangoフォーム内のようなものを呼び出すにはどうすればよいですか? Django 管理ページをサブクラス化し、それらをカスタマイズすることは、より良い方法でしょうか?

4

1 に答える 1

1

おそらく、グループを操作して、それらのグループにアクセス許可を追加する必要があります;;; しかし、あなたの 3 つのアクターでは、ユーザー モデルの django 組み込み属性を使用できます...

ユーザー:通常のユーザーは、is_something として他のものを使用して User クラスとして作成するだけです...

管理者ユーザーモデルから取得される属性 is_staff を使用して、ユーザーがdjango管理者にアクセスできるようにします...

開発者スーパー ユーザーとして作成できるため、すべての権限がモデルに自動的に追加されます

これはゲートキーパーに関するものなので、is_admin、is_gatekeeper などのフラグを作成し始めると、複数の属性を処理し始めることになります。これは悪い考えです。したがって、グループで作業しているときに、ユーザー グループ、開発者を作成できます。グループ (スーパー管理者であるため、実際にそれを行う必要はありません)、管理者グループ (このグループに付与する各権限を追加します [例: ブログ モデルは彼に付与できます blog add_blog、change_blog、delete_blog ですが、追加することもできますあなたのカスタムも]) 他のグループと同じ...

例えば。

# List of my Permissions that i want to add to my groups
PERMISSIONS = {
    STUDENT : ['add_student', 'change_student',
                  'delete_student', 'editpreview_student'],
    PROJECT: ['add_project', 'change_project', 'delete_project', 'editpreview_project'],

}

# Creating 2 Groups
grupo_admin, created = Group.objects.get_or_create(name='admin') 
grupo_teachers, created = Group.objects.get_or_create(name='teacher')    


for func_perm in PERMISSIONS [STUDENT]:
    perm = Permission.objects.get(codename=func_perm)
    grupo_admin.permissions.add(perm) # Adding Student Permission to my Admin Group
    grupo_teachers.permissions.add(perm)  # Adding Student Permission to my Teachers Group
for func_perm in PERMISSOES[PROJECT]:
    perm = Permission.objects.get(codename=func_perm)
    grupo_admin.permissions.add(perm) # Adding Project Permission only to my Admin Group

ビューで、そのような許可を確認できます

@user_passes_test(lambda u: u.has_perm('myapp.permission_code'))
def some_view(request):
    # ...

そして、あなたのHTMLはそのようにチェックできます

{% if perms.student.change_student %}
  <li>
    <a href="/admin/student/student/">
      <i class="fa fa-graduation-cap" aria-hidden="true"></i> 
      <span>Students</span>
    </a>
   </li>  
{% endif %}    
于 2018-07-24T19:58:08.287 に答える