成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

前端真的能做到徹底權限控制嗎?

開發 前端
有一天突然想到一個問題,web端的權限控制:真的能控制權限嗎?僅僅靠前端,能不能做到真正的權限控制?如果需要后臺配合,應該如何配合?

[[216135]]

有一天突然想到一個問題,web端的權限控制:

1.真的能控制權限嗎?

2.僅僅靠前端,能不能做到真正的權限控制?

3.如果需要后臺配合,應該如何配合?

可能這是一個老生常談的問題,但還是想整理下,有誤的地方望大家指出。 

何為權限控制 

權限控制大致分為兩個維度: 

  • 垂直維度: 控制用戶可以訪問哪些url的權限
  • 水平維度: 控制用戶訪問特定url,獲取哪些數據的權限(e.g. 普通用戶、管理員、超級管理員訪問同一url,獲取的數據是不同的) 

Web權限控制方案List 

  • 前后端不分離:以Java為例,后端通過jsp、freemark、thmeleaf等模板來渲染相應權限的數據,渲染完呈現在瀏覽器端 
  • 前后端分離:
    • SPA單頁面應用,路由由前端控制,前端通過js控制hash路由的權限
    • SSR服務端渲染,Node中間層做代理路由,判斷權限渲染特定的路由至瀏覽器端 

SPA前端權限控制方案 

SPA: 單頁Web應用(single page web application)將所有web活動局限于一個html頁面中,利用js通過hash或者瀏覽器history api來實現無刷新路由跳轉,前后端通過ajax數據通信,避免了瀏覽器的刷新重新加載,為用戶提供流程的操作體驗。這意味著前端接管了路由層,需要通過調用前端自身的MVC模塊,來渲染不同的頁面。 

Base on: 

  • Vue 前端MVVM框架
  • Vuex 狀態管理機
  • Vue-router 路由
  • Axios HTTP請求庫 

1.登陸事件Login  

  1. // 1.觸發登陸事件 
  2.  
  3. dispatch('login')  
  4.  
  5. // actions 
  6.  
  7. commit(types.LOGIN_SUCCESS, res.data.data) 
  8.  
  9. ...  

