前端开发:关于鉴权的使用总结

news2025/2/26 6:35:55

前言

前端开发过程中,关于鉴权(权限的控制)是非常重要的内容,尤其是前端和后端之间数据传递时候的请求鉴权校验。前端鉴权的本质就是控制前端视图层的显示和前端向后台所发送的请求,但是只有前端鉴权,没有后端鉴权是非常不合理的,前端的鉴权只是起到一个锦上添花的作用,虽然在前后端开发中程序的鉴权核心是在后端,但是前端鉴权也是很有必要的。那么本篇博文就来分享一下前端关于鉴权的使用总结,记录一下,方便查阅使用。

前端鉴权定义

前端鉴权,也叫前端身份认证,指的是验证用户是否具有系统的访问权限。前端鉴权其实就是控制前端视图层的展示和前端所有发送的请求,就像我们去坐飞机的登机牌(对应的标识,在一定的时间范围)。

前端鉴权认证方式

前端鉴权的认证方式常用的主要有四种:cookie-session、Token、OAuth、HTTP Basic Authentication。

 

1、cookie-session方式

cookie-session方式较老的系统里面比较常见,它只适用于web系统。由于HTTP协议是无状态的,所以要解决共享信息的问题必须要用其他的方式来解决,这就有了会话ID(即session id),服务器为每个用户生成一个不一样的随机字符串(session id),一份存在服务器,一份以cookie的形式写给浏览器。这样,浏览器每次向服务器发起HTTP请求的时候,携带这个session id回传给服务器,服务器就能区分那个是那个了。

2、Token方式

Token是目前市面上主流用的方式,主要适用于app鉴权,微信开发平台access token也是差不多类似的思路。Token 其实是服务器生成的一串随机字符串或者一个 json 串,用于客户端进行资源请求的令牌。当调用登录接口之后,服务端返回给前端一个 Token ,之后存储Token 到本地,每次前端请求接口的时候,都需要在请求头里带上 Token 信息,并且 Token 可以在服务端设置过期时间,如果Token 过期之后,前端在请求失败回调返回code码之后,重新跳转到登录页进行重新鉴权。

3、OAuth方式

OAuth方式是个趋势,现在想要推广应用都先要接入微博、微信、QQ等登录,降低用户使用门槛,特别是微信渠道的应用,都是接入了微信开发授权登录。

4、HTTP Basic Authentication方式

HTTP Basic Authentication方式用的较少,平常FTP登录是用的这种方式,只适用于在企业内网系统。

前端权限的意义

  1. 减少/降低非法操作的可能性。比如页面上的一个操作按钮,通过控制台来改变它的属性,如果当前用户没有权限控制,虽然点击了,但是不会有操作以后的效果;如果有权限控制的话,没有权限的用户,可以让它隐藏,用户就看不到这个按钮的存在。
  2. 尽可能排除减少不必要的请求,减轻服务器压力。不具备权限的请求,就应该不需要发送。
  3. 提高用户体验。

前端鉴权的使用思路

这里分享一下前端鉴权的使用思路,大概分为以下几步:

1、首先制作一个404提示界面,然后在路由最后面添加如下代码:

{

  path:"*", //如果前面的路由没有匹配到时,所有的错误路由都会跳转到404提示界面

  component: 404Error

}

2、在做下面所有操作的时候,都需要后台返回一个登录的数据,一般在登录页面的登录按钮中触发的点击事件,获取到后台从数据库中读取到的用户信息,从当中找出相应的数据来实现。

3、菜单控制,菜单主要是导航栏的显示,由于登录数据获取是在login界面中,而导航栏显示组件在其他组件中,所以要通过传递数据来拿到登录数据,一般是通过数据本地存储来做,但是要在最后退出登录的时候清楚本地存储的数据。

4、界面的控制,如果用户没有登录,手动在地址栏输入管理界面地址,就需要跳转到登录界面;如果用户登录之后,但是手动输入非权限内的地址,应该跳转到404提示界面或者提示没有权限。

5、使用拦截器判断用户是否登录,判断token是否存在,也就是在登录方法里面做处理。登录的代码如下所示:

