后臺(tái)管理系統(tǒng)element-admin——登錄權(quán)限篇

Start

記錄寫后臺(tái)管理系統(tǒng)時(shí)的一些想法和組件的二次封裝,項(xiàng)目初期參考的是花褲衩大神的vue-element-admin,后期根據(jù)業(yè)務(wù)進(jìn)行了一些修改式塌。

登錄

登錄流程的思路我們先屢清楚:

  • 用戶在登錄頁輸入賬號(hào)密碼飒泻,將賬號(hào)密碼發(fā)送請(qǐng)求給后端
    • 將賬號(hào)密碼發(fā)送請(qǐng)求給后端的方法寫在vuex里便于全局token的存取崭捍,而前端登錄方法里只需要關(guān)注登錄的結(jié)果,并根據(jù)結(jié)果跳轉(zhuǎn)頁面或提示錯(cuò)誤侯嘀,這樣代碼結(jié)構(gòu)會(huì)清晰另凌。
    <!-- action: -->
    
    Login ({commit}, userInfo) {
      const { username, password } = userInfo
      return new Promise((resolve, reject) => {
        login({ username: username.trim(), password: password })
          .then(res => {
            if (res.event !== 0) {
              reject(res)
            }
            Vue.ls.set(ACCESS_TOKEN, res.data.token, 12 * 60 * 60 * 1000)
            commit('SET_TOKEN', res.data.token)
            resolve()
          })
          .catch ((error) => {
            reject(error)
          })
      })
    }
    
    <!-- Login頁面: -->
    
    import { mapActions } from 'vuex'
    
    methods: {
    ...mapActions(['Login']),
    handleLogin () {
      this.$refs.loginForm.validate(valid => {
        if (valid) {
          this.loading = true
          this.Login(this.loginForm)
            .then(() => {
              this.$router.push({ path: this.redirect || '/' }).catch(err => {})
              this.loading = false
            }).catch((err) => {
              this.$message.error(err.message);
              this.loading = false
            })
        } else {
          console.log('error submit!!')
          return false
        }
      })
    }
    }
    
  • 后端驗(yàn)證一下用戶的賬號(hào)和密碼的信息,如果符合就發(fā)一個(gè)token返回給客戶端戒幔,如果不符合就不發(fā)送token吠谢,返回驗(yàn)證錯(cuò)誤信息。
  • 如果登錄成功诗茎,客戶端將token存在localStorage里工坊,之后要請(qǐng)求其他資源的時(shí)候,在請(qǐng)求頭里帶上這個(gè)token敢订。
    • service/http.js 中全局請(qǐng)求攔截器中:config.headers['token'] = token王污。
  • 后端收到請(qǐng)求信息,先驗(yàn)證下token是否有效楚午,有效則下發(fā)請(qǐng)求的資源昭齐,無效則返回驗(yàn)證錯(cuò)誤。

獲取用戶信息

登錄成功之后矾柜,在全局路由鉤子router.beforeEach中攔截路由阱驾,判斷如果有token,就去獲取用戶信息

<!-- router.beforeEach -->

if (Vue.ls.get(ACCESS_TOKEN)) {
  store.dispatch('GetInfo')
  .then((infoRes) => {
    const roles = res.data.role;
    next()
  })
}

權(quán)限

權(quán)限控制是很常見的需求把沼,我們的業(yè)務(wù)要求控制到按鈕級(jí)別啊易。

頁面級(jí)權(quán)限的實(shí)現(xiàn)方式是通過獲取當(dāng)前用戶的權(quán)限去對(duì)比路由表,生成當(dāng)前用戶具有權(quán)限可訪問的路由表饮睬,通過 router.addRouters 掛載到 router 上租谈。

具體步驟如下:

  1. 判斷是否有token,如果沒有就去登錄捆愁,有就第二步割去。
  2. 獲取用戶信息 store.dispatch('GetInfo')
  3. 獲取信息成功之后昼丑,調(diào)用store.dispatch('GenerateRoutes')呻逆,這個(gè)方法里會(huì)調(diào)用/router/index.js里的 generatorDynamicRouter 方法,并返回一個(gè)根據(jù)用戶信息構(gòu)建好權(quán)限的路由結(jié)構(gòu)菩帝。(generatorDynamicRouter方法里將后臺(tái)返回的一個(gè)平級(jí)的menu信息咖城,通過遞歸的方式生成層級(jí)結(jié)構(gòu),再遞歸生成層級(jí)路由)
  4. 將構(gòu)建的路由結(jié)構(gòu)信息利用 Vue-Router 提供的動(dòng)態(tài)增加路由方法 router.addRoutes 加入到路由表中呼奢。
  5. 加入路由表后將頁面跳轉(zhuǎn)到用戶原始要訪問的頁面,如果沒有 redirect 則進(jìn)入默認(rèn)頁面宜雀。

