版本,认证,权限

            版本

DRF中版本

导入

from rest_framework.versioning import

  

全局配置版本控制系统 

/v1/books/    是在 URL加查询参数

# DRF的配置
REST_FRAMEWORK = {
    # 配置默认使用的版本控制类
    ‘DEFAULT_VERSIONING_CLASS‘: ‘rest_framework.versioning.URLPathVersioning‘,
    ‘DEFAULT_VERSION‘: ‘v1‘,  # 默认的版本
    ‘ALLOWED_VERSIONS‘: [‘v1‘, ‘v2‘],  # 有效的版本
    ‘VERSION_PARAM‘: ‘version‘,  # 版本的参数名与URL conf中一致
}  

URl

url(r‘(?P<version>[v1|v2]+)/books/$‘, views.BookListView.as_view()),  

视图:

class BookListView(ListCreateAPIView):
    """查看列表和创建"""
    queryset = models.Book.objects.all()
    serializer_class = BookModelSerializer

    # 只要配置了版本 在视图中就能通过 request.version

    def get_serializer_class(self):
        """获取当前序列化类的方法"""
        # 根据版本的不同返回不同的序列化类
        print(self.request.version)
        if self.request.version == ‘v1‘:
            return BookSerializerVersion1
        return self.serializer_class

/books/?version=v1

局部配置

注意,通常我们是不会单独给某个视图设置版本控制的,如果你确实需要给单独的视图设置版本控制,你可以在视图中设置versioning_class属性,如下:

class PublisherViewSet(ModelViewSet):

    ...
    versioning_class = URLPathVersioning

  

            认证

接下类我们就自己动手实现一个基于Token的认证方案:

                自定义Token认证

        表

定义一个用户表和一个保存用户Token的表:

class UserInfo(models.Model):
    name = models.CharField(max_length=32)
    pwd = models.CharField(max_length=32)
    vip = models.BooleanField(default=False)
    token = models.CharField(max_length=128,null=True,blank=True)

url

url(r‘users/‘,include(‘auth_demo.urls‘)),

urlpatterns = [
    url(r‘reg/$‘,views.RegView.as_view()),
    url(r‘login/$‘,views.LoginView.as_view()),
    url(r‘test_auth/$‘,views.TesAuthView.as_view()),

]

登录和注册   views

from django.shortcuts import render
from rest_framework.views import APIView
from auth_demo import models
from rest_framework.response import Response
import uuid

class RegView(APIView):
    def post(self, request):
        # 获取用户注册的数据
        name = request.data.get(‘name‘)
        pwd = request.data.get(‘pwd‘)
        re_pwd = request.data.get(‘re_pwd‘)
        if name and pwd:
            if pwd == re_pwd:
                models.UserInfo.objects.create(name=name, pwd=pwd)
                return Response(‘注册成功‘)
            else:
                return Response(‘两次密码不正确‘)
        else:
            return Response(‘无效参数‘)

class LoginView(APIView):
    def post(self, request):
        name = request.data.get(‘name‘)
        pwd = request.data.get(‘pwd‘)
        if name and pwd:
            user_obj = models.UserInfo.objects.filter(name=name, pwd=pwd).first()
            if user_obj:
                # 生成token  保存在用户表,  给用户返回
                token = uuid.uuid1().hex
                user_obj.token = token
                user_obj.save()
                return Response({‘error_on‘: 1, ‘error‘: token})

            else:
                return Response({‘error_on‘: 1, ‘error‘: ‘用户名或密码错误‘})
        else:
            return Response(‘无效参数‘) 

局部配置认证

from auth_demo.auth import MyAuth
# 登录之后才能看到的数据接口
class TesAuthView(APIView):
    authentication_classes = [MyAuth, ]  # 局部配置认证
    def get(self, request):
        return Response(‘这里只能是登陆后才能看到的地方‘)  

全局配置认证  不推荐用

REST_FRAMEWORK = {
    ‘DEFAULT_AUTHENTICATION_CLASSES‘: [‘auth_demo.auth.MyAuth‘, ]
}  

自定义认证 

from rest_framework.authentication import BaseAuthentication
from auth_demo import models
from rest_framework.exceptions import AuthenticationFailed#别人写的抛出异常

class MyAuth(BaseAuthentication):
    def authenticate(self, request):
        #拿到页面?后面的数据
        token = request.query_params.get(‘token‘)
        if token:
            user_obj = models.UserInfo.objects.filter(token=token).first()
            if user_obj:
                # token是有效的,记住要对象和token
                return user_obj,token
            else:
                # 抛出异常
                raise AuthenticationFailed(‘无效的token‘)
        else:
            raise AuthenticationFailed(‘请求的URL中必须携带token参数‘)

  

          权限

自定义一个权限组件

‘‘‘
自定义一个权限组件
‘‘‘
from rest_framework.permissions import BasePermission
from auth_demo import models

class MyPermission(BasePermission):
    #提示
    message = ‘这是vip才能访问‘

    def has_permission(self, request, view):
        # 如果你是VIP才有权限访问
        # request.user:当前经过认证的用户对象
        if request.user.vip:
            return True
        else:
            return False  

全局配置

    ‘DEFAULT_PERMISSION_CLASSES‘: [‘auth_demo.permissions.MyPermission‘, ] 

局部配置

