繁体   English   中英

Django DRF 仅超级用户登录

[英]Django DRF login only superuser

我想用 Django drf 实现登录。 我只希望超级用户(我的用户模型中的 is_staff 权限)能够登录。到目前为止,我使用 rest_framework_simplejwt 为每个尝试登录的用户生成令牌。

如何实现只有超级用户才能登录?

Views.py:调用序列化程序

class MyTokenObtainPairView(TokenObtainPairView):
serializer_class = MyTokenObtainPairSerializer

序列化器.py:

class MyTokenObtainPairSerializer(TokenObtainPairSerializer):
@classmethod
def get_token(cls, user):
    user = CustomUser.objects.get(email=user.email)
    print(colored(user, "yellow"))
    token = super().get_token(user)
    # Add custom claims
    token['username'] = user.clinic_name
    token['email'] = user.email
    # ...
    return token

在 serializer.py 中,当我尝试检索用户user = CustomUser.objects.get(email=user.email)时,我只收到 email 归档。 我正在使用 email 来检索用户,因为 email 是一个唯一字段。

网址.py:

urlpatterns = [
path('token/', views.MyTokenObtainPairView.as_view(), name='token_obtain_pair'),
path('token/refresh/', TokenRefreshView.as_view(), name='token_refresh'),
path('register/', views.ClinicRegistration, name='auth_register'),
path('users/', views.ClinicListView.as_view(), name='users_list'),
path('users/<pk>/', views.ClinicDetailView.as_view(), name='get_user'),
path('users/<pk>/update/', views.ClinicUpdate, name='update_user'),
path('users/<pk>/delete/', views.ClinicDeleteView.as_view(), name='delete_user'),
path('', views.getRoutes),
path('test/', views.testEndPoint, name='test')

]

在我使用 react 的前端,我发出了一个 Axios.post 请求,其中包含:用户名、密码和 email 字段。

这是我的自定义用户模型:

class CustomUser(AbstractBaseUser, PermissionsMixin):
username = None
email = models.EmailField(_('email address'), unique=True)
clinic_name = models.CharField(max_length=150, blank=True)
is_staff = models.BooleanField(default=False)
is_active = models.BooleanField(default=True)
date_joined = models.DateTimeField(default=timezone.now)
fb_projectId = models.CharField(max_length=150, blank=True)
fb_databaseURL = models.CharField(max_length=150, blank=True)
fb_storageBucket = models.CharField(max_length=150, blank=True)
fb_locationId = models.CharField(max_length=150, blank=True)
accounts = models.BooleanField(default=True)
dashboard = models.BooleanField(default=True)
measurements = models.BooleanField(default=False)
medications = models.BooleanField(default=False)
questionnaire = models.BooleanField(default=False)
chat = models.BooleanField(default=False)

objects = CustomUserManager()

USERNAME_FIELD = 'email'
REQUIRED_FIELDS = ['clinic_name']

def __str__(self):
    return self.email

反应 API 调用:

const loginUser = async (username, password) => {
return appAxios
  .post(`token/`, {
    username,
    password,
    email: username,
  })
  .then((res) => {
    setAuthTokens(res.data);
    setUser(jwt_decode(res.data.access));
    setApiErrors("");
    localStorage.setItem("authTokens", JSON.stringify(res.data));
    history.push("/");
  })
  .catch((err) => {
    setApiErrors(err.response.data.detail);
    history.push("/login");
  });

};

为什么不使用默认文档? https://www.django-rest-framework.org/tutorial/4-authentication-and-permissions/#adding-required-permissions-to-views

在你的情况下:

class MyOnlyForAdminView(drf.generics.APIView):
    ... # any view staff before
    permission_classes = [drf.permissions.IsAdminUser]
    ... # any view staff after

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM