使用自定义用户模型跨多个Django项目管理用户身份验证

yqlxgs2m  于 2023-06-07  发布在  Go
关注(0)|答案(1)|浏览(154)

我有三个Django项目:项目A、项目B和项目C。项目A用作身份验证项目,项目B负责管理与用户相关的功能,项目C处理与餐厅相关的操作。
在项目A中,我创建了一个自定义用户模型来满足我的身份验证需求。现在,我想利用这个自定义用户模型来访问项目B和项目C的API。
如何实现项目之间的集成?具体而言,我希望实现以下目标:
启用用户身份验证:我想使用在项目A中定义的自定义用户模型,在用户访问项目B和项目C的API时对其进行身份验证。
共享用户信息:我需要使用项目A中定义的自定义用户模型访问项目B和项目C中的用户信息。这包括检索用户详细信息、更新用户配置文件以及执行与用户相关的操作。
保持一致性:必须确保对项目A中的自定义用户模型所做的任何更改都反映在所有项目中,包括项目B和项目C。
这是我的自定义用户模型,来自项目A。

import uuid

from django.contrib.auth.models import AbstractBaseUser, BaseUserManager, PermissionsMixin
from django.db import models
from django.utils import timezone

class UserManager(BaseUserManager):

    def _create_user(self, email, password, is_staff, is_superuser, **extra_fields):
        if not email:
            raise ValueError('Users must have an email address')
        now = timezone.now()
        email = self.normalize_email(email)
        user = self.model(
            email=email,
            is_staff=is_staff,
            is_active=True,
            is_superuser=is_superuser,
            last_login=now,
            date_joined=now,
            **extra_fields
        )
        user.set_password(password)
        user.save(using=self._db)
        return user

    def create_user(self, email, password, **extra_fields):
        return self._create_user(email, password, False, False, **extra_fields)

    def create_superuser(self, email, password, **extra_fields):
        user = self._create_user(email, password, True, True, **extra_fields)
        return user

class User(AbstractBaseUser, PermissionsMixin):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    # username = models.CharField(max_length=255, null=True, blank=True, unique=True)
    email = models.EmailField(max_length=254)
    name = models.CharField(max_length=254, null=True, blank=True)
    is_staff = models.BooleanField(default=False)
    is_superuser = models.BooleanField(default=False)
    is_active = models.BooleanField(default=True)
    last_login = models.DateTimeField(null=True, blank=True)
    date_joined = models.DateTimeField(auto_now_add=True)
    organization_id = models.UUIDField(null=True, blank=True)

    USERNAME_FIELD = 'email'
    EMAIL_FIELD = 'email'
    REQUIRED_FIELDS = []

    objects = UserManager()

    def get_absolute_url(self):
        return "/users/%i/" % (self.pk)

我已经尝试过这个解决方案(Using same database table with two different projects Django)。但它不起作用。或者我没有正确地执行它。如果这是解决方案,请给予一个完整的例子。您的文本

jq6vz3qz

jq6vz3qz1#

要将项目A的自定义用户模型与项目B和C集成,您可以使用Django的多数据库功能。这允许你在一个Django项目中使用多个数据库。
下面是如何实现这种集成的示例:
1.在单独的应用中定义自定义用户模型
为了确保所有项目之间的一致性,最好在单独的应用程序中定义自定义用户模型,这三个项目都可以安装和使用。
您可以创建一个名为“accounts”(或您喜欢的任何其他名称)的新应用程序,并在其www.example.com文件中定义自定义用户模型models.py。
1.为每个项目配置数据库设置
在Django设置文件中,您可以使用Django的DATABASE配置为每个项目定义单独的数据库设置。
例如,可以按如下方式定义项目A的数据库设置:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': 'project_a_db',
        'USER': 'yourusername',
        'PASSWORD': 'yourpassword',
        'HOST': 'localhost',
        'PORT': '',
    },
}

同样,您可以使用单独的数据库名称和凭据为项目B和C定义数据库设置。
1.定义数据库路由器以将自定义用户模型查询路由到项目A
为了确保与自定义用户模型相关的所有查询都被路由到Project A数据库,您可以在“accounts”应用程序内的单独文件(例如“www.example.com”)中定义数据库路由器routers.py。
下面是如何定义路由器的示例:

class AccountsRouter:
    """
    A router to control all database operations on models in the
    accounts application.
    """

    def db_for_read(self, model, **hints):
        if model._meta.app_label == 'accounts':
            return 'project_a_db'
        return None

    def db_for_write(self, model, **hints):
        if model._meta.app_label == 'accounts':
            return 'project_a_db'
        return None

    def allow_relation(self, obj1, obj2, **hints):
        if obj1._meta.app_label == 'accounts' or \
                obj2._meta.app_label == 'accounts':
            return True
        return None

    def allow_migrate(self, db, app_label, model_name=None, **hints):
        if app_label == 'accounts':
            return db == 'project_a_db'
        return None

这个路由器将确保所有与自定义用户模型相关的查询都被路由到“project_a_db”数据库,而所有其他查询都被路由到它们各自的数据库。
1.在Django设置中设置数据库路由器
在Django设置文件中,您可以设置所有项目都要使用的数据库路由器,如下所示:

DATABASE_ROUTERS = ['accounts.routers.AccountsRouter']

有了这些设置,您现在可以使用在项目A中定义的自定义用户模型访问项目B和C中的API。
要对用户进行身份验证,您可以使用Django的身份验证框架,它将自动使用自定义用户模型进行身份验证。
要在项目间共享用户信息,您可以在项目B和C中定义API端点,使用Django的查询API查询项目A中的自定义用户模型。例如,您可以在项目B中定义一个API端点来检索用户详细信息,如下所示:

from accounts.models import User

def get_user_details(request, user_id):
    user = User.objects.get(id=user_id)
    # return user details as JSON

类似地,您可以定义其他API端点来更新用户配置文件、执行与用户相关的操作等。

相关问题