login(){

 this.$refs.loginForm.date(

 async login=>{

 if(!login) return

 const {data:res} =await this.$http.post("login",this.loginFrom)

 if(res.status !=200) return this.$message.error('登录失败')

 this.$store.commit('setRight',res.right)

 this.$store.commit('setUser',res.data.user)

 //将token存储到本地中

 sessionStroage.setItem('token',res.data.token)

 this.$router.push('./home')

 }

 )

}

6、登录之后再来判断进行跳转到逻辑,通常是使用导航守卫,由于可以伪造tokenrouter 路由管理下面的代码如下所示:

//在常规路由下面添加一个方法

router.beforeEach((to,from,next)=>{

if(to.path ==='./login'){next()} //跳转到登录界面不拦截

else{

//这里是进入其他界面,首先判断有无token没有跳转到登录界面,有的话就执行 const   

  token=sessionStroage.getItem('token')

if(!token){next('./login')}

else{next()}

}

})

7、动态路由的使用,由于某些角色没有权限,所以他就不应该有这个路由,更不能地址栏输入。首先把子路由,也就是

权限不够人的路由注释掉,路由组件的代码如下所示:

import store from '@/store'

Vue.use(Router)

const userRule={path:'./user',component:user} //超级管理员的用户信息界面

const adminRule = {path:’./admin’,component:admin} //二级管理员

//将路由写成一个对象,只要判断这个对象中有没有其中的二级路由就行了

const ruleMapping = {

'user': userRule,

'admin': adminRule

}

//应该在前面定义,后面动态添加

export function initDynamicRoutes(){

//定义一个方法将其导出,根据二级权限,对路由规则进行动态的添加

const currentRoutes = router.options.routes

const right = store.state.right

right.forEach(item => {

item.children.forEach(item =>

//item就是二级权限

{ currentRoutes[2].children.push(ruleMapping[item.path])

})

})

router.addRoutes(currentRoutes) //router.addRoutes方法,将修改过后的路由对象重新添加router中

}

8、登录界面的逻辑,具体代码如下所示:

import {initDynamicRoutes} from '@/routes'//将方法导入进来

login(){

//登录成功之后,根据用户所具备的权限动态添加路由规则

initDynamicRoutes()

}

需要在app.vue 当中添加如下代码:

import { initDynamicRoutes } from '@/router.js'

export default {

name: 'app',

created() { //最开始就重新加载路由规则

initDynamicRoutes()

}

}

9、请求和响应的控制,如果用户通过非常规操作手动在调试器当中将禁用的按钮变成启用的状态,此时发出的请求应该被拦截。

拓展一:前端带参数传给后端的常用方式

前端带参数传给后端的常用方式有:①查询参数?后面携带的;②路径参数:后面携带的,也就是query的;③请求头携带;④请求体携带。

1、写法

axios({

   method:'PUT',



  //路径参数

   url:'/product/'+10,



  //查询参数(axios比较特殊)

   params:{

      page:1,

      num:10,

  },



//请求头

  headers:{

       'X-Hahaha':'666',

  },



//请求体

  data:{

     name:11,

     phone:13022445588,

  },

})

2、结果

完整的url:PUT /product/10?page=1&num=10

后端获取到请求头参数:request.headers['x-hahaha']

后端获取到请求体参数:request.body.name //1

后端获取到查询参数:request.query.page //1

后端获取到路径参数:request.params.id //10

拓展二:请求状态码

1、常见请求状态码有:

200 - 请求成功

301 - 资源(网页等)被永久转移到其它URL

304 - 客户端通常会缓存访问过的资源,通过提供一个头信息指出客户端希望只返回在指定日期之后修改的资源

404 - 请求的资源(网页等)不存在

500 - 内部服务器错误

2、状态码区段释义:

1**开头:信息提示。这些状态代码表示临时的响应,客户端在收到常规响应之前,需要准备接收一个或多个 1* * 响应。

2**开头 :请求成功。表示成功处理了请求的状态代码。

