web-dev-qa-db-ja.com

Django 1.8、複数のカスタムユーザータイプ

私はDjango 4つのタイプのユーザーを持つサイトを作成しています。

  • 特権管理者:基本的にすべてのタイプのユーザーを管理します
  • UserTypeA:サイトにログインでき、基本的に、任意のモデル用のCRUDインターフェイスを備えています。追加の属性もあります(TypeAユーザーにのみ関連する特定の情報)
  • UserTypeB:サイトにログインでき、TypeBユーザーに固有の追加情報があり、TypeCユーザーアカウントを作成および管理することもできます。
  • UserTypeC:サイトにログインでき、TypeCユーザーのみに関連する追加情報があります。

カスタムインターフェイスを作成し、組み込みの管理インターフェイスを利用しないことを計画していることに注意してください。このユーザー構造を実装するための最良の方法は何でしょうか?私はDjangoの組み込み認証システム(パスワードのソルティングとハッシュを管理し、さらにセッション管理など)を使用したいと思いますが、安全で本番環境に対応できる他の認証システムを使用することもできます。

編集:また、私の計画では、1つのログイン画面を使用してサイトにアクセスし、権限とユーザータイプを使用して、各ユーザーのダッシュボードで利用できるものを決定します。

編集:ユーザータイプごとにアプリを使用することでこれを実現することは可能ですか?可能な場合、これは単一のログイン画面でどのように行われますか?.

19
OzzyGreyman

まず、プロジェクトに複数の認証ユーザーベースを作成することはできません。したがって、Django提供されているユーザー認証を使用し、複数のタイプのユーザーに対してそれをフォークする必要があります。Djangoユーザーには、登録時に提供する必要があるいくつかのデフォルト値があります(Django Adminでユーザーを作成してみてください。)できることは、「CustomUser」というモデルを作成し、AbstractUserから継承することです。これにより、「CustomUser」モデルがプロジェクトユーザーのデフォルトです。AbstractUserから継承するため、この「CustomUser」モデルには元のユーザーモデルのすべてのフィールドが含まれ、独自にいくつかのフィールドを追加できます。また、settings.py元のユーザーモデルがデフォルトの認証モデルではなくなったプロジェクトのファイル。認証に使用される新しい 'CustomUser'モデルです。次のコードが役立つかどうかを確認してください。

from Django.db import models
from Django.contrib.auth.models import AbstractUser

class CustomUser(AbstractUser):
    type_choices = (
        ('SU', 'Super User'),
        ('A', 'User Type A'),
        ('B', 'User Type B'),
        ('C', 'User Type C'),
    )
    user_type = models.CharField(max_length=2,
                                 choices=type_choices,
                                 default='C')

class UserDetails(model.Model):
    type = models.OneToOneField('CustomUser')
    extra_info = models.CharField(max_length=200)

上記のコードで、ユーザーがユーザー名、パスワードなどの基本情報を提供できるCustomUserモデルを作成しました。これはDjangoのデフォルトです。次に、ユーザータイプを選択し、新しい認証モデルとOneToOneリレーションを持つUserDetailsモデルに追加情報を保存します。あなたがしなければならない最後の一つは、settings.pyファイル。

AUTH_USER_MODEL = 'index.CustomUser'

このindexは、私のCustomUserモデルが作成されたアプリです。

お役に立てれば。

20
MiniGunnR

Groups Djangoメカニズムを使用する必要があります-userAのような4つのグループを作成し、共通と言って、ユーザーが最初のグループか2番目のグループかを確認する必要があります-次に適切なビューを表示します

0
ali raza