<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          前端權(quán)限管理,你知道的和不知道的(干貨!)

          共 2186字,需瀏覽 5分鐘

           ·

          2021-03-08 12:12

          ?

          前沿:我所理解的門戶Portal就是一個(gè)入口, 可快速整合應(yīng)用入口,用來(lái)統(tǒng)一賬號(hào)管理、統(tǒng)一認(rèn)證登錄,打破信息孤島等,做統(tǒng)一的權(quán)限管理,也可以實(shí)現(xiàn)單點(diǎn)登錄 SSO。早期的MVC時(shí)代,web應(yīng)用其實(shí)就有通過(guò)權(quán)限去控制頁(yè)面、菜單、按鈕等的顯示和隱藏,只不過(guò)呈現(xiàn)方式不同,大多以php和jsp等為主,隨著前后端分離后,前端也成了權(quán)限控制的扛把子,主要是從以下這幾個(gè)角度去實(shí)現(xiàn),路由層面、視圖層面以及接口層面

          ?

          1.路由層面

          ?

          一般SPA應(yīng)用結(jié)合vue-router和vuex實(shí)現(xiàn)完成的一套路由體系,主要兩種方式,一種是通過(guò)vue-router addRoutes 方法注入路由實(shí)現(xiàn)控制,另外一個(gè)是直接通過(guò)vue-router beforeEach鉤子限制路由跳轉(zhuǎn)

          ?

          1.1 router.beforeEach()

          ?

          beforeEach鉤子函數(shù)就是在路由跳轉(zhuǎn)前執(zhí)行的,通過(guò)注冊(cè) router.beforeEach 鉤子對(duì)路由的每次跳轉(zhuǎn)進(jìn)行管理,每次跳轉(zhuǎn)都進(jìn)行檢查,如果目標(biāo)路由不存再于基本路由和當(dāng)前用戶的用戶路由中,則取消跳轉(zhuǎn),轉(zhuǎn)為跳轉(zhuǎn)錯(cuò)誤頁(yè)或登錄頁(yè)面

          ?
          • 在路由定義時(shí)添加meta的一個(gè)屬性,來(lái)控制判斷該頁(yè)面是否需要登錄權(quán)限

          1.2 動(dòng)態(tài)路由 (DynamicRoutes)

          ?

          用來(lái)實(shí)現(xiàn)頁(yè)面訪問(wèn)權(quán)限,動(dòng)態(tài)路由通過(guò)router.addRoutes() ,來(lái)只掛載當(dāng)前用戶擁有權(quán)限的路由,如果用戶直接訪問(wèn)未授權(quán)的路由,則會(huì)進(jìn)入404頁(yè)面。但是前提是需要用戶登錄后獲取路由權(quán)限,一般動(dòng)態(tài)掛載是在router.beforeEach處理的,下面我們看具體實(shí)現(xiàn)

          ?
          • 定義好需要?jiǎng)討B(tài)掛載的路由,區(qū)分是分為初始路由和根據(jù)role角色來(lái)動(dòng)態(tài)掛載的“用戶路由”,比如constantRoutesasyncRoutes

          • router.beforeEach 添加 router.addRoutes 事件   文檔鏈接??

          為了防止重復(fù)配置相同路由,在添加路由之前判斷是否已經(jīng)存在角色權(quán)限

          • 獲取擁有權(quán)限的路由,generateRoutes的實(shí)現(xiàn)

          通過(guò)遞歸的方式去過(guò)濾去用戶的路由權(quán)限,通過(guò)router.addRoutes()動(dòng)態(tài)添加所有符合權(quán)限的路由,當(dāng)然這種方式需要依賴后端。對(duì)于不同角色的用戶,是由后端將路由列表告訴給前端注冊(cè)

          ?

          ????? 啊樂同學(xué): 如果這個(gè)時(shí)候我退出登錄了,然后沒有刷新頁(yè)面,重新登錄另一個(gè)不同權(quán)限的用戶,那豈不是路由會(huì)重復(fù)?

          ?

          答:你在路由文件中定義resetRouter的方法,新建一個(gè)全新的 Router,然后將新的 Router.matcher 給當(dāng)前的Router,在登出的模塊中調(diào)用resetRouter方法

          總結(jié):

          • beforeEach 是需要靠我們手動(dòng)去幫 vue-router “辨別哪些頁(yè)面可以訪問(wèn),哪些不可以 ”
          • addRoutes 則是通過(guò)注入路由配置告訴 vue-router “我就只認(rèn)這些路由,其它路由地址跟我無(wú)關(guān)”

          2.視圖層面

          ?

          上一節(jié)聊的路由方面的權(quán)限控制,主要在控制菜單頁(yè)面權(quán)限,那如果是按鈕權(quán)限,應(yīng)該怎么做?比如頁(yè)面中的按鈕 (增、刪、改、查)的權(quán)限控制是否顯示

          ?

          2.1 指令控制

          ?

          可以結(jié)合vue的自定義指令,實(shí)現(xiàn)一個(gè)權(quán)限指令比如 v-auth來(lái)控制權(quán)限,來(lái)判斷對(duì)應(yīng)模塊是否擁有某個(gè)權(quán)限時(shí),如果沒有則移除當(dāng)前按鈕dom元素,下面我們看下這個(gè)實(shí)現(xiàn)方式??

          ?

          通過(guò)自定義權(quán)限指令v-auth來(lái)實(shí)現(xiàn)按鈕權(quán)限控制,通過(guò)傳入權(quán)限角色數(shù)組列表,來(lái)控制元素是否顯示

          ?

          ?????  啊樂同學(xué): 為啥不直接用 v-if 或者 v-show 去控制顯示隱藏,而是自定義指令?

          ?

          答:因?yàn)?v-show 的話,dom其實(shí)沒有隱藏,用戶可以改變display就看到,v-if呢,則是刪除之后會(huì)遺留備注<!-- -->

          思考??  : 如果要實(shí)現(xiàn)按鈕顯示但是禁用的情況,上面的例子應(yīng)該如何修改?

          ?? 推薦閱讀:

          • vue-element-admin后臺(tái)前端解決方案
          • 手摸手,帶你用vue擼后臺(tái) 系列二(登錄權(quán)限篇)

          3.接口層面

          ?

          我們?cè)陧?xiàng)目使用中,請(qǐng)求庫(kù)以axios較多,我們通常會(huì)使用axios的API axios.interceptors.request.use 也就是攔截器來(lái)做權(quán)限管理

          ?
          • 請(qǐng)求頭添加 token認(rèn)證,或者也可以直接使用cookie中的授權(quán)信息,前提是要配置 withCredentials為true,也就是axios.defaults.withCredentials = true, 開啟withCredentials后,服務(wù)器才能拿到你的cookie

          • 攔截器攔截接口返回結(jié)果,比如401沒有登錄權(quán)限。


          最后



          如果你覺得這篇內(nèi)容對(duì)你挺有啟發(fā),我想邀請(qǐng)你幫我三個(gè)小忙:

          1. 點(diǎn)個(gè)「在看」,讓更多的人也能看到這篇內(nèi)容(喜歡不點(diǎn)在看,都是耍流氓 -_-)

          2. 歡迎加我微信「qianyu443033099」拉你進(jìn)技術(shù)群,長(zhǎng)期交流學(xué)習(xí)...

          3. 關(guān)注公眾號(hào)「前端下午茶」,持續(xù)為你推送精選好文,也可以加我為好友,隨時(shí)聊騷。

          點(diǎn)個(gè)在看支持我吧,轉(zhuǎn)發(fā)就更好了



          瀏覽 137
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  大香蕉视频成人视频 | a片黄片免费看 | 麻豆精品內射 | 精品人妻免费视频 | 免费国产黄片在线看 |