3** 开头 :请求被重定向。表示要完成请求,需要进一步操作 ,一般这些状态代码用来重定向的。

4**开头 :请求错误。这些状态代码表示请求可能出错,妨碍了服务器的处理,比如请求链接不正确报错404

5**开头:服务器错误。这些状态代码表示服务器在尝试处理请求时发生内部错误,一般是服务器本身的错误,而不是请求出错。

最后

通过本文关于鉴权(权限的控制)的方法的介绍,如果认真阅读并且实践示例,应该会很好的掌握这些知识点,尤其是前端和后端之间数据传递时候的请求鉴权校验,但是只有前端鉴权,没有后端鉴权是非常不合理的,前端的鉴权只是起到一个锦上添花的作用,虽然在前后端开发中程序的鉴权核心是在后端,但是前端鉴权也是很有必要的,这是一篇值得阅读的文章,尤其是对于前端鉴权还不是太熟练的开发者来说甚为重要,重要性就不在赘述。欢迎关注,一起交流,共同进步。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/118291.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MyGDI+

文章目录[toc]界面设计Form窗口MenuStrip画笔其他选项界面美化整体框架设计DataStructureCPointPolylinePolygonSingletonGraphicFunctionForm事件处理成员变量事件处理总结界面设计 Form窗口 首先添加MenuStrip控件,随后在Form窗口属性界面根据个人爱好修改其图标…

请收下这份数字IC面试超强攻略!(内附大厂面试题目)

2022年马上就要结束了,想必今年有很多同学也已经感受到IC行业的门槛在不断提升,这一点尤其在面试的过程中感受明显。 前两年的时候,面试官有可能问一些比较简单的问题就能通过,今年可就没那么简单了,必须提前做好相关…

SQL的模型类

在Qt的数据库中,除了QSqlQuery访问数据库,还可以使用QSqlQueryModel,QSqlTableModel和QSqlRelationalTableModel,这三个类是从QAbstractTableModel派生下来的,可以很直观的查看数据库的数据 QSqlQueryModel 提供一个…

Educational Codeforces Round 98 (Rated for Div. 2) D. Radio Towers

翻译: 坐标线上有𝑛2个城镇,编号从0到𝑛1。𝑖-th镇位于𝑖点。 你在城镇1、2、…、𝑛以12的概率建造一个无线电塔(这些事件是独立的)。之后,您希望将每个塔上的信号功率设置为从1到…

C/C++开发工具CLion v2022.3全新发布——支持C++ 20

CLion是一款专为开发C及C所设计的跨平台IDE。它是以IntelliJ为基础设计的,包含了许多智能功能来提高开发人员的生产力。这种强大的IDE帮助开发人员在Linux、OS X和Windows上来开发C/C,同时它还使用智能编辑器来提高代码质量、自动代码重构并且深度整合CM…

C++ 当基类为抽象类时如何析构派生类

前言:本教程不涉及基础,稍微了解一下Cvirtual多态的知识就可以了,不了解的话可以先去看一下菜鸟教程,也可以看我往期的文章《virtual》、《虚函数表》 多态分为静态多态和动态多态 静态多态:也成为编译时的多态&#…

使用Word模板导出Word后,表格后面产生空白页

目录 背景 解决 参考 背景 项目中有导出Word功能,其实现逻辑是先整理一个Word文档,里面使用占位符;代码读取Word文档,然后替换占位符。 但出现这样的问题:填充某个表格后,表格后面出现了空白页。 解决 调查发现是段落标记导致的,如何显示段落标记?File -> Op…

生成对抗:DCGAN

DCGAN简介 Generative Adversarial Networks(GANs),GANs有两个模型组成,一个是生成器,用于训练生成假的数据,另一个是判别器,用于预测生成器的输出结果。其中生成器提供训练数据给判别器,提高判别器的准确率。判别器提供生成样本的预测结果,给生成器提供…

【Java系列】小小练习——带你回顾Java基本运算符

