DRF之自定义权限

1、增加表字段:

from django.db import models

class UserInfo(models.Model):
    username = models.CharField(max_length=32)
    password = models.CharField(max_length=32)
    email = models.CharField(max_length=64)
    user_type_choices = ((0,'普通用户'),(1,'管理员'))
    user_type = models.IntegerField(choices=user_type_choices,default=0)

class Token(models.Model):
    value = models.CharField(max_length=64)  # session_key
    user = models.OneToOneField(UserInfo)  # 只能登陆一次,再次登陆则会重新生成token值

2、权限源码流程:

# step 1
def dispatch(self, request, *args, **kwargs):
    try:
        self.initial(request, *args, **kwargs)

# step 2
def initial(self, request, *args, **kwargs):
    self.perform_authentication(request)  # 先进行用户认证
    self.check_permissions(request)  # 随后获取权限

# step 3
def check_permissions(self, request):
    for permission in self.get_permissions():

        # 若 has_permission 返回 True 则有权限,反之,无权限
        if not permission.has_permission(request, self):
            self.permission_denied(
                request, message=getattr(permission, 'message', None)
            )

# step 4
def get_permissions(self):
    return [permission() for permission in self.permission_classes]

# 默认的AllowAny类允许所有用户登录
class AllowAny(BasePermission):
    def has_permission(self, request, view):
        return True

3、获取默认的权限类:

class UserView(APIView):
    def get(self,request,*args,**kwargs):
        print(self.permission_classes)  # [<class 'rest_framework.permissions.AllowAny'>]

from rest_framework.permissions import AllowAny,BasePermission

class AllowAny(BasePermission):
    def has_permission(self, request, view):
        return True

4、自定义权限类:

from rest_framework.permissions import BasePermission

class MyPermission(BasePermission):
    message =  '无权限访问'  # 定制错误信息
    def has_permission(self, request, view):
        # 已经过认证
        user = request._request.user
        if user:
            if user.user_type == 1:
                return True
        return False

class Permission(object):
    # 利用继承指定权限类
    permission_classes = [MyPermission,]
    

5、使用示例:

# 路由
from django.conf.urls import url
from app01.views import UserView,GroupView

urlpatterns = [
    url(r'^users/', UserView.as_view()),
    url(r'^user_groups/', GroupView.as_view()),
]

# 视图
class UserView(Auth,APIView):
    """指定了认证类,只有认证通过才能访问"""
    def get(self,request,*args,**kwargs):
        return HttpResponse('<h1>用户界面</h1>')

class GroupView(Auth,Permission,APIView):
    """指定了认证和权限类,先要通过认证且只有管理者才能访问"""
    def get(self,request,*args,**kwargs):
        return HttpResponse('<h1>用户组界面</h1>')

6、测试:

# alex 为普通用户,对应的token值为 9c4cb1631b3a5ead33fb09f6349c4bc7
# kate 为管理者,对应的token值为 3cfc1dfab9d2b130e44cbf86b1099206

http://127.0.0.1:8000/users/?tk=9c4cb1631b3a5ead33fb09f6349c4bc7
http://127.0.0.1:8000/users/?tk=3cfc1dfab9d2b130e44cbf86b1099206
# 都能正常登陆

http://127.0.0.1:8000/user_groups/?tk=9c4cb1631b3a5ead33fb09f6349c4bc7
'''
HTTP 403 Forbidden
Allow: GET, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept

{
    "detail": "无权限访问"
}
'''

http://127.0.0.1:8000/user_groups/?tk=3cfc1dfab9d2b130e44cbf86b1099206
# 由于是管理用户可以正常访问

原文地址:https://www.cnblogs.com/fqh202/p/9397717.html

时间: 2024-08-30 02:13:36

DRF之自定义权限的相关文章

DRF认证、自定义认证和权限、自定义权限