2.獲取Token,經Base64編碼后存至sessionStorage  

  1. // mutations 
  2.  
  3. const mutations = { 
  4.  
  5.     [types.LOGIN_SUCCESS] (state, data) { 
  6.  
  7.         state.authlock = false 
  8.  
  9.     // 2.登陸成功回調拿到token,經Base64 編碼后存入本地sessionStorage 
  10.  
  11.         let token = Base64.encode(data + ':HIKDATAE'
  12.  
  13.         sessionStorage.setItem('userToken', token) 
  14.  
  15.     // 路由跳轉至目標頁面 
  16.  
  17.         router.push({name'xxx'}) 
  18.  
  19.     }, 
  20.  
  21.     [types.LOGOUT_SUCCESS] (state) { 
  22.  
  23.         state.authlock = true 
  24.  
  25.     // 登出成功回調,移除本地token 
  26.  
  27.         sessionStorage.removeItem('userToken'
  28.  
  29.         router.push({name'Login'}) 
  30.  
  31.     } 
  32.  
  33.  

3.所有HTTP Header Authorization 加上編碼后的token(前后端可約定規則)  

  1. // Axios 請求鉤子(request) 
  2.  
  3. axios.interceptors.request.use(req => { 
  4.  
  5.     let token = sessionStorage.getItem('user')      
  6.  
  7.     if (token) {          
  8.  
  9.         // 3.token 存在,則在之后所有請求的http請求頭 Authorization 帶上base64編碼后的token,后臺拿到token后進行驗證權限          
  10.  
  11.         req.headers.Authorization = `Basic ${token}`      
  12.  
  13.     } 
  14.  
  15.     req.data = qs.stringify(req.data)      
  16.  
  17.     return req  
  18.  
  19. }, error => { 
  20.  
  21.     return Promise.reject(error)  
  22.  
  23. })  

瀏覽器http header 

4.請求攔截:后臺拿到token后對每個請求進行校驗,若校驗失敗返回401,前端response鉤子里統一catch error 跳轉至登陸頁面 

 

  1. // Axios 請求鉤子(response) 
  2.  
  3. axios.interceptors.response.use(res => { 
  4.  
  5.     return res 
  6.  
  7. }, error => { 
  8.  
  9.     if (error.response) { 
  10.  
  11.         switch (error.response.status) { 
  12.  
  13.         // 4.所有接口response校驗鉤子,若token檢驗失敗,后臺返回 401 error code, 清除token信息并跳轉到登錄頁面 
  14.  
  15.             case 401: 
  16.  
  17.                 store.commit(types.LOGOUT) 
  18.  
  19.                 router.replace({ 
  20.  
  21.                     path: '/login' 
  22.  
  23.         }) 
  24.  
  25.     } 
  26.  
  27.     } 
  28.  
  29.     return Promise.reject(error) 
  30.  
  31. })  

5.路由跳轉攔截:任意路由跳轉時,在路由beforeEach鉤子里校驗本地是否存在token,若沒有,則跳轉至登陸頁面 

 

  1. // 路由鉤子(每個路由跳轉前調起beforeEach鉤子) 
  2.  
  3. router.beforeEach((tofromnext) => { 
  4.  
  5.   if (to.path === '/login') { 
  6.  
  7.     sessionStorage.removeItem('userToken'
  8.  
  9.   } 
  10.  
  11.   let user = sessionStorage.getItem('userToken'
  12.  
  13.   if (!user && to.path !== '/login') { 
  14.  
  15.     // 若本地token不存在,則任意路由跳轉的時候,重定向至login 登陸頁面 
  16.  
  17.     next({ path: '/login' }) 
  18.  
  19.   } else { 
  20.  
  21.     next() 
  22.  
  23.   } 
  24.  
  25. })  

6.登出Logout:清楚本地sessionStorage的token信息 

 

  1. // mutations 
  2.  
  3. const mutations = { 
  4.  
  5.     ... 
  6.  
  7.     [types.LOGOUT_SUCCESS] (state) { 
  8.  
  9.         state.authlock = true 
  10.  
  11.     // 登出成功回調,移除本地token 
  12.  
  13.         sessionStorage.removeItem('userToken'
  14.  
  15.     router.push({name'Login'}) 
  16.  
  17.     } 
  18.  
  19.  

流程示意圖如下:

 

寫完才覺得,什么才是真正的安全權限?任重而道遠。。。 

責任編輯:龐桂玉 來源: segmentfault
相關推薦

2016-12-27 19:26:43

2020-03-31 09:53:08

互聯網數據技術

2022-04-21 14:43:59

AI數據隱私

2018-03-19 16:05:51

前端程序員

2017-02-27 18:20:30

Amazon持續交付

2015-11-17 09:41:38

私有云自動化應用部署

2023-05-29 08:11:42

@Value注解Bean

2024-03-15 11:47:19

Vue2前端權限控制

2021-10-12 10:50:31

鴻蒙HarmonyOS應用

2015-10-27 10:32:39

2017-06-21 09:48:08

互聯網

2015-12-11 10:27:50

易維幫助臺/Helpd

2021-09-08 07:49:35

Dubbo連接控制

2016-11-18 12:43:12

支付寶支付工具

2021-06-28 17:26:15

歸并排序建模

2021-02-25 14:13:49

程序員IT互聯網

2017-09-28 15:07:37

全局字體反射

2012-09-21 09:36:47

創業創業公司投資機會

2017-01-19 11:16:29

開放網絡交換機數據中心

2021-08-26 23:17:59

人工智能智慧城市攝像頭
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: h视频免费观看 | 超碰在线97国产 | 欧美精品一二三 | 二区在线观看 | 欧美日韩一区在线 | 伊人网伊人 | 一区二区av | 欧美一级欧美三级在线观看 | 国产精品久久国产精品 | 国产精品夜色一区二区三区 | 一区二区三区高清不卡 | 在线观看日本网站 | 伊人在线| 一级a性色生活片久久毛片 一级特黄a大片 | 中文字幕一区二区三区在线观看 | 免费视频99 | 国产精品久久久久久一区二区三区 | 亚洲国产精品一区在线观看 | 99色在线| 91成人精品视频 | 午夜亚洲 | 欧美日韩一区二区在线 | 黄色av网站在线观看 | 久久久国产一区二区三区 | 欧美在线精品一区 | 国产精品成人一区二区三区吃奶 | 一区二区三区不卡视频 | 欧美日韩亚洲系列 | 在线免费观看色 | 精品久久久久久久人人人人传媒 | 国产成人jvid在线播放 | 四虎影视1304t| 国产精品久久久久久久久久 | 99精品热视频 | 日韩高清一区二区 | 中文在线一区二区 | 91视频在线观看 | 日韩中文字幕在线视频观看 | 四虎影院免费在线 | 日韩精品在线看 | 亚洲网站在线观看 |