Vue Element Admin 登陆认证
使用的是Vue Element Admin template 基础模板
1 修改 src/api/user.js
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | import request from '@/utils/request' export function login(data) { return request({ url: '/auth/' , method: 'post' , data }) } export function getInfo(token) { return request({ url: '/userInfo/' , method: 'post' , data:{ 'token' :token} }) } export function logout() { return request({ url: '/logout/' , method: 'post' }) } |
2 修改src/store/modules/user.js
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 | import { login, logout, getInfo } from '@/api/user' import { getToken, setToken, removeToken } from '@/utils/auth' import { resetRouter } from '@/router' const getDefaultState = () => { return { token: getToken(), name: '' , avatar: '' } } const state = getDefaultState() const mutations = { RESET_STATE: (state) => { Object.assign(state, getDefaultState()) }, SET_TOKEN: (state, token) => { state.token = token }, SET_NAME: (state, name) => { state.name = name }, SET_AVATAR: (state, avatar) => { state.avatar = avatar } } const actions = { // user login login({ commit }, userInfo) { const { username, password } = userInfo return new Promise((resolve, reject) => { login({ username: username.trim(), password: password }).then(response => { const { data } = response.data commit( 'SET_TOKEN' , data.token) setToken(data.token) resolve() }).catch(error => { reject(error) }) }) }, // get user info getInfo({ commit, state }) { return new Promise((resolve, reject) => { getInfo(state.token).then(response => { const { data } = response.data if (!data) { return reject( 'Verification failed, please Login again.' ) } const { name, avatar } = data commit( 'SET_NAME' , name) commit( 'SET_AVATAR' , avatar) resolve(data) }).catch(error => { reject(error) }) }) }, // user logout logout({ commit, state }) { return new Promise((resolve, reject) => { logout(state.token).then(() => { removeToken() // must remove token first resetRouter() commit( 'RESET_STATE' ) resolve() }).catch(error => { reject(error) }) }) }, // remove token resetToken({ commit }) { return new Promise(resolve => { removeToken() // must remove token first commit( 'RESET_STATE' ) resolve() }) } } export default { namespaced: true, state, mutations, actions } |
3,修改src/utils/request.js
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | import axios from 'axios' import { MessageBox, Message } from 'element-ui' import store from '@/store' import { getToken } from '@/utils/auth' // create an axios instance const service = axios.create({ baseURL: process.env.VUE_APP_BASE_URL, // url = base url + request url // withCredentials: true, // send cookies when cross-domain requests timeout: 5000 // request timeout }) // request interceptor service.interceptors.request.use( config => { // do something before request is sent if (store.getters.token) { // let each request carry token // ['X-Token'] is a custom headers key // please modify it according to the actual situation //把Token信息加到请求头部 config.headers[ 'X-Token' ] = getToken() } return config }, error => { // do something with request error console.log(error) // for debug return Promise.reject(error) } ) export default service |
4 配置后端接口
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 | from django.http import JsonResponse from rest_framework.views import APIView from api import models from api.logger import logger def create_token(user): import hashlib import time #获取当前时间戳用作随机字符串 ctime = str (time.time()) m = hashlib.md5(bytes(user,encoding = 'utf-8' )) m.update(bytes(ctime,encoding = 'utf-8' )) return m.hexdigest() class AuthView(APIView): """ 用户登陆认证,生成并保存token """ authentication_classes = [] def post( self ,request, * args, * * kwargs): ret = { "code" : 200 , "status" : "success" , "data" : { "token" : None }} username = request.data.get( 'username' ) password = request.data.get( 'password' ) try : obj = models.Users.objects. filter (username = username,password = password).first() if obj: #为用户创建token,如果已存在则更新,否则创建 token = create_token(username) models.UserToken.objects.update_or_create(user = obj,defaults = { 'token' :token}) ret[ 'status' ] = 'success' ret[ 'data' ][ 'token' ] = token else : ret[ 'code' ] = 401 ret[ 'status' ] = '用户名或密码错误' except Exception as e: logger.error(e) ret[ 'code' ] = 400 ret[ 'status' ] = 'error' return JsonResponse(ret) class AuthInfoView(APIView): """ 获取登陆用户信息 """ def post( self ,request, * args, * * kwargs): ret = { "code" : 200 , "status" : "success" , "data" :{ "roles" :[], "introduction" : '', "avatar" : 'https://wpimg.wallstcn.com/f778738c-e4f8-4870-b634-56703b4acafe.gif' , "name" : ''}} token = request.data.get( 'token' ) try : obj = models.UserToken.objects. filter (token = token).first() if obj: ret[ 'status' ] = 'success' ret[ 'data' ][ 'name' ] = obj.user.username for i in obj.user.roles. all (): ret[ 'data' ][ 'roles' ].append(i.title) else : ret[ 'code' ] = 401 ret[ 'status' ] = '认证失败' except Exception as e: logger.error(e) ret[ 'code' ] = 400 ret[ 'status' ] = 'error' return JsonResponse(ret) class LogoutView(APIView): """ 退出登陆 """ def post( self ,request, * args, * * kwargs): ret = { "code" : 200 , "status" : "success" , "data" : 'success' } token = request.META.get( 'HTTP_X_TOKEN' ) try : obj = models.UserToken.objects. filter (token = token).first() if obj: obj.delete() else : ret[ 'code' ] = 401 ret[ 'status' ] = '退出失败' except Exception as e: logger.error(e) ret[ 'code' ] = 400 ret[ 'status' ] = 'error' return JsonResponse(ret) |
5 后端token认证
1 2 3 4 5 6 7 8 9 10 11 12 | from rest_framework import exceptions from rest_framework.authentication import BaseAuthentication from api import models class Authentication(BaseAuthentication): def authenticate( self , request): #获取请求头部的token token = request.META.get( 'HTTP_X_TOKEN' ) token_obj = models.UserToken.objects. filter (token = token).first() if not token_obj: raise exceptions.AuthenticationFailed( '用户认证失败' ) return (token_obj.user,token_obj) |
ps:携带token认证时出现了跨域问题(中间件配置)
1 2 3 4 5 6 7 8 9 10 11 12 13 | from django.utils.deprecation import MiddlewareMixin class CORSMiddleware(MiddlewareMixin): def process_response( self , request, response): # 添加响应头 # 允许你的域名来获取我的数据 # 允许所有的域名来获取数据 response[ 'Access-Control-Allow-Origin' ] = '*' # 允许你携带Content-Type请求头 如果要多的用逗号,隔开 response[ 'Access-Control-Allow-Headers' ] = '*' return response |
配置setting
1 2 3 | MIDDLEWARE = [ 'api.cors.CORSMiddleware' , #跨域请求CORS ] |
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET 原生驾驭 AI 新基建实战系列:向量数据库的应用与畅想
· 从问题排查到源码分析:ActiveMQ消费端频繁日志刷屏的秘密
· 一次Java后端服务间歇性响应慢的问题排查记录
· dotnet 源代码生成器分析器入门
· ASP.NET Core 模型验证消息的本地化新姿势
· 开发的设计和重构,为开发效率服务
· 从零开始开发一个 MCP Server!
· ThreeJs-16智慧城市项目(重磅以及未来发展ai)
· .NET 原生驾驭 AI 新基建实战系列(一):向量数据库的应用与畅想
· Ai满嘴顺口溜,想考研?浪费我几个小时