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. Django实战(一)-----用户登录与注册系统1(环境搭建)

    一.背景 学了一段时间的语法,总感觉入不了门,所以找点小项目练练手,项目来自网络. 二.创建虚拟环境,并安装Django 使用Python中的virtualenv搭建一个mysite_env全新的环境 ...

  2. Navicat for MySQL 12中文版 破解流程

    1.下载  Keygen_Patch 软件 下载地址 pass: saxz 2.启动 Keygen_Patch 软件 3.提示破解成功了,先别着急 4.运行 Navica  软件,输入注册码 5.断网 ...

  3. SpringSecurityOAuth使用JWT Token实现SSO单点登录

    ⒈认证服务器 1.添加pom依赖 <dependency> <groupId>org.springframework.boot</groupId> <arti ...

  4. Intel Xeon E5-2620 v4参数

    基本参数 CPU系列 Xeon E5 v4系列 制作工艺 14纳米 核心代号 Broadwell 性能参数 核心数量 八核心 线程数量 十六线程 CPU主频 2.1GHz 动态加速频率 3GHz L3 ...

  5. hibernate框架学习之数据查询(HQL)

    lHibernate共提供5种查询方式 •OID数据查询方式 •HQL数据查询方式 •QBC数据查询方式 •本地SQL查询方式 •OGN数据查询方式 OID数据查询方式 l前提:已经获取到了对象的OI ...

  6. codeforces411div.2

    每日CF: 411div2 Solved A CodeForces 805A Fake NP Solved B CodeForces 805B 3-palindrome Solved C CodeFo ...

  7. jquery $.trim()去除字符串空格

    语法jQuery.trim()函数用于去除字符串两端的空白字符. 作用该函数可以去除字符串开始和末尾两端的空白字符(直到遇到第一个非空白字符串为止).它会清除包括换行符.空格.制表符等常见的空白字符. ...

  8. 添加struts2本地dtd限制

    将源码保重的struts-2.1.7.dtd文件拷贝到dtds文件夹中 打开eclipse配置文件window/preferences,搜索xml找到XML Catalog

  9. python 基础 列表

    1.列表list()方法用于将元组转换为列表,[]组成,中间可以放很多内容,每一项使用逗号隔开,列表中可以放置任何数据类型的数据.注:元组与列表是非常类似的,区别在于元组的元素值不能修改,元组是放括号 ...

  10. HTTP连接池

    <context:property-placeholder location="classpath:conf/framework/httpclient.properties" ...