from auth_demo.auth import MyAuth
from auth_demo.permissions import MyPermission
# 登录之后才能看到的数据接口
class TesAuthView(APIView):
    authentication_classes = [MyAuth, ]  # 局部配置认证
    permission_classes = [MyPermission, ]#局部配置权限
    def get(self, request):
        return Response(‘这里只能是登陆后才能看到的地方‘)

原文地址:https://www.cnblogs.com/xihuanniya/p/10274339.html

时间: 2024-10-07 00:28:00

版本,认证,权限的相关文章

SAP云解决方案和企业本地部署(On-Premise)混合架构下的安全认证权限管理

SAP提供了用户认证.权限管理和单点登录等安全相关的解决方案.但是随着云平台的兴起,企业已经部署的安全解决方案如何与云平台的安全解决方案集成呢?这是摆在我们面前的一个问题,而且是一个至关重要.需要认真思考的问题. 本文将探讨SAP提供的本地部署和云平台的安全解决方案产品集:SAP Single Sign-On, SAP Cloud Platform Identity Authentication, SAP Identity Management, 和SAP Cloud Platform Iden

C#.NET 大型通用信息化系统集成快速开发平台 4.1 版本 - 数据权限增强、范围权限增强

并不是不想做B\S的管理工具,只是精力实在不够,由于用户权限管理组件是基础组件.所以C\S的也无妨,不会有几个人在乎Oracle,SQLServer是否不b\s的,注重的是功能性能,请大家不要纠结与是否B\S还是C\S上. 实现的方法.设计的界面.数据库结构的设计.底层DLL方法的函数调用,都可以参考,毕竟自己全部实现一个,耗费太多精力,不如拿过来用用参考,按自己的需要修改几下就可以用了,省心省事省力,腰不疼腿不酸,没必要浪费生命. 由于公司的组织机构庞大.网点非常多,所以数据权限的设置也非常复

【原】无脑操作:IDEA + maven + Shiro + SpringBoot + JPA + Thymeleaf实现基础认证权限

开发环境搭建参见<[原]无脑操作:IDEA + maven + SpringBoot + JPA + Thymeleaf实现CRUD及分页> 需求: ① 除了登录页面,在地址栏直接访问其他URL,均跳转至登录页面 ② 登录涉及帐号和密码,帐号错误提示帐号错误,密码错误提示密码错误 ③ 登录成功跳转至首页,首页显示登录者帐号信息,并有注销帐号功能,点击注销退出系统 ------------------------------------------------------------------

DRF 版本 认证

DRF的版本 版本控制是做什么用的, 我们为什么要用 首先我们要知道我们的版本是干嘛用的呢~~大家都知道我们开发项目是有多个版本的~~ 当我们项目越来越更新~版本就越来越多~~我们不可能新的版本出了~以前旧的版本就不进行维护了~~~ 那我们就需要对版本进行控制~~这个DRF也给我们提供了一些封装好的版本控制方法~~ 版本控制怎么用 之前我们学视图的时候知道APIView,也知道APIView返回View中的view函数,然后调用的dispatch方法~ 那我们现在看下dispatch方法~~看下

基于asp.net MVC 的服务器和客户端的交互(二)之获取Oauth 2.0认证权限

基本Web API的ASP.NET的Oauth2认证 增加Token额外字段 增加Scope授权字段 持久化Token 设计Token的时间间隔 刷新Token后失效老的Token 自定义验证[重启IIS池Token失效,验证权限] Oauth2 认证的流程 客户端发送口令(grant_type,client_id,client_secret)到服务端请求,认证返回access token ,然后客户端跟据获得的access token,根据Access Token获得权限去访问Web API.

【Mongodb】用户和认证 权限总结

开启MongoDB服务时不添加任何参数时,默认是没有权限验证的,登录的用户可以对数据库任意操作而且可以远程访问数据库!   在刚安装完毕的时候MongoDB都默认有一个admin数据库,此时admin数据库是空的,没有记录权限相关的信息!当admin.system.users一个用户都没有时,即使mongod启动时添加了--auth参数,如果没有在admin数据库中添加用户,此时不进行任何认证还是可以做任何操作(不管是否是以--auth 参数启动),直到在admin.system.users中添

【MongoDB】开启认证权限

1. mongodb.conf : 添加 auth=true 2. use admin (3.0+ 使用 createUser ;<3.0版本  http://www.cnblogs.com/guizi/archive/2012/11/20/2779500.html) db.createUser({  user: "root",  pwd: "123456",  roles: [ { role: "userAdminAnyDatabase"

Android自动接听&amp;挂断电话(包含怎么应对4.1以上版本的权限检

一  前言 这两天要研究类似白名单黑名单以及手势自动接听的一些功能,所以呢,自然而然的涉及到怎么自动接听/挂断电话的功能了.对于自动接听这一块,android4.1版本及其以上的版本和之前的版本处理逻辑不太一样,因为google增加了权限检查...所以,按照以前的方法可能不能实现自动接听了. 二  android低版本自动接听/挂断实现 1. copy android源代码的ITelephony.aidl文件到自己的项目为什么要copy这个文件到自己的项目中呢?这是因为接听/挂断电话的方法在接口

认证 权限 视图 频率

认证组件 使用:写一个认证类,继承BaseAuthentication 在类中写authenticate方法,把request对象传入 能从request对象中取出用户携带的token根据token判断是否登录过 如果登录过,返回两个值 user对象 ,token对象(或者其他自定义的对象) 如果没有登录过抛异常 from rest_framework.authentication import BaseAuthentication from app01 import models from r