AI-认证

做登录验证

#models.py
class Users(models.Model):
user=models.CharField(max_length=32)
pwd=models.CharField(max_length=32)
type=((1,"VIP"),(2,"SVIP"),(3,"SSVIP"))
user_type=models.IntegerField(choices=type) class Usertoken(models.Model):
token=models.CharField(max_length=128)
user=models.OneToOneField("Users")
#url.py
url(r'^login/',views.LoginView.as_view()),
#views.py

from rest_framework.views import APIView
from rbac.models import *
from rest_framework.response import Response
#使用postman模拟发送post请求,后端取到request.data中的数据,进行和数据库中的
#数据做校验,如果正确返回response这个字典,里边状态码为1000。并且再数据库创建token值,token值的创建,
  如果token已经存在,则为了节省内存,使用update_or_create覆盖掉之前token,如果不存在的话,创建token值即可!;
#如果校验错误,返回错误的状态码,使用try-except;
#当异常操作时,返回异常错误; class LoginView(APIView):
"""
1000:成功
1001:用户名或者密码错误
1002:异常错误
""" def post(self, request): response = {"code": 1000, "msg": None, "user": None}
try:
print(request.data)
user = request.data.get("user")
pwd = request.data.get("pwd") user = Users.objects.filter(user=user, pwd=pwd).first()
import uuid
random_str = uuid.uuid4() #uuid用来生成随机的token字符串
if user: Usertoken.objects.update_or_create(user=user, defaults={"token": random_str})
response["user"] = user.user
response["token"] = random_str
else:
response["code"] = 1001
response["msg"] = "用户名或者密码错误"
except Exception as e:
response["code"] = 1002
response["msg"] = str(e) return Response(response)

postman效果:

提前将密码和用户名存在数据库中

发送:
{
"user":"alex",
"pwd": 123
}
返回:
{
"code": 1000,
"msg": null,
"user": "alex",
"token": "14339f3b-173b-4682-a361-cc699d84fa15"
}

数据库中效果:

做数据验证

使用token取数据库中的数据,只有登录了的用户才可以拿取数据

#url.py
url(r'^course/', views.Courseview.as_view()),
url(r'^login/', views.LoginView.as_view()),
#views.py
#一个视图类,先不走get,post方法,先走他的组件,比如parser_classes、authentication_classes等组件,
在使用auth认证时,校验合格之后才会走get方法,简而言之,只有登录了的用户(数据库存在用户信息的用户)才可以拿着token访问
数据,也就是走get和post请求!
from rest_framework.authentication import BaseAuthentication
from rest_framework.exceptions import AuthenticationFailed
class UserAuth(BaseAuthentication): def authenticate(self,request): #这个函数用来校验GET中的token和数据库中的token是否一样! token=request.query_params.get("token") #query_params里封装了self._request.GET
                             #从request中拿到token值 usertoken=Usertoken.objects.filter(token=token).first() #将GET方法中拿到的token和数据库中的做校验
if usertoken:
return usertoken.user,usertoken.token #返回认证成功的用户的,用户名和用户token
else:
raise AuthenticationFailed("认证失败!") #认证失败,使用AuthentitionFailed返回报错信息 class Courseview(APIView): authentication_classes = [UserAuth] #传入认证组件,和序列化组件只差这个东西 def get(self,request):
course_list=Course.objects.all()
cs=CourseSerializer(course_list,many=True)
print(cs.data)
return Response(cs.data) #我的序列化接口 def post(self,request): print(request.data)
cs=CourseSerializer(data=request.data)
if cs.is_valid():
Course.objects.create(**request.data)
return Response(cs.data)
else:
return Response(cs.errors)

使用postmanGET:

a.访问:http://127.0.0.1:8004/course/
返回:报错

  {
  "detail": "认证失败!"
  }

b.访问:http://127.0.0.1:8004/course/?token=74d1679d-1a2d-47b1-852b-6f2d74a13cc1
(token是在数据库中取到的)
返回:
[
{
"title": "羊肚儿",
"desc": "煮10秒钟,贼香"
},
{
"title": "宽粉",
"desc": "两盘儿,配上我妈给我调的料"
},
{
"title": "fei",
"desc": "mybro"
},
{
"title": "fei",
"desc": "mybro"
}
]

认证源码解析

其实也可以在局部给配置两个认证器,要想执行第二个认证,第一个认证执行完必须返回None,一般使用一个认证。认证配置的地方也有三个,局部、全局、默认,当配置到全局settings中时,访问所有的数据时都会自动做认证,没有登录,也就是拿不到token时,都无法访问数据。

class BookView(APIView):

             authentication_classes = [UserAuth,UserAuth2]

        self.dispatch:
# 2. 认证,权限,频率
self.initial(request, *args, **kwargs)
# 4. 实现认证
self.perform_authentication(request)
request.user
self._authenticate()
# 循环认证类的所有对象
#[UserAuth(),UserAuth2()]
for authenticator in self.authenticators:
try:
# 执行认证类的authenticate方法
# 1. 如果authenticate方法抛出异常,self._not_authenticated()执行
# 2. 有返回值,必须是元组:(request.user, request.auth)
# 3. 返回None,我不管,下一个认证来处理。使用返回None,可以做多个认证,最后一个认证返回值就行。
user_auth_tuple = authenticator.authenticate(self)
except exceptions.APIException:
self._not_authenticated()
raise if user_auth_tuple is not None: #如果返回值,那么return会终止for循环,不走第二个认证,所以要默认返回None
self._authenticator = authenticator
self.user, self.auth = user_auth_tuple
return

