我有一个Django用户模型(带有一个自定义用户管理器),但是有两种不同的用户类型,即Store和Customer,用于处理身份验证:
authentication/models.py
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
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
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时是登录的?如果是这样的话,我如何防止这种情况,并将这两个模型隔离到特定的站点,同时使用相同的身份验证模型和方法?
发布于 2022-03-02 06:27:50
我们可以使用permission_classes来完成上述问题。
DRF具有permission_classes属性,它支持权限类列表。创建2个权限类IsShopUser和IsShopCustomer。这两个类都是在DRF中构建的IsAuthenticated类的子类。
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
"""在每个视图中,应用那些基于用户类型的权限类。
class ShopAPIView(APIView):
permission_classes = [ISShopUser]如果用户输入了错误的API,则不建议注销用户。只需显示一个错误。
发布于 2022-02-24 12:38:54
创建从django StoreUserOnlyMixin类继承的2个mixins、StoreUserOnlyMixin和CuustomerUserOnlyMixin。然后,在每一个然后覆盖调度方法。
from django.views.generic import TemplateView
from django.contrib import auth
from django.http import HttpResponseRedirect
from django.urls import reverse
class CustomerUserOnlyMixin(TemplateView)
def dispatch(self, *args, **kwargs):
if not self.request.user.is_customer():
auth.logout(self.request)
return HttpResponseRedirect(reverse('customer_login_view'))
return super(CustomerUserOnlyMixin, self).dispatch(*args, **kwargs)和StoreUserOnlyMixin类似。之后,您可以根据商店或客户可以访问的视图从其中之一继承
https://stackoverflow.com/questions/71251474
复制相似问题