基于若依前端实现登录到页面按钮的权限控制

基于若依前端实现登录到页面按钮的权限控制

权限控制流程概述

若依框架采用RBAC(基于角色的权限控制)模型,权限控制贯穿从登录到页面渲染的全过程。前端通过Vue + Vuex + Vue Router实现动态路由和按钮级权限,后端通过Spring Security进行接口权限校验。

登录与权限初始化

用户登录成功后,后端返回token用户权限信息。前端将权限数据存储到Vuex中,并生成动态路由。关键代码在src/store/modules/permission.js

// 动态生成路由
const actions = {
  generateRoutes({ commit }, roles) {
    return new Promise(resolve => {
      let accessedRoutes
      if (roles.includes('admin')) {
        accessedRoutes = asyncRoutes || []
      } else {
        accessedRoutes = filterAsyncRoutes(asyncRoutes, roles)
      }
      commit('SET_ROUTES', accessedRoutes)
      resolve(accessedRoutes)
    })
  }
}

路由权限控制

路由级权限通过router.beforeEach拦截实现,检查路由的meta.roles属性是否匹配当前用户角色。关键代码在src/permission.js

router.beforeEach(async(to, from, next) => {
  const hasRoles = store.getters.roles && store.getters.roles.length > 0
  if (hasRoles) {
    next()
  } else {
    const { roles } = await store.dispatch('user/getInfo')
    const accessRoutes = await store.dispatch('permission/generateRoutes', roles)
    router.addRoutes(accessRoutes)
    next({ ...to, replace: true })
  }
})

页面按钮权限控制

按钮级权限使用自定义指令v-hasPermiv-hasRole实现。指令定义在src/directive/permission/hasPermi.js

import store from '@/store'

export default {
  inserted(el, binding, vnode) {
    const { value } = binding
    const all_permission = "*:*:*"
    const permissions = store.getters && store.getters.permissions

    if (value && value instanceof Array && value.length > 0) {
      const permissionFlag = value
      const hasPermissions = permissions.some(permission => {
        return all_permission === permission || permissionFlag.includes(permission)
      })

      if (!hasPermissions) {
        el.parentNode && el.parentNode.removeChild(el)
      }
    } else {
      throw new Error(`请设置操作权限标签值`)
    }
  }
}

按钮权限使用示例

在模板中使用权限指令控制按钮显示:

<el-button v-hasPermi="['system:user:add']">新增用户</el-button>
<el-button v-hasRole="['admin']">管理员操作</el-button>

权限数据格式规范

后端返回的权限数据格式应包含:

{
  "roles": ["admin"],
  "permissions": ["system:user:add", "system:user:edit"]
}

动态菜单生成

侧边栏菜单通过src/layout/components/Sidebar组件动态生成,基于router.js中配置的路由meta.roles属性过滤:

{
  path: '/system/user',
  component: Layout,
  meta: {
    title: '用户管理',
    icon: 'user',
    roles: ['admin']
  }
}

权限缓存处理

权限信息应持久化到localStorage,避免刷新页面丢失。关键代码在src/utils/auth.js

export function getToken() {
  return Cookies.get(TokenKey)
}

export function setToken(token) {
  return Cookies.set(TokenKey, token)
}

接口权限校验

前端应在src/utils/request.js中统一注入token,后端需校验每个接口的权限:

service.interceptors.request.use(
  config => {
    if (getToken()) {
      config.headers['Authorization'] = 'Bearer ' + getToken()
    }
    return config
  }
)

通过以上实现,若依前端完成了从登录认证到按钮级权限的全流程控制。开发者只需关注权限配置,框架会自动处理权限校验和界面渲染。

一直想做一款后台管理系统,看了很多优秀的开源项目但是发现没有合适自己的。于是利用空闲休息时间开始自己写一套后台系统。如此有了若依管理系统。她可以用于所有的Web应用程序,如网站管理后台,网站会员中心,CMS,CRM,OA。所有前端后台代码封装过后十分精简易上手,出错效率低。同时支持移动客户端访问。系统会陆续更新一些实用功能。您是否在找一套合适后台管理系统。您是否在找一套代码易读易懂后台管理系统。那么,现在若依来了。诚意奉献之作若依是给刚出生的女儿取的名字 寓意:你若不离不弃,我必生死相依内置功能用户管理:用户是系统操作者。部门管理:配置系统组织机构。岗位管理:岗位是用户所属职务。菜单管理:配置系统菜单(支持控制到按钮)。角色管理:角色菜单权限分配。字典管理:对系统中经常使用的一些较为固定的数据进行维护。操作日志:系统操作日志记录(含异常)。登录日志:系统登录情况记录(含异常)。在线用户:当前系统中活跃用户状态监控。连接池监视:监视当期系统数据库连接池状态,可进行分析SQL找出系统性能瓶颈。为何选择若依是一个完全响应式,基于Bootstrap3.3.6最新版本开发的主题。她可以用于所有的Web应用程序,如网站管理后台,网站会员中心,CMS,CRM,OA。拥有良好的代码结构,层次结构清晰。内置一系列基础功能。操作权限控制精密细致,对所有管理链接都进行权限验证,可控制到按钮。提供在线功能代码生成工具,提高开发效率及质量。提供常用工具类封装,日志、国际化、缓存、验证、字典等数据。兼容目前最流行浏览器(IE7+、Chrome、Firefox)手机移动端也支持。技术选型1、后端核心框架:Spring Boot安全框架:Apache Shiro模板引擎:Thymeleaf持久层框架:MyBatis数据库连接池:Druid缓存框架:Ehcache日志管理:SLF4J工具类:Apache Commons FastjsonPOJO:Lombok2、前端框架:Bootstrap数据表格:Bootstrap Table客户端验证:JQuery Validation树结构控件:zTree弹出层:layer3、平台服务器中间件:SpringBoot内置数据库支持:目前仅提供MySql数据库的支持,但不限于数据库开发环境:Java、Eclipse、Maven、Git
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值