认证简介

使用场景:有些接口在进行访问时,需要确认用户是否已经登录,比如:用户需要购买物品时,在结账的时候,就需要进行登录验证的。

用户认证RBAC(Role-Based Access Control)

一般用户认证都是基于角色认证:

  • 三表机制

    • 用户表(User)
    • 角色表(Group)
    • 权限表(Permission)

    用户表关联角色表,角色表关联权限表

  • 五表机制

    • 用户表(User)
    • 用户角色关系表(User-Group)
    • 角色表(Group)
    • 角色权限表(Group-Permission)
    • 权限表(Permission)

    用户表与角色表多对多、角色表与权限表多对多

  • Django采用六表机制

    • 用户表(User)
    • 用户角色关系表(User-Group)
    • 角色表(Group)
    • 角色权限表(Group-Permission)
    • 权限表(Permission)
    • 角色权限表(User-Permission)

    用户表与角色表多对多、角色表与权限表多对多、用户表和权限表多对多

局部使用

  • models.py
from django.contrib.auth import models

class User(models.Model):
username=models.CharField(max_length=32)
password=models.CharField(max_length=32)
user_type=models.IntegerField(choices=((1,'超级用户'),(2,'普通用户'),(3,'二B用户'))) class UserToken(models.Model):
user=models.OneToOneField(to='User')
token=models.CharField(max_length=64)
  • 自定义认证类
from rest_framework.authentication import BaseAuthentication

class TokenAuth():
def authenticate(self, request):
token = request.GET.get('token')
token_obj = models.UserToken.objects.filter(token=token).first()
if token_obj:
return
else:
raise AuthenticationFailed('认证失败') def authenticate_header(self,request):
pass
  • views.py
def get_random(name):
import hashlib
import time
md=hashlib.md5()
md.update(bytes(str(time.time()),encoding='utf-8'))
md.update(bytes(name,encoding='utf-8'))
return md.hexdigest() class Login(APIView):
def post(self,reuquest):
back_msg={'status':1001,'msg':None}
try:
name=reuquest.data.get('name')
pwd=reuquest.data.get('pwd')
user=models.User.objects.filter(username=name,password=pwd).first()
if user:
token=get_random(name)
models.UserToken.objects.update_or_create(user=user,defaults={'token':token})
back_msg['status']='1000'
back_msg['msg']='登录成功'
back_msg['token']=token
else:
back_msg['msg'] = '用户名或密码错误'
except Exception as e:
back_msg['msg']=str(e)
return Response(back_msg) class Course(APIView):
authentication_classes = [TokenAuth, ] def get(self, request):
return HttpResponse('get') def post(self, request):
return HttpResponse('post')
  • 进阶:不存数据库的token验证

    def get_token(id,salt='123'):
    import hashlib
    md=hashlib.md5()
    md.update(bytes(str(id),encoding='utf-8'))
    md.update(bytes(salt,encoding='utf-8'))
    return md.hexdigest()+'|'+str(id) def check_token(token,salt='123'):
    ll=token.split('|')
    import hashlib
    md=hashlib.md5()
    md.update(bytes(ll[-1],encoding='utf-8'))
    md.update(bytes(salt,encoding='utf-8'))
    if ll[0]==md.hexdigest():
    return True
    else:
    return False class TokenAuth():
    def authenticate(self, request):
    token = request.GET.get('token')
    success=check_token(token)
    if success:
    return
    else:
    raise AuthenticationFailed('认证失败')
    def authenticate_header(self,request):
    pass class Login(APIView):
    def post(self,reuquest):
    back_msg={'status':1001,'msg':None}
    try:
    name=reuquest.data.get('name')
    pwd=reuquest.data.get('pwd')
    user=models.User.objects.filter(username=name,password=pwd).first()
    if user:
    token=get_token(user.pk)
    # models.UserToken.objects.update_or_create(user=user,defaults={'token':token})
    back_msg['status']='1000'
    back_msg['msg']='登录成功'
    back_msg['token']=token
    else:
    back_msg['msg'] = '用户名或密码错误'
    except Exception as e:
    back_msg['msg']=str(e)
    return Response(back_msg) from rest_framework.authentication import BaseAuthentication class TokenAuth():
    def authenticate(self, request):
    token = request.GET.get('token')
    token_obj = models.UserToken.objects.filter(token=token).first()
    if token_obj:
    return
    else:
    raise AuthenticationFailed('认证失败')
    def authenticate_header(self,request):
    pass class Course(APIView):
    authentication_classes = [TokenAuth, ] def get(self, request):
    return HttpResponse('get') def post(self, request):
    return HttpResponse('post')

总结:局部使用,只需要在视图类里加入:

authentication_classes = [TokenAuth, ]

全局使用

全局使用需要在setting.py中进行配置

REST_FRAMEWORK={
"DEFAULT_AUTHENTICATION_CLASSES":["app01.service.auth.Authentication",]
}

源码分析

# Request对象的user方法