返回主篇章         👇 【Java】才疏学浅小石Java问道之路 Java小练习1. 练习一1.1 题目1.2 题解(附解析)2. 练习二2.1 题目2.2 题解(附解析)3. 练习三3.1 题目3.2 题解(附解析)小结1. 练习一 1.1 题目 一个三位数,将其拆分为个位、十位、百位后…

mac安装cocoapods完整步骤

一、概念理解 首先不要急着搜索终端命令,你需要明白安装 cocoapods 都需要什么环境,这对于安装途中如果遇到问题该如何解决很重要,很重要,很重要! 1、安装pods需要依赖 ruby 环境,而安装 ruby 你需要借助工…

[网鼎杯 2020 白虎组]PicDown(任意文件读取)

打开界面发现有一个get传参然后,尝试任意文件读取漏洞,/etc/passwd看一下,提示下载了一个jpg图片然后 打不开只能用 010查看一下信息 看来是猜对了,然后 如果日记没删掉可以查看历史记录 .bash_history呃呃呃差不到,那就看一下现…

Python 现代控制理论 —— 梯度下降法实现的线性回归系统

线性回归是有监督学习中的经典问题,其核心在于找到样本的多个特征与标签值之间的线性关系。样本集中的第j个样本可被表示为: 特征向量:标签值: 而线性回归系统给出权重向量: 使得该样本的预测值为: 当所有…

Python采集某网站m3u8内容,美女我来了~

前言 嗨喽,大家好呀~这里是爱看美女的茜茜呐 又到了学Python时刻~ 环境使用: Python 3.8 Pycharm 模块使用: import requests >>> pip install requests import re 正则表达式 解析数据 import json 安装python第三方模块: win R 输入 cmd 点击确…

不止一面的百变 ACE

这个时代,可谓是云原生的黄金时代。 站在这个云原生的风口,年轻一代的开发者如何看待自己所处的环境?他们眼中的云原生未来是什么样? 今天我们就将走近一位年轻的“云原生原住民”,听听他作为开发者的成长经历。 War…

【python3】9.python高阶内容(上)_基础

9.python高阶内容(上)_基础 2022.12.27 python高阶内容(上)_基础9.1 字符串的高阶玩法 9.1.1 %百分号模式 %d:整数%i:整数%s:字符%f:小数 【方式1】:前面用格式占位,后面用具体的内容 name "莫烦…

Android设计模式详解之访问者模式

前言 访问者模式是一种将数据操作与数据结构分离的设计模式; 定义:封装一些作用于某种数据结构中的各元素的操作,它可以在不改变这个数据结构的前提下定义作用于这些元素的新的操作; 使用场景: 对象结构比较稳定&a…

大厂与小厂招人的区别,看完多少有点不敢相信

前两天在头条发了一条招人的感慨,关于大厂招人和小公司招人的区别。 大厂:有影响力,有钱,能够吸引了大量的应聘者。因此,也就有了筛选的资格,比如必须985名校毕业,必须35岁以下,不能…

基于DoIP使用CANoe对ECU进行诊断测试

伴随以太网引入到车载网络中,本文分享通过常用工具CANoe怎么样对ECU进行通信以及测试。 相比在车载CAN总线,以太网又有什么与众不同之处? 1、硬件接口卡(收发器) 以往车载CAN网络较常使用的是VN 16XX 系列,在连接ECU进行通信时,除了配置波特率也要进行通道分配: 而…

7个学习UI、UX设计一定要经历的步骤

我们不是一些有才华的设计师。我们天生就有艺术天赋。后天我们学会了设计技巧。设计的根本目的是解决问题。设计是不断发现和解决问题。 有许多设计领域:UI、UX.产品设计师.平面设计师.交互设计师.信息架构师等,所以要找出你最感兴趣的设计专业。 现在让…

美颜sdk动态贴纸技术、代码分析

目前,美颜sdk动态贴纸已经成了各大直播平台主播的必备“直播伴侣”,在其他的视频拍摄场景动态贴纸的热度同样很高,本篇文章小编将为大家深度盘点一下美颜sdk动态贴纸的技术实现以及代码。 一、多终端适配 对于如今的直播平台终端来说&#x…