AI-认证的更多相关文章

  1. 践行初心|方正璞华爱心捐赠人脸识别测温系统WelComID

    近日,方正璞华向金鸡湖社区卫生服务中心捐赠了人脸识别测温系统.该设备集人员识别.体温检测等功能于一体,在人员进出的时候完成体温的检测,从而判断是否有异常人员等问题,有效节省人力成本.减少人员接触风险, ...

  2. 在AngularJS应用中实现认证授权

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAokAAAFwCAIAAABbwHY6AAAgAElEQVR4nOy9+XtcxbX3+/4H9z73jP ...

  3. MVC用户登陆验证及权限检查(Form认证)

    1.配置Web.conf,使用Form认证方式   <system.web>     <authentication mode="None" />      ...

  4. 光环国际联合阿里云推出“AI智客计划”

    2018阿里巴巴云栖大会深圳峰会3月28日.29日在大中华喜来登酒店举行,阿里云全面展示智能城市.智能汽车.智能生活.智能制造等产业创新. 3月28日下午,以"深化产教融合,科技赋能育人才& ...

  5. apigw鉴权分析(1-3)百度 AI - 鉴权方式分析

    http://ai.baidu.com/docs#/Begin/top 一.访问入口 二.鉴权方式分析 1.鉴权认证方式一 - access_token - 针对HTTP API调用者 2.鉴权认证方 ...

  6. python3下搜狗AI API实现

    1.背景 a.搜狗也发布了自己的人工智能 api,包括身份证ocr.名片ocr.文本翻译等API,初试感觉准确率一般般. b.基于python3. c.也有自己的签名生成这块,有了鹅厂的底子,相对写起 ...

  7. Azure AI 服务之文本翻译

    当下人工智能可谓是风头正劲,几乎所有的大厂都有相关的技术栈.微软在 AI 领域自然也是投入了重注,并且以 Azure 认知服务的方式投入了市场: 也就是说作为开发者我们不需要学习太多 AI 的理论知识 ...

  8. Azure AI 服务之语音识别

    笔者在前文<Azure AI 服务之文本翻译>中简单介绍了 Azure 认知服务中的文本翻译 API,通过这些简单的 REST API 调用就可以轻松地进行机器翻译.如果能在程序中简单的集 ...

  9. [转]AI+RPA 融合更智能

    本文转自:https://www.jianshu.com/p/cf25b3dfc0f0 前面已经分析过多次RPA的本质,可以参考 [脱下外衣],看看RPA机器人到底是什么?     哪些AI相关应用技 ...

  10. 2018 AI产业界大盘点

    2018  AI产业界大盘点 大事件盘点 “ 1.24——Facebook人工智能部门负责人Yann LeCun宣布卸任 Facebook人工智能研究部门(FAIR)的负责人Yann LeCun宣布卸 ...

随机推荐

  1. Windows 7 SP1无人值守自动应答文件制作

    使用U盘安装Windows系统时,很多人都会使用UltraISO工具来制作U盘启动盘,然后插入到电脑中加以安装.系统的安装过程中,需要一步一步手动选择或者输入配置,Windows是支持无人值守自动应答 ...

  2. ueditor取消文本编辑器的自动拉伸高度、宽度。

    1.首先引入富文本编辑器 <script type="text/javascript" src="<%=basePath%>js/ueditor/ued ...

  3. Go语言中的map

    map是一个集合,可以使用类似处理数组和切片的方式迭代map中的元素.但map是无序的集合.无序的原因是map的实现使用了散列表. map的创建并初始化主要是两种方式: 1.内置的make函数 2.使 ...

  4. .NET之美 第一部分C#语言基础

    第一章 类型基础 1 值类型与引用类型 CLR 支持两种类型:值类型和引用类型, C#的所有值类型均隐式派生自System.ValueType: 结构体:struct(直接派生于System.Valu ...

  5. 【转】Linux查看系统是32位还是64位方法总结

    这篇博客是总结.归纳查看Linux系统是32位还是64位的一些方法,很多内容来自网上网友的博客.本篇只是整理.梳理这方面的知识,方便自己忘记的时候随时查看. 方法1:getconf LONG_BIT ...

  6. CF449C:Jzzhu and Apples

    题意简述 给出正整数n,你要把1-n之间的正整数分成尽可能多组,使得每一组两个数的最大公约数大于1;输出能分成最多组的个数,并按任意顺序输出每组的两个数. 很妙的一道题. 首先我们考虑去处理每个质数的 ...

  7. List元素去重的方法

    l为有重复元素的列表. 方法一: 可以简单的使用l = list(set(l)) 去重 方法二: fromkeys用法:dict.fromkeys(seq[, value])),value默认是Non ...

  8. (并发编程)进程池线程池--提交任务2种方式+(异步回调)、协程--yield关键字 greenlet ,gevent模块

    一:进程池与线程池(同步,异步+回调函数)先造个池子,然后放任务为什么要用“池”:池子使用来限制并发的任务数目,限制我们的计算机在一个自己可承受的范围内去并发地执行任务池子内什么时候装进程:并发的任务 ...

  9. zabbix添加对centos系统cpu使用率百分比的监控

    cpu使用率key: system.cpu.util[] 在grafana现实的时候配置,单位选择percent(0-100),范围0-100

  10. push to origin/master was rejected错误解决方案

    idea中,发布项目到OSChina的Git中,当时按照这样的流程添加Git,然后push,提示:push to origin/master war rejected". 解决方案如下: 1 ...