@property
def user(self):
"""
Returns the user associated with the current request, as authenticated by the authentication classes provided to the request.
"""
if not hasattr(self, '_user'):
with wrap_attributeerrors():
self._authenticate()
return self._user def _authenticate(self):
"""
Attempt to authenticate the request using each authentication instance
in turn.
"""
for authenticator in self.authenticators:
try:
user_auth_tuple = authenticator.authenticate(self)
except exceptions.APIException:
self._not_authenticated()
raise if user_auth_tuple is not None:
self._authenticator = authenticator
self.user, self.auth = user_auth_tuple
return self._not_authenticated() def _not_authenticated(self):
"""
Set authenticator, user & authtoken representing an unauthenticated request.
Defaults are None, AnonymousUser & None.
"""
self._authenticator = None
if api_settings.UNAUTHENTICATED_USER:
self.user = api_settings.UNAUTHENTICATED_USER()
else:
self.user = None if api_settings.UNAUTHENTICATED_TOKEN:
self.auth = api_settings.UNAUTHENTICATED_TOKEN
()
else:
self.auth = None
# self.authenticators
def get_authenticators(self):
return [auth() for auth in self.authentication_classes]

认证类使用顺序:先用视图类中的验证类,再用settings里配置的验证类,最后用默认的验证类

drf--认证组件的更多相关文章

  1. drf认证组件、权限组件、jwt认证、签发、jwt框架使用

    目录 一.注册接口 urls.py views.py serializers.py 二.登录接口 三.用户中心接口(权限校验) urls.py views.py serializers.py 四.图书 ...

  2. DRF认证组件

    1.DRF认证组件之视图注册用法(自定义简单使用) settings.py配置 INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.a ...

  3. drf认证组件(介绍)、权限组件(介绍)、jwt认证、签发、jwt框架使用

    目录 一.注册接口 urls.py views.py serializers.py 二.登录接口 三.用户中心接口(权限校验) urls.py views.py serializers.py 四.图书 ...

  4. DRF认证组件流程分析

    视图函数中加上认证功能,流程见下图 import hashlib import time def get_random(name): md = hashlib.md5() md.update(byte ...

  5. Django框架之DRF 认证组件源码分析、权限组件源码分析、频率组件源码分析

    认证组件 权限组件 频率组件

  6. DRF框架(六)——三大认证组件之认证组件、权限组件

    drf认证组件 用户信息表 from django.db import models from django.contrib.auth.models import AbstractUser class ...

  7. 【DRF认证】

    目录 认证组件的详细用法 本文详细讲述了DRF认证组件的原理以及用法. @ * 源码剖析** 上一篇博客讲解DRF版本的时候我们都知道了,在dispatch方法里执行了initial方法来初始化我们的 ...

  8. drf视图组件、认证组件

    视图组件 1.基本视图 url(r'^publish/$', views.PublishView.as_view()), url(r'^publish/(?P<pk>\d+)/$', vi ...

  9. DRF框架之认证组件用法(第四天)

    1. 什么是drf 框架的认证组件: auth 就等于是jango中的Auth模块,Auth是自带session信息,但是 drf的认证组件可以自定义token携带过去,去判断用的 2.如何实现认证呢 ...

  10. DRF 之 认证组件

    1.认证的作用? 我们知道,当我们在网站上登陆之后,就会有自己的个人中心,之类的可以对自己的信息进行修改.但是http请求又是无状态的,所以导致我们每次请求都是一个新的请求,服务端每次都需要对请求进行 ...

随机推荐

  1. HTML元素脱离文档流的三种方法

    一.什么是文档流? 将窗体自上而下分成一行一行,并在每行中按从左至右依次排放元素,称为文档流,也称为普通流. 这个应该不难理解,HTML中全部元素都是盒模型,盒模型占用一定的空间,依次排放在HTML中 ...

  2. Linux中的关机操作

    shutdown -h now //马上停止服务进行关机 shutdown -h  12:00 .//在12点后进行关机 shutdown -h +10   //在10分钟后进行关机 shutdown ...

  3. nexus pip proxy config

    nexus pip proxy config config for linux touch config touch ~/.pip/pip.conf content [global] index-ur ...

  4. ESA2GJK1DH1K开发教程: 来看看最新整理的整个开发板的教程大纲吧

    项目开发:教程大纲(测试板型号:ESA2GJK1DH1K) 购买链接: https://item.taobao.com/item.htm?spm=a2oq0.12575281.0.0.25911deb ...

  5. Python 的AES加密与解密

    AES加密方式有五种:ECB, CBC, CTR, CFB, OFB 从安全性角度推荐CBC加密方法,本文介绍了CBC,ECB两种加密方法的python实现 python 在 Windows下使用AE ...

  6. c博客作业-数组

    0. 1.本章学习总结 1.1学习内容总结 1.1.1一维数组 1.一般定义形式:类型名 数组名 [数组长度];类型名指定数组中每个元素的类型,数组名是数组变量的名称,是一个合法的标识符,数组长度是一 ...

  7. 设置 npm 源为淘宝镜像

    淘宝 npm 网址 https://npm.taobao.org/ 修改 npm config set registry http://registry.npm.taobao.org/ 还原 npm ...

  8. Maven 基本概念——根目录、项目创建、坐标

     1. MavenProjectRoot(项目根目录)   |----src   |     |----main   |     |         |----java ——存放项目的.java文件  ...

  9. suse12.2构建samba

    1:添加用户 useradd wangjunhui -d /home/wangjunhuipasswd wangjunhui 2:配置samba smbpasswd -a wangjunhui vi ...

  10. java web开发入门二(struts)基于eclispe

    JavaBean JavaBean,  咖啡豆. JavaBean是一种开发规范,可以说是一种技术. JavaBean就是一个普通的java类.只有符合以下规定才能称之为javabean: 1)必须提 ...