源码分析 """ 1)APIView的dispath(self, request, *args, **kwargs) 2)dispath方法内 self.initial(request, *args, **kwargs) 进入三大认证 # 认证组件:校验用户 - 游客.合法用户.非法用户 # 游客:代表校验通过,直接进入下一步校验(权限校验) # 合法用户:代表校验通过,将用户存储在request.user中,再进入下一步校验(权限校验) # 非法用户:代表校验失败,抛出异常

android 自定义权限

理解android的自定义权限,下面介绍一段代码.包括两个安卓项目,project 2试图调用project 1中的特权活动PrivActivity. android project 1 : application name: Custom Permission pacakage name: com.cust.perm 1) 特权活动 PrivActivity.java package com.cust.perm; import android.app.Activity; import andr

shiro 实现自定义权限规则校验

<span style="font-family: Arial, Helvetica, sans-serif;">在系统中使用shiro进行权限管理,当用户访问没有权限的资源时会跳转到指定的登录url.</span> 但是如果系统中支持手机app,手机访问时没有使用session进行登录凭证管理,而是使用token,有两种解决方法: 1:支持手机客户端访问的资源在权限配置中配置成anon 2:实现自定义认证拦截器,对用户请求资源进行认证 显然第一种方法不适用,这

thinkphp自定义权限管理之名称判断

权限管理,就是给不同的用户分配不同的权限.当用户登录或者操作时候进行判断,来阻止用户进行权限以外的操作.本次讲的是当用户登录一刻,只显示权限开启的内容. 一.建立数据库. 1.权限表funcla.来存储录入所有权限,也是避免因权限名称修改了,权限失效的问题. 2.管理员表admin.主要存储管理员用户名等信息. 3.管理员对应权限表funadmin.主要存储已开启的管理员id与权限id. 二.输出权限列表. 1.通过管理员列表进入权限分配. 2.权限分配列表. 关于权限分配列表,因为权限板块的不

【转】 Pro Android学习笔记(六五):安全和权限(2):权限和自定义权限

目录(?)[-] 进程边界 声明和使用权限 AndroidManifestxml的许可设置 自定义权限 运行安全通过两个层面进行保护.进程层面:不同应用运行在不同的进程,每个应用有独自的user ID:在操作层面,Android定义了所需保护的功能和资源,如果应用需要访问这些信息,必须在AndroidManifest.xml文件中请求许可,应用可以有自定义的许可. 进程边界 每个应用的userID不同,使得各个进程之间存在隔离的边界,防止应用直接获取其他应用的数据,需要通过content pro

Android自定义权限permission

Android是一种特权分隔的操作系统,在Android上运行的每个应用程序都具有各自独立的系统标识(Linux用户ID和组ID).系统各部分有不同的身份标识.因此,Linux上运行的各个应用程序相互独立且与系统无关. Android的"权限许可"机制通过限定特定的进程能够执行的指定操作和限定对每一个资源点对点的访问的URI许可来提供附加细粒度的安全功能. 由于内核让每个应用程序运行在独立的沙盒中,应用程序必须通过声明所需要而沙盒没有提供的权限来明确的分配资源和数据.Android没有

[android开发篇]自定义权限

有时候,我们可能遇到如下需求场景:当用户在一个应用程序中进行某项操作时,会启动另外一个应用程序,最常见的时直接打开了另外一个应用程序,并进入其中某个Activity(如:有的应用中有推荐应用列表,当用户点击时程序会首先判断其他应用有无安装,若无则提示用户下载,如有则直接打开进入).有时候,处于安全等需要,此类操作需要加上受限制性的访问限制,那么怎么办呢?Android中为我们提供了自定义权限. 为了讲清自定义权限,先以不同的程序之间访问Activity增加权限限制为例.假设应用程序A中有Main

android 中使用自定义权限在广播中的利用

1.在一个进程中发送一个有自定义权限的广播,另外一个进程中拥有广播接受者接受到该广播 <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="im.weiyuan.com.hkkj"> <application andro

Orchard 前台权限与自定义权限

一:关于前台权限 1:只允许自己看到 首先,我们需要确定在 Role 设置页面,用户所对应的 View Page by others 和 View all content 未被选中.备注,我们首先和得设置 Anonymous 和 Authenticated 的这两个的权限,这两项也未被选中. 这样一来,我们可以达到整个站点,我们只能看到自己的东西,如下: 而如果是 Admin 等全权限登录的,应该是这样的: 2:只允许某个角色看到 同理1. 二:关于自定义权限 首先,我们需要在模块的根目录下创建