我們把 登錄獲取用戶信息 分成了兩個(gè)接口,原因是當(dāng)用戶刷新頁面時(shí)握础,可以根據(jù)登錄時(shí)獲取到的token去獲取用戶信息辐董,避免了刷新還要調(diào)用登錄接口。

整體流程可以看這個(gè)圖:


promission

前端控制權(quán)限

舊版本后臺(tái)的路由表是后端同學(xué)根據(jù)權(quán)限生成的禀综,這使得前端小伙伴每開發(fā)一個(gè)頁面就需要讓后端同學(xué)配一下路由和權(quán)限简烘,光聽著就開始皺眉了???♀?苔严。

于是我們采用了在前端頁面配置路由和權(quán)限,之后將這份路由表存到后端孤澎。

權(quán)限/菜單:


image

權(quán)限/角色:


image

一角色對(duì)應(yīng)多權(quán)限届氢,一用戶對(duì)應(yīng)多角色

當(dāng)用戶登錄后得到 roles,前端根據(jù) roles 去向后端請(qǐng)求可訪問的路由表亥至,從而動(dòng)態(tài)生成可訪問頁面悼沈,之后就是 router.addRoutes 動(dòng)態(tài)掛載到 router 上,和原來是相同的姐扮。

按鈕級(jí)權(quán)限

在配置菜單權(quán)限頁面也可以添加配置按鈕的權(quán)限絮供,登錄之后的 store.dispatch('GetInfo') 中能拿到對(duì)應(yīng)權(quán)限的按鈕,并存儲(chǔ)在 vuex 中茶敏。

判斷按鈕是否展示是寫了一個(gè)公用方法 checkPermission 壤靶,沒有用指令是因?yàn)闊o法適用于所有組件。

將提前設(shè)置好的 唯一鍵 傳入方法惊搏,就可以從vuex里 store.getters.buttons 拿到所有按鈕權(quán)限贮乳,對(duì)比后返回 true 或 false,來控制按鈕的展示恬惯。

<!-- 引入方法 -->
import { checkPermission } from '@/utils/permissions'

<!-- data中定義變量 -->
addEnable: checkPermission('system:role:add')

<!-- v-if判斷 -->
<el-button v-if="addEnable">添加角色</el-button>

最后

代碼地址戳這里哈~
附圖:

image

image

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末向拆,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子酪耳,更是在濱河造成了極大的恐慌浓恳,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,423評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件碗暗,死亡現(xiàn)場離奇詭異颈将,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)言疗,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,147評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門晴圾,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人噪奄,你說我怎么就攤上這事死姚。” “怎么了勤篮?”我有些...
    開封第一講書人閱讀 157,019評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵知允,是天一觀的道長。 經(jīng)常有香客問我叙谨,道長,這世上最難降的妖魔是什么保屯? 我笑而不...
    開封第一講書人閱讀 56,443評(píng)論 1 283
  • 正文 為了忘掉前任手负,我火速辦了婚禮涤垫,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘竟终。我一直安慰自己蝠猬,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,535評(píng)論 6 385
  • 文/花漫 我一把揭開白布统捶。 她就那樣靜靜地躺著榆芦,像睡著了一般。 火紅的嫁衣襯著肌膚如雪喘鸟。 梳的紋絲不亂的頭發(fā)上匆绣,一...
    開封第一講書人閱讀 49,798評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音什黑,去河邊找鬼崎淳。 笑死,一個(gè)胖子當(dāng)著我的面吹牛愕把,可吹牛的內(nèi)容都是我干的拣凹。 我是一名探鬼主播,決...
    沈念sama閱讀 38,941評(píng)論 3 407
  • 文/蒼蘭香墨 我猛地睜開眼恨豁,長吁一口氣:“原來是場噩夢啊……” “哼嚣镜!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起橘蜜,我...
    開封第一講書人閱讀 37,704評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤菊匿,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后扮匠,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體捧请,經(jīng)...
    沈念sama閱讀 44,152評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,494評(píng)論 2 327
  • 正文 我和宋清朗相戀三年棒搜,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了疹蛉。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,629評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡力麸,死狀恐怖可款,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情克蚂,我是刑警寧澤闺鲸,帶...
    沈念sama閱讀 34,295評(píng)論 4 329
  • 正文 年R本政府宣布,位于F島的核電站埃叭,受9級(jí)特大地震影響摸恍,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,901評(píng)論 3 313
  • 文/蒙蒙 一立镶、第九天 我趴在偏房一處隱蔽的房頂上張望壁袄。 院中可真熱鬧,春花似錦媚媒、人聲如沸嗜逻。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,742評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽栈顷。三九已至,卻和暖如春嵌巷,著一層夾襖步出監(jiān)牢的瞬間萄凤,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,978評(píng)論 1 266
  • 我被黑心中介騙來泰國打工晴竞, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蛙卤,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,333評(píng)論 2 360
  • 正文 我出身青樓噩死,卻偏偏與公主長得像颤难,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子已维,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,499評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容