Vue结合Django-Rest-Frameword结合实现登录认证(一)
作者:小土豆biubiubiu
博客园:https://www.cnblogs.com/HouJiao/
掘金:https://juejin.im/user/2436173500265335
微信公众号:土豆妈的碎碎念(扫码关注,一起吸猫,一起听故事,一起学习前端技术)
作者文章的内容均来源于自己的实践,如果觉得有帮助到你的话,可以点赞️给个鼓励或留下宝贵意见
前言
最近需要做一个登录认证
的功能,所以想将整个的过程做一个记录,方便以后回头查看,同时希望给我遇到同样问题的同学一些参考。
因为认证是后端的功能,所以我这个不专业的前端在实现这个功能的时候不会深究太多。所以在记录的过程中没有过多的原理,着重记录实现过程和这个过程中遇到的问题以及解决方案。
如果对登录这块前后端流程原理不太懂的,可以先做一点功课,或者直接看我的整个操作和结果,看完之后会从结果和现象出发,在去理解学习登录认证原理就会更容易。
初始的环境介绍
前端框架
框架:Vue
HTTP库:axios
后端项目
后端框架:基于python
的django
框架
WEB API:rest-framework
服务器: centos
数据库:PostgreSQL
python版本:2.7.5
django版本:1.10.1
关于后端数据库的一些说明
数据库使用的是PostgreSQL
,并且已经对数据库表进行了同步,命令为:python manage.py migrate
。
数据库进行同步以后,会生成10
相关的数据表。
需要关注的就是auth_user
表这个表,它是django
框架生成的用户表,后面就使用这个表保存用户的信息。
我们查看一下这个表结构。
表里面暂时没有什么数据。
接着我们来创建一个用户,用于后期的登录测试:python manage.py createsuperuser
用户创建成功,此时在去查询数据表,就有一条用户信息了。
接下来就是登录验证的实现了。
后端Django项目配置
Django登录认证配置
首先我们需要在setting.py
文件的INSTALLED_APPS
配置登录认证的APP
。
INSTALLED_APPS = [
...
'rest_framework.authtoken'
]
设置全局的认证方案
接着在setting.py
中配置全局身份认证方案。
# 设置全局身份认证方案
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': (
'rest_framework.authentication.TokenAuthentication', # token认证
)
}
数据库同步
上面的配置完成需要进行数据库同步:python manage.py migrate
在此查看数据库:
发现会多出来一个名为authtoken_token
的数据表,这个表就是和用户认证相关的数据表。
简单测试
我们已经配置好了全局的认证方式,那按道理来说,现在任意访问后端的某个API
就会出现为HTTP 401未经授权
这样的错误,那我们来试一试。
那结果发现请求还是可以正常发出。
这块在网上搜索了很久,看到有网友说关于setting
设置的全局身份认证方案
配置有问题,正确的配置是
# 设置全局身份认证方案
REST_FRAMEWORK = {
'DEFAULT_PERMISSION_CLASSES': (
'rest_framework.permissions.IsAuthenticated',
),
'DEFAULT_AUTHENTICATION_CLASSES': (
'rest_framework.authentication.TokenAuthentication', # token认证
)
}
DEFAULT_PERMISSION_CLASSES
是关于用户的权限配置,如果没有配置该项的话就是允许用户无限制访问,不管我们的请求是被认证或未认证的。
这块可以看 官方文档 的说明
那加上这个认证以后呢,在去请求前面的API
。
发现这次终于有反应了,服务器端返回了401
,就是用户认证失败。
经过一阵思考后的再次测试
那接着我想起前面新增的IsAuthenticated
授权配置,所以将setting
进行了修改。
# 设置全局身份认证方案
REST_FRAMEWORK = {
'DEFAULT_PERMISSION_CLASSES': (
'rest_framework.permissions.IsAuthenticated',
),
# 'DEFAULT_AUTHENTICATION_CLASSES': (
# 'rest_framework.authentication.TokenAuthentication', # token认证
# )
}
即注释了全局的用户认证
,保留了权限认证
,测试一下这个全局的授权配置
会对请求产生什么影响。
我们发现这条API
返回了403
,也就是访问的权限出现了问题。
那不管怎么样,在单独配置TokenAuthentication
的情况下确实无法生效,而且官方文档也明确说明:如果没有配置DEFAULT_PERMISSION_CLASSES就是允许用户无限制访问,不管我们的请求是被认证或未认证的。
所以如果需要进行用户认证,那必须的也配上权限验证,用户认证才会生效。
这个仅仅是自己的一个尝试
后端Django项目实现登录API
接着我们来实现后端的登录接口
创建一个新的app
django-admin startapp userAuth
在views.py中编写登录逻辑
# -*- coding: utf-8 -*-
# Create your views here.
from django.contrib import auth
from rest_framework.permissions import AllowAny
from rest_framework.authtoken.models import Token
from rest_framework.response import Response
from rest_framework.decorators import api_view, authentication_classes, permission_classes
@api_view(['POST'])
@permission_classes((AllowAny,))
@authentication_classes(())
def login(request):
"""登录"""
result = True
errorInfo = u''
detail = {}
data = request.data
username = data.get('username')
password = data.get('password')
# 调用django进行用户认证
# 验证成功 user返回<class 'django.contrib.auth.models.User'>
# 验证失败 user返回None
user = auth.authenticate(username=username, password=password)
print "user",user
if user == None:
result = False
errorInfo = u'用户名或密码错误'
return Response({"result": result, "detail": detail, "errorInfo": errorInfo})
# 用户名和密码验证成功
# 获取用户的token 如果没有token ,表示时用户首次登录,则进行创建,并且返回token
try:
tokenObj = Token.objects.get(user_id=user.id)
except Exception as e:
# token 不存在 说明是首次登录
tokenObj = Token.objects.create(user=user, token=token)
# 获取token字符串
token = tokenObj.key
return Response({"result": result, "detail": {'token': token}, "errorInfo": errorInfo})
那登录的简单代码逻辑就写好了。
在这之前呢,我们先看下前面生成的关于用户认证的数据表authtoken_token
。
暂时是没有任何记录,然后在产品的登录界面输入用户名和密码。
这里的用户名和密码就是前面使用
python manage.py createsuperuser
命令创建的admin
账户
因为是首次登录,因此为该用户创建token
,即authtoken_token
会产生一条记录。
这里给大家看一看我登录成功以后的authtoken_token
数据表。
前端关于登录的逻辑处理
最后就是关于前端vue
处的逻辑,我们先看一下登录页面的methods
逻辑。
login: function(){
axios.post(url, this.loginForm).then(response =>{
const {result, detail, errorInfo} = response.data;
if(result == true){
// 登录成功
// 设置token
localStorage.setItem('token', detail.token);
// 跳转页面
this.$router.push('/certMake');
}else{
this.$message({
showClose: true,
message: errorInfo,
type: 'error'
});
}
});
}
可以看到登录成功以后我使用localStorage
将token
进行本地存储。
接着我们需要在访问其他API
时将这个token
设置到请求头部。
在这之前呢,我们先看一下API
没有添加token
时的结果。
然后将token
的信息添加到请求头。
// 别的模块的请求
getCertList: function(){
const url = '/api/cert/certManage/certList';
// 从localStorage获取到登录时保持的token
const auth = 'Token ' + localStorage.getItem('token');
const header = {'Authorization':auth}
axios.get(url, {'headers': header}).then(response =>{
console.log(response.data);
const {result, detail, errorInfo} = response.data;
if(result == true){
this.certList = detail.certList;
}else{
this.$message({
showClose: true,
message: errorInfo,
type: 'error'
});
}
});
}
然后在重新请求上面的API。
可以看到请求头部已经添加上了token
,而且响应的状态码也是200
。
那说明我们的登录页面已经成功啦。
结语
那本篇文章是不是非常简单呢(实际的我在尝试的过程中差点头秃),但是还是有些功能是需要优化改进的。
那下一篇文章的内容会梳理以下几点:
1. 优化axios:请求封装、认证信息设置的封装
2. 注销
3. 设置token过期时间
关于
作者
小土豆biubiubiu
一个努力学习的前端小菜鸟,知识是无限的。坚信只要不停下学习的脚步,总能到达自己期望的地方
同时还是一个喜欢小猫咪的人,家里有一只美短小母猫,名叫土豆
博客园
https://www.cnblogs.com/HouJiao/
掘金
https://juejin.im/user/2436173500265335
微信公众号
土豆妈的碎碎念
微信公众号的初衷是记录自己和身边的一些故事,同时会不定期更新一些技术文章
欢迎大家扫码关注,一起吸猫,一起听故事,一起学习前端技术
作者寄语
小小总结,欢迎大家指导~
参考文章
django-rest-framework官方文档#权限篇
django-rest-framework官方文档#授权认证篇
Vue结合Django-Rest-Frameword结合实现登录认证(一)的更多相关文章
- Django使用自定义的authentication登录认证
import ldap class LDAPMgmt(): def __init__(self): self.ldap_host = 'xxx' self.ldap_base_dn = 'ou=xx, ...
- Django 之装饰器实现登录认证
def check_login(func): # 自定义登录验证装饰器 def warpper(request, *args, **kwargs): is_login = request.sessio ...
- Vue结合Django-Rest-Frameword结合实现登录认证(二)
作者:小土豆biubiubiu 博客园:https://www.cnblogs.com/HouJiao/ 掘金:https://juejin.im/user/2436173500265335 微信公众 ...
- Win10环境前后端分离项目基于Vue.js+Django+Python3实现微信(wechat)扫码支付流程(2021年最新攻略)
原文转载自「刘悦的技术博客」https://v3u.cn/a_id_182 之前的一篇文章:mpvue1.0+python3.7+Django2.0.4实现微信小程序的支付功能,主要介绍了微信小程序内 ...
- 服务器部署 Vue 和 Django 项目的全记录
本篇记录我在一个全新服务器上部署 Vue 和 Django 前后端项目的全过程,内容包括服务器初始配置.安装 Django 虚拟环境.python web 服务器 uWSGI 和反向代理 Nginx ...
- vue+springboot前后端分离实现单点登录跨域问题处理
最近在做一个后台管理系统,前端是用时下火热的vue.js,后台是基于springboot的.因为后台系统没有登录功能,但是公司要求统一登录,登录认证统一使用.net项目组的认证系统.那就意味着做单点登 ...
- 关于django用户登录认证中的cookie和session
最近弄django的时候在用户登录这一块遇到了困难,网上的资料也都不完整或者存在缺陷. 写这篇文章的主要目的是对一些刚学django的新手朋友提供一些帮助.前提是你对django中的session和c ...
- 二、Django用Eclipse编写一个登录界面
一.Django用Eclipse编写一个登录界面 二.Django用Eclipse编写一个登录界面Ajax和Django交互 各软件版本:Python 2.7.14,django 1.6.11 原来已 ...
- 一、Django用Eclipse编写一个登录界面
一.Django用Eclipse编写一个登录界面 二.Django用Eclipse编写一个登录界面Ajax和Django交互 Eclipse安装Python插件和Django的步骤直接省略. 创建de ...
随机推荐
- linux下使用vim创建编辑文件
vi/vim 使用实例 如果要想用vim/vi创建一个文件(使用命令): vim test.txt 不管文件存在与否 直接输入 vi 文件名 就能够进入 vi 的一般模式 按下 i 进入输入模式( ...
- CODING 仪表盘功能正式推出,实现工作数据可视化!
CODING 仪表盘功能现已正式推出!该功能旨在用一张张统计卡片的形式,统计并展示使用 CODING 中所产生的数据.这意味着无需额外的设置,就可以收集归纳宝贵的工作数据并予之量化分析.这些海量的数据 ...
- JAVA作业—字符串操作
------------恢复内容开始------------ ------------恢复内容开始------------ ------------恢复内容开始------------ ------- ...
- python numpy数组操作2
数组的四则运算 在numpy模块中,实现四则运算的计算既可以使用运算符号,也可以使用函数,具体如下例所示: #加法运算 import numpy as npmath = np.array([98,83 ...
- [源码解析] Flink的Slot究竟是什么?(1)
[源码解析] Flink的Slot究竟是什么?(1) 目录 [源码解析] Flink的Slot究竟是什么?(1) 0x00 摘要 0x01 概述 & 问题 1.1 Fllink工作原理 1.2 ...
- python爬虫-爬取豆瓣电影数据
#!/usr/bin/python# coding=utf-8# 作者 :Y0010026# 创建时间 :2018/12/16 16:27# 文件 :spider_05.py# IDE :PyChar ...
- 不要再学 JSP 了,学 SpringBoot + Thymeleaf + Vue吧
老读者就请肆无忌惮地点赞吧,微信搜索[沉默王二]关注这个在九朝古都洛阳苟且偷生的程序员.本文 GitHub github.com/itwanger 已收录,里面还有我精心为你准备的一线大厂面试题. 读 ...
- 23种设计模式 - 对象创建(FactoryMethod - AbstractFactory - Prototype - Builder)
其他设计模式 23种设计模式(C++) 每一种都有对应理解的相关代码示例 → Git原码 ⌨ 对象创建 通过"对象创建" 模式绕开new,来避免对象创建(new)过程中所导致的紧耦 ...
- Nginx Ingress on TKE 部署最佳实践
概述 开源的 Ingress Controller 的实现使用量最大的莫过于 Nginx Ingress 了,功能强大且性能极高.Nginx Ingress 有多种部署方式,本文将介绍 Nginx I ...
- 神奇的BUG系列-01
有时候遇见一个bug,感觉就是他了 其实他也不过是你职业生涯中写的千千万万个bug中的一员 你所要做的,是放下 日子还长,bug很多,不差这一个 就此别过,分手快乐 一辈子那么长,一天没放下键盘 你就 ...