RBAC权限管理(不同用户角色进入到系统能访问的页面不同)

1 篇文章 0 订阅
1 篇文章 0 订阅

RBAC权限控制(效果图在底部)

为了达成不同的帐号登陆系统后能看到不同的页面,能执行不同的功能的目标,我们有很多种解决方案,RBAC(Role-Based Access control)权限模型 ,也就是基于角色的权限分配解决方案。

三个关键点:

用户: 就是使用系统的人(员工)

权限点:这个系统中有多少个功能(例始:有3个页面,每个页面上的有不同的操作)

角色:不同的权限点的集合
在这里插入图片描述

通过给不同用户分配不同的角色,实现页面级别的权限管理 。

实现步骤

1.首先我们将路由分为动态路由和静态路由
动态路由:指我们需要分配权限的路由(工资管理,员工管理…)
静态路由:指不需要权限就可以访问的路由(登录,404,首页…)

在这里插入图片描述
2.将动态路由筛选过滤
2.1 在路由守卫文件里引入
在这里插入图片描述
2.2把进入主页之前获取的用户信息进行筛选,选出当前用户的权限信息返回回来,并存到menus中。
获取到的数据:
在这里插入图片描述

筛选数据并返回:
在这里插入图片描述
接收 存到menus中:
在这里插入图片描述

2.3 过滤引入的动态路由(根据与后端的约定不同,我们自行选择过滤的方法)
我这里和后端约定每个路由里的children的第一个子元素的name为判定的标准 下面是我定义的路由:
在这里插入图片描述
过滤的代码:

  // 过滤
        const filterRoutes = asyncRoutes.filter(route => {
        //使用filter方法 先循环过滤出每个路由的children的第一个子元素
          const routeName = route.children[0].name
          //然后使用includes()方法在当前用户的权限数组里menus筛选出用户可以访问的页面的路由返回出去
          return menus.includes(routeName)
        })

2.4 使用 $router.addRoutes() 方法动态添加路由
在这里插入图片描述

做完这一步我们就可以通过在浏览器网址上添加路由访问有权限的页面啦
接下来我们把数据存到vuex中准备渲染

3.把数据存到vuex中渲染到页面上
3.1创建存放路由的模块,引入静态路由,先存放进去

// 导入静态路由
import { constantRoutes } from '@/router'
export default {
  namespaced: true,
  state: {
    // 先以静态路由作为菜单数据的初始值
    menuList: [...constantRoutes]
  },
  mutations: {
    setMenuList(state, asyncRoutes) {
      // 将动态路由和静态路由组合起来
      state.menuList = [...constantRoutes, ...asyncRoutes]
    }
  }
}

3.2再把过滤好的动态路由通过mutations里的setMenuLis将动态路由和静态路由组合起来
在这里插入图片描述
3.3 把当前的菜单渲染的数据改成vuex中过滤好的数据
在这里插入图片描述

这样就实现了不同的帐号登陆系统后能看到不同的页面,执行不同的功能的目标了

管理员:在这里插入图片描述
其他员工:
在这里插入图片描述
结语:
这里只是做完了页面级别的权限控制, 我们还可以对每个页面里的按钮进行按钮级别的权限控制
比如:管理层可以看到数据进行增,删,改,查 按钮。 普通员工只能查看 。
后期配合后端的接口 我们可以在系统里自行分配用户的角色和角色的权限点 这里就不一一演示了
根据项目的需求不同与和后端的约定不同 此博客仅供参考

  • 8
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现一个基于 Flask 和 Vue 的 RBAC 权限管理系统后台,需要设计一个用户角色权限数据结构,用于存储用户信息、角色信息、权限信息以及角色和权限的关联信息。下面给出一个简单的数据结构: ```python # 用户信息 class User(db.Model): id = db.Column(db.Integer, primary_key=True) username = db.Column(db.String(64), unique=True) password_hash = db.Column(db.String(128)) role_id = db.Column(db.Integer, db.ForeignKey('role.id')) # 角色信息 class Role(db.Model): id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(64), unique=True) description = db.Column(db.String(128)) permissions = db.relationship('Permission', secondary='role_permission', backref=db.backref('roles', lazy='dynamic')) # 权限信息 class Permission(db.Model): id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(64), unique=True) description = db.Column(db.String(128)) # 角色和权限的关联信息 class RolePermission(db.Model): id = db.Column(db.Integer, primary_key=True) role_id = db.Column(db.Integer, db.ForeignKey('role.id')) permission_id = db.Column(db.Integer, db.ForeignKey('permission.id')) ``` 在这个数据结构中,每个用户只能拥有一个角色,每个角色可以包含多个权限。接下来,需要在后台实现权限控制的逻辑。例如:在页面请求时,判断当前用户是否具有访问页面的权限,如果没有权限,则返回错误信息;如果有权限,则返回页面数据。可以通过 Flask 中的装饰器实现权限控制逻辑: ```python from functools import wraps from flask import abort from flask_login import current_user def permission_required(permission): def decorator(f): @wraps(f) def decorated_function(*args, **kwargs): if not current_user.can(permission): abort(403) return f(*args, **kwargs) return decorated_function return decorator ``` 这个装饰器接受一个权限参数,表示需要具有该权限才能访问页面,如果用户没有该权限,就返回 403 错误。 在前端页面中,可以通过 Vue 的路由拦截器实现权限控制的逻辑。例如:在页面请求时,判断当前用户是否具有访问页面的权限,如果没有权限,则跳转到错误页面;如果有权限,则显示页面内容。可以通过 Vue 中的路由拦截器实现权限控制逻辑: ```javascript router.beforeEach((to, from, next) => { if (to.meta.permissions && !checkPermission(to.meta.permissions)) { next({ path: '/error', replace: true }); } else { next(); } }) function checkPermission(permissions) { var role = JSON.parse(localStorage.getItem('user')).role; var rolePermissions = role.permissions.map(p => p.name); return permissions.every(p => rolePermissions.includes(p)); } ``` 这个路由拦截器接受一个权限参数,表示需要具有该权限才能访问页面,如果用户没有该权限,就跳转到错误页面。可以通过在用户登录时,将用户信息存储在本地缓存中,然后在路由拦截器中获取用户信息,判断用户是否具有该权限。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值