DjangoRestFramework使用自定义权限

1. 项目配置


项目结构

构建 Django 项目,结构如下

  • MyProj03/
      |__ Assets/
        |__ perms.py
        |__ models.py
        |__ views.py
        |__ urls.py
        |__ ...
      |__ MyProj03/
        |__ settings.py
        |__ urls.py
        |__ ...
      |__ UserManagement/
        |__ models.py
        |__ ...

配置项目

MyProj03/MyProj03/settings.py 代码如下

INSTALLED_APPS = [
    ...
    'rest_framework',
    'UserManagement',
    'Assets',
]

REST_FRAMEWORK = {
    'DEFAULT_PERMISSION_CLASSES': [
        'rest_framework.permissions.IsAuthenticated',
        'Devices.perms.RbacPermission',  # 自定义权限认证
    ],

    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework_simplejwt.authentication.JWTAuthentication',
        'rest_framework.authentication.BasicAuthentication',
        'rest_framework.authentication.SessionAuthentication',
    )

}

AUTH_USER_MODEL = 'UserManagement.SysUsers'


用户模型

MyProj03/UserManagement/models.py 代码如下

class SysUsers(AbstractBaseUser):
    id = models.BigAutoField(primary_key=True)
    username = models.CharField(max_length=40, unique=True)
    is_staff = models.BooleanField(
        ('staff status'),
        default=False,
    )
    is_admin = models.BooleanField(default=False)
    last_login = models.DateTimeField(blank=True, null=True)
    is_active = models.SmallIntegerField(blank=True, null=True)
    is_alive = models.SmallIntegerField(blank=True, null=True)

    objects = UserManager()
    USERNAME_FIELD = 'username'
    
    class Meta:
        db_table = 'sys_users'
        verbose_name = "用户"
        verbose_name_plural = "用户"

    def __str__(self):
        return self.username

添加几条数据

idusernamepasswordis_staffis_adminlast_login_timeis_activeis_alive
1吴敬中123456002021-06-24 14:58:22.11850411
2余则成123456012021-06-24 14:58:22.11850411
3王翠萍123456002021-06-24 14:58:22.11850411
4穆晚秋123456002021-06-24 14:58:22.11850411

设备模型

MyProj03/Assets/models.py 代码如下

from django.db import models

# Create your models here.
class Devices(models.Model):
    id = models.BigAutoField(primary_key=True)
    name = models.CharField(max_length=32, blank=True, null=True)
    dept_id = models.BigIntegerField(blank=True, null=True)
    is_alive = models.SmallIntegerField(blank=True, null=True)

    class Meta:
        db_table = 'devices'
        verbose_name = "设备"
        verbose_name_plural = "设备"

    def __str__(self):
        return self.name

添加数据

idnamedept_idis_alive
1总经办电话11
2总经办台式机1号11
3总经办台式机2号11
4总经办打印机1号11
5市场一部电话1号21
6市场一部电话2号21

2. 权限设置


自定义权限

MyProj03/Assets/perms.py

from rest_framework.permissions import BasePermission


class UserPermission(BasePermission):

    def has_permission(self, request, view):
        if not request.user.is_admin:
            return True

        return False

视图模型

MyProj03/Assets/views.py

from .models import Assets
from rest_framework import serializers, viewsets
from Devices.perms import UserPermission


class DevicesSerializer(serializers.ModelSerializer):
    class Meta:
        model = Assets
        fields = "__all__"


class DevicesViewSet(viewsets.ModelViewSet):
    permission_classes = [UserPermission, ]
    queryset = Assets.objects.all()
    serializer_class = DevicesSerializer

路由设置

MyProj03/Assets/urls.py

from django.urls import path, include
from rest_framework import routers

from Assets.views import DevicesViewSet

router = routers.SimpleRouter()
router.register('devices', DevicesViewSet)

urlpatterns = [
    path('', include(router.urls)),
]

MyProj03/MyProj03/urls.py

from django.urls import path, include

urlpatterns = [
    path('api-auth/', include('rest_framework.urls', namespace='rest_framework')),
    path('assets/', include('Assets.urls')),
]


3. 测试

使用 余则成 账号访问(is_admin==True)数据,可访问
在这里插入图片描述
使用 吴敬中 账号访问(is_admin==False)数据,不可访问
在这里插入图片描述

.
.
.
.
.
.
桃花仙人种桃树,又摘桃花换酒钱_

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Django REST Framework 提供了多种方式来设置接口权限: 1. 基于视图函数的权限控制 可以在视图函数中通过 `permission_classes` 属性设置权限类,例如: ```python from rest_framework.permissions import IsAuthenticated from rest_framework.decorators import api_view, permission_classes from rest_framework.response import Response @api_view(['GET']) @permission_classes([IsAuthenticated]) def my_view(request): # 只有已认证用户才能访问 return Response({'message': 'Hello, World!'}) ``` 2. 基于视图类的权限控制 也可以在视图类中通过 `permission_classes` 属性设置权限类,例如: ```python from rest_framework.permissions import IsAuthenticated from rest_framework.views import APIView from rest_framework.response import Response class MyView(APIView): permission_classes = [IsAuthenticated] def get(self, request): # 只有已认证用户才能访问 return Response({'message': 'Hello, World!'}) ``` 3. 全局权限控制 可以在 `settings.py` 文件中通过 `DEFAULT_PERMISSION_CLASSES` 设置全局权限类,例如: ```python REST_FRAMEWORK = { 'DEFAULT_PERMISSION_CLASSES': [ 'rest_framework.permissions.IsAuthenticated', ] } ``` 这样所有的视图函数和视图类都会使用 `IsAuthenticated` 权限类进行权限控制。 4. 自定义权限类 除了使用 Django REST Framework 提供的权限类外,还可以自定义权限类。自定义权限类需要实现 `BasePermission` 类,并实现 `has_permission` 方法,例如: ```python from rest_framework.permissions import BasePermission class MyPermission(BasePermission): def has_permission(self, request, view): # 自定义权限控制逻辑 return True ``` 然后在视图函数或视图类中使用: ```python @api_view(['GET']) @permission_classes([MyPermission]) def my_view(request): # 自定义权限控制逻辑 return Response({'message': 'Hello, World!'}) ``` 或者在全局设置中使用: ```python REST_FRAMEWORK = { 'DEFAULT_PERMISSION_CLASSES': [ 'path.to.MyPermission', ] } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值