一、需求说明

1、系统登录,每个账号表示一位用户,每位用户分配有不同的权限,不同的权限有着不同的操作。
2、现需要每位用户登录时都能获取到对应的权限,在登录系统中进行使用,退出时则清空权限。
3、项目框架:pc端,vue前端框架。

二、功能实现

1、登录:获取当前用户所有权限并存储于session库中

// login.vue/js
/**
 * 获取当前用户所有权限数组 - 可以放在【登录】按钮点击事件里面
 */
getPermission() {
  returnnew Promise((resolve, reject) => {
    queryPermission().then((res) => { // 请求后端接口 - 获取权限数据并存储于session库中
      const permissions = res.data
      sessionStorage.setItem('authorities', JSON.stringify(permissions || '[]')) // 存储到session中
      resolve(res)
    }).catch(error => reject(error))
  })
}

功能:Session与Vue:登录获取权限,并完成session存储

2、公共方法:判断是否有权限

// auth.js
/**
 * 是否有权限
 * @param {String} key - 权限字符串
 */
export function isAuth (key) {
  let authorities = JSON.parse(sessionStorage.getItem('authorities') || '[]')
  if (authorities.length) {
    for (const i in authorities) {
      const element = authorities[i]
      if (element === key) {
        return true
      }
    }
  }
  return false
}

3、isAuth()公共方法挂载到vue原型上

// main.js
// 引入isAuth()方法
import { isAuth } from '@/common/utils/auth'
// 挂载到vue原型链上
// 作用:可以将isAuth()作为vue的一个内定方法使用,不用每个单页面都引入该方法
Vue.prototype.isAuth = isAuth

4、vue单页面使用权限进行判断对应操作

// xxx.vue
// 使用isAuth()方法,判断是否有此权限,有则展示该按钮
// 作用:实现了不同权限拥有不同操作的需求
<el-button type="primary" size="mini" v-if="isAuth('coupon:report:enable')" @click="enableOrDisableHandle(1)">设为有效</el-button>

5、当前用户退出时,清空session权限

// login.vue/js
/**
 * 退出系统 - 清空权限session
 */
logOut() {
  return new Promise((resolve, reject) => {
    logout().then(() => { // 请求退出系统接口
      sessionStorage.setItem('authorities', JSON.stringify('[]')) // 清空权限session
      resolve()
    }).catch(error => {
      sessionStorage.setItem('authorities', JSON.stringify('[]'))
      reject(error)
    })
  })
},

三、遗留问题

1、疑问:当当前登陆人权限更改时,没办法及时更新权限,需退出登录后,再进行获取权限并存储session的操作。
2、设想:在系统进行权限分配时,再进行一次权限请求并更新存储session中。
3、限制:权限分配在其他系统分配,故做不到系统权限分配时更新session。

《功能:Session与Vue:登录获取权限,并完成session存储》有问题的话,或者有更优解,请各位大佬指出来哇哇哇~~~

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。