首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在Django中为相同的身份验证模型拥有不同的登录页面?

如何在Django中为相同的身份验证模型拥有不同的登录页面?
EN

Stack Overflow用户
提问于 2022-02-24 11:47:10
回答 2查看 188关注 0票数 0

我有一个Django用户模型(带有一个自定义用户管理器),但是有两种不同的用户类型,即StoreCustomer,用于处理身份验证:

authentication/models.py

代码语言:javascript
复制
class User(AbstractBaseUser, PermissionsMixin):
    ...

    # checks if user is associated with a store object
    def is_store(self):
        return hasattr(self, 'store')

    # checks if user is associated with a customer object
    def is_customer(self):
        return hasattr(self, 'customer')

stores/models.py

代码语言:javascript
复制
class Store(models.Model):
    user = models.OneToOneField(settings.AUTH_USER_MODEL, verbose_name=_('user'), on_delete=models.RESTRICT, primary_key=True)
    ...

    def clean(self):
        # validates that the selected user doesn't belong to a customer object
        if self.user.is_customer():
            raise ValidationError({'user': _('This user is already associated with a customer.')})

customers/models.py

代码语言:javascript
复制
class Customer(models.Model):
    user = models.OneToOneField(settings.AUTH_USER_MODEL, verbose_name=_('user'), on_delete=models.CASCADE, primary_key=True)
    ...

    def clean(self):
        # validates that the selected user doesn't belong to a store object
        if self.user.is_store():
            raise ValidationError({'user': _('This user is already associated with a store.')})

现在,商店和客户应该使用两个不同的网站登录,即商店将使用admin.domain.com,而客户将使用domain.com。如果一个商店被登录到admin.domain.com,它是否也会显示他在访问domain.com时是登录的?如果是这样的话,我如何防止这种情况,并将这两个模型隔离到特定的站点,同时使用相同的身份验证模型和方法?

EN

Stack Overflow用户

回答已采纳

发布于 2022-03-02 06:27:50

我们可以使用permission_classes来完成上述问题。

DRF具有permission_classes属性,它支持权限类列表。创建2个权限类IsShopUserIsShopCustomer。这两个类都是在DRF中构建的IsAuthenticated类的子类。

代码语言:javascript
复制
from rest_framework.permissions import IsAuthenticated
class ISShopUser(IsAuthenticated):
    def has_permission(self, request, view):
        """
        if user is a shop user return true
        else return false
        """

在每个视图中,应用那些基于用户类型的权限类。

代码语言:javascript
复制
class ShopAPIView(APIView):
    permission_classes = [ISShopUser]

如果用户输入了错误的API,则不建议注销用户。只需显示一个错误。

票数 1
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71251474

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档