前端如何控制用户权限心得

首先前端是一个不安全的环境,权限的控制一定是交给后端去处理的,前端只是做按需展示即可。
前端要做的是,不让正常操作的用户发出具有权限的api。
后端要做的是,在收到权限用户不匹配的请求后不返回数据或者返回规定格式的数据。

前端来说按照颗粒度分类可以分为 路由级别和页面级别,也就是说请求发起的api可能是由页面加载触发,也可能由页面上的按钮点击触发,所以我们可以从这两方面入手,对触发权限的源头进行控制,最终要实现的目标是:

  • 路由方面:用户登录后,只会看到自己权限看到的菜单。
  • 页面方面:用户只会看到自己有权浏览的内容和组件

最后再加上请求控制作为最后一道防线,路由可能配置失误,按钮可能忘了加权限,这种时候请求控制可以用来兜底,越权请求将在前端被拦截。

实现方式

一:session 什么是session

Session:在计算机中,尤其是在网络应用中,称为“会话控制”。Session对象存储特定用户会话所需的属性及配置信息。这样,当用户在应用程序的Web页之间跳转时,存储在Session对象中的变量将不会丢失,而是在整个用户会话中一直存在下去。

我们都知道HTTP协议本身是无状态的,这与HTTP协议本来的目的是相符的,客户端只需要简单的向服务器请求下载某些文件,无论是客户端还是服务器都没有必要纪录彼此过去的行为,每一次请求之间都是独立的。那么如果我希望几个页面的请求是有关联的,比如A页面是记录用户的信息,B页面是记录用户的订单记录。我需要登录才能看到用户的信息,那我不可能A页面登录B页面再次登录,或者每次请求都带上用户名密码,因此诞生了session,从上面的描述来讲,它就是在一次会话中解决2次HTTP的请求的关联,让它们产生联系,使客户端与服务器之间保持状态,那么session是怎么让客户端与服务器之间保持状态的呢,我们需要先了解session的机制

session的机制

session并不是浏览器产生的,而是由服务端生成。
当访问服务器某个网页的时候,只要发起了http请求(包括请求html,css,img,js等等),就会在服务器端的内存里开辟一块内存,这块内存就叫做session,而这个内存是跟浏览器关联在一起的。当程序需要为某个客户端的请求创建一个session的时候,服务器首先检查这个客户端的请求里是否已包含了一个session标识 - 称为session id,如果已包含一个session id则说明以前已经为此客户端创建过session,服务器就按照session id把这个session检索出来使用,如果检索不到,就会新建一个。如果客户端请求不包含session id,则为此客户端创建一个session并且生成一个与此session相关联的session id,然后把这个session id返回给客户端,并在客户端的cookie中保存起来

前端如何控制用户权限心得
这个session id会在客户端做为临时会话的cookie保存起来
在当前打开的浏览器窗口中的任何请求都会自动的带上这个cookie,比如用户提交登录请求时带上了这个cookie,那么在用户查看订单记录的时候也会带上这个cookie,服务器通过这个cookie就能获取到session id的值,就能判断发送这个请求的是哪个用户,然后返回正确的数据给客户端。下面这张图很好的诠释了这个过程:
前端如何控制用户权限心得
缺点:.每次认证用户发起请求时,服务器需要去创建一个记录来存储信息。当越来越多的用户发请求时,内存的开销也会不断增加。

二:token机制 什么是token及怎样生成token

基于Token的身份验证是无状态的,我们不将用户信息存在服务器中。这种概念解决了在服务端存储信息时的许多问题。NoSession意味着你的程序可以根据需要去增减机器,而不用去担心用户是否登录。
基于Token的身份验证的过程如下:
1.用户通过用户名和密码发送请求。

2.服务器端程序验证。

3.服务器端程序返回一个带签名的token 给客户端。

4.客户端储存token,并且每次访问API都携带Token到服务器端的。

5.服务端验证token,校验成功则返回请求数据,校验失败则返回错误码。
前端如何控制用户权限心得

项目中使用

1:页面按钮层级的直接使用:
一个页面会有新增,删除,编辑等等按钮。不同用户应该是有不同操作权限的。
我们不妨定义权限码 0:不可见 1:不可编辑 2:可编辑
我们提前和后端约定好按钮的名字,后端会返回一个按钮权限列表。
2:路由级别:
前端如何控制用户权限心得

  • 1.前端使用用户名跟密码请求首次登录
  • 2.后服务端收到请求,去验证用户名与密码是否正确
  • 3.验证成功后,服务端会根据用户id、用户名、定义好的秘钥、过期时间生成一个 Token,再把这个 Token 发送给前端
  • 4.前端收到 返回的Token ,把它存储起来,比如放在 Cookie 里或者 Local Storage
  • 5.前端每次路由跳转,判断 localStroage 有无 token ,没有则跳转到登录页。有则请求获取用户信息,改变登录状态;
  • 6.前端每次向服务端请求资源的时候需要在请求头里携带服务端签发的Token
  • 7.服务端收到请求,然后去验证前端请求里面带着的 Token。没有或者 token 过期,返回401。如果验证成功,就向前端返回请求的数据。
  • 8.前端得到 401 状态码,重定向到登录页面。

https://www.jianshu.com/p/a32634a5170c