首页 > 其他分享 >基于角色的访问控制并根据不同的场景显示不同的反馈信息

基于角色的访问控制并根据不同的场景显示不同的反馈信息

时间:2024-05-14 12:41:07浏览次数:14  
标签:return 访问控制 不同 反馈 import 组件 const 权限 permissions

要实现基于角色的访问控制(RBAC),并根据不同的场景(如菜单项、页面、组件)显示不同的反馈信息(如隐藏、禁用、提示等),可以设计一套完整的解决方案。这个方案需要结合权限管理、上下文、路由控制和条件渲染等多个方面。以下是一个详细的实现方案:

1. 设置角色和权限

首先,定义你的角色和权限:

const roles = {
  ADMIN: 'admin',
  EDITOR: 'editor',
  VIEWER: 'viewer',
};

const permissions = {
  READ: 'read',
  WRITE: 'write',
  DELETE: 'delete',
};

const rolePermissions = {
  [roles.ADMIN]: [permissions.READ, permissions.WRITE, permissions.DELETE],
  [roles.EDITOR]: [permissions.READ, permissions.WRITE],
  [roles.VIEWER]: [permissions.READ],
};

2. 权限上下文

创建权限上下文,用于在整个应用中共享当前用户的角色和权限信息:

import React, { createContext, useContext } from 'react';

const PermissionsContext = createContext();

export const PermissionsProvider = ({ currentUser, children }) => {
  return (
    <PermissionsContext.Provider value={currentUser}>
      {children}
    </PermissionsContext.Provider>
  );
};

export const usePermissions = () => {
  return useContext(PermissionsContext);
};

3. 创建权限检查函数

实现一个函数,用于检查当前用户是否具有特定权限:

const hasPermission = (role, requiredPermission) => {
  const userPermissions = rolePermissions[role] || [];
  return userPermissions.includes(requiredPermission);
};

4. 创建高阶组件和组合组件

实现一个高阶组件(HOC)和组合组件,用于权限控制:

高阶组件(HOC)

import React from 'react';
import { usePermissions } from './PermissionsContext';

const withAuthorization = (WrappedComponent, requiredPermission) => {
  return (props) => {
    const currentUser = usePermissions();
    const userRole = currentUser.role;

    if (hasPermission(userRole, requiredPermission)) {
      return <WrappedComponent {...props} />;
    } else {
      return <div>Access Denied</div>; // 或者返回其他组件如 <Redirect />
    }
  };
};

export default withAuthorization;

组合组件

import React from 'react';
import { usePermissions } from './PermissionsContext';

const WithAuthorization = ({ requiredPermission, children, fallback }) => {
  const currentUser = usePermissions();
  const userRole = currentUser.role;

  if (hasPermission(userRole, requiredPermission)) {
    return children;
  } else {
    return fallback || <div>Access Denied</div>;
  }
};

export default WithAuthorization;

5. 路由控制

使用 ProtectedRoute 组件控制路由访问:

import React from 'react';
import { Route, Redirect } from 'react-router-dom';
import { usePermissions } from './PermissionsContext';

const ProtectedRoute = ({ component: Component, requiredPermission, ...rest }) => {
  const currentUser = usePermissions();
  const userRole = currentUser.role;

  return (
    <Route
      {...rest}
      render={(props) =>
        hasPermission(userRole, requiredPermission) ? (
          <Component {...props} />
        ) : (
          <Redirect to="/unauthorized" /> // 或者重定向到 404 页面
        )
      }
    />
  );
};

export default ProtectedRoute;

6. 菜单控制

根据权限动态生成菜单:

import React from 'react';
import { usePermissions } from './PermissionsContext';
import { Link } from 'react-router-dom';

const Menu = () => {
  const currentUser = usePermissions();
  const userRole = currentUser.role;

  return (
    <nav>
      <ul>
        {hasPermission(userRole, permissions.READ) && (
          <li>
            <Link to="/dashboard">Dashboard</Link>
          </li>
        )}
        {hasPermission(userRole, permissions.WRITE) && (
          <li>
            <Link to="/editor">Editor</Link>
          </li>
        )}
        {hasPermission(userRole, permissions.DELETE) && (
          <li>
            <Link to="/admin">Admin</Link>
          </li>
        )}
      </ul>
    </nav>
  );
};

export default Menu;

7. 组件内权限控制

在组件内使用组合组件进行权限控制:

import React from 'react';
import WithAuthorization from './WithAuthorization';

const AdminComponent = () => {
  return <div>Admin Content</div>;
};

const App = () => {
  return (
    <PermissionsProvider currentUser={{ role: roles.EDITOR }}>
      <div>
        <h1>My App</h1>
        <Menu />
        <WithAuthorization requiredPermission={permissions.DELETE} fallback={<div>Access Denied</div>}>
          <AdminComponent />
        </WithAuthorization>
      </div>
    </PermissionsProvider>
  );
};

export default App;

8. 显示不同的反馈信息

根据不同的场景显示不同的反馈信息:

import React from 'react';
import WithAuthorization from './WithAuthorization';

const DisabledButton = () => <button disabled>You don't have permission</button>;

const AdminComponent = () => {
  return <div>Admin Content</div>;
};

const App = () => {
  return (
    <PermissionsProvider currentUser={{ role: roles.VIEWER }}>
      <div>
        <h1>My App</h1>
        <Menu />
        <WithAuthorization requiredPermission={permissions.DELETE} fallback={<DisabledButton />}>
          <AdminComponent />
        </WithAuthorization>
      </div>
    </PermissionsProvider>
  );
};

export default App;

总结

通过上述步骤,可以实现一套完整的基于 RBAC 的权限控制方案,涵盖了菜单项、页面访问、组件显示等不同场景的权限控制。组合方式和高阶组件(HOC)各有优势,可以根据实际需求灵活使用。通过权限上下文、权限检查函数、高阶组件和组合组件,可以确保权限控制逻辑的复用性和灵活性,使得权限管理更加简洁和高效。

标签:return,访问控制,不同,反馈,import,组件,const,权限,permissions
From: https://www.cnblogs.com/wangshushuo/p/18191083

相关文章

  • 同一个函数/不同函数的接口关联
    第一种:在同一个方法中接口关联,可以直接提取后引用第二种:在不同方法中,声明全局变量,提取后引用第三种:通过在conftest.py文件中定义一个夹具,在测试用例函数中使用这个夹具#定义一个登录成功后获取token的夹具@pytest.fixture(scope="session")deflogin_fixture():#定......
  • 支持不同业务模式与安全要求的跨网传输解决方案,了解一下!
    对于科技研发型企业来说,最值钱的是研发代码这类数据资产。因此很多企业会想将这些数据“困”在内部,防止数据泄露。最常见的做法是通过防火墙、DMZ区、双网卡主机、虚拟机、网闸/光闸等隔离方式,将网络划分为企业内外网,较为常见的是办公网和互联网;对于业务线较多、需要更精细管理的......
  • 理解独立思考的定义后,可以设计一种评估方式来衡量个体的独立思考能力。以下是一种可能
    理解独立思考的定义后,可以设计一种评估方式来衡量个体的独立思考能力。以下是一种可能的评估方式:独立思考等级评估方式1.自主性(Autonomy)自我启发(Self-Inspiration):个体是否能够自主地提出问题或主张观点,而不是依赖外部指导或命令。自我引导(Self-Guidance):个体是否能......
  • Java 高效获取两个List中不同的元素集合
    /***借助Map来获取listA、listB的不同元素集合**@paramlistA集合A*@paramlistB集合B*@returnlist<String>不同元素集合*/publicstaticList<String>getDifferListByMap(List<String>listA,List<String>listB){List<String>differList=new......
  • 这些标识代表了WindowsServer2022SERVERDATACENTER 的不同版本和配置选项。让我逐一解
    这些标识代表了WindowsServer2022的不同版本和配置选项。让我逐一解释它们:WindowsServer2022SERVERSTANDARDCORE:这表示WindowsServer2022的标准版核心安装。它是一个精简的安装版本,只包含基本的操作系统组件和服务,没有图形用户界面。通常用于服务器部署,以减少资......
  • Shell--批量删除指定目录下,带不同后缀名的文件
    文件根目录在 /home/service/app/sre/*/release 下,*表示一个目录,目录名不固定,文件后缀有多种,如:./data/dict/gc_app/gc_app.i2i*./data/dict/gc_app/gc_app.consociation_appid...脚本:#!/bin/bash#定义要删除的文件根路径base_dir="/home/service/app/sre/"#获取......
  • 如何批量删除多个不同路径的文件但又保留文件夹呢
    首先,需要用到的这个工具:度娘网盘提取码:qwu2蓝奏云提取码:2r1z1、我准备了三个文件夹(实际操作的时候可能是上百个文件夹,无所谓),里面都放了两个图片2、然后打开工具,使用文件批量复制的模块,勾选“复制时先清空…”的选项,注意,第一栏“要复制的文件和文件夹”里面为空,这样就想相......
  • vue和react的相同点和不同点
    Vue和React作为现代前端开发中流行的两个JavaScript框架,它们有诸多相似之处,同时也存在一些关键性的不同。以下是Vue和React的一些主要相同点和不同点:相同点:虚拟DOM:Vue和React都使用虚拟DOM(VirtualDOM)来提高性能,减少直接操作真实DOM的频率,从而加快页面渲染速度。组件化开发:两......
  • 两个问题类似的dp,二者有时间复杂度的不同
    1.https://vjudge.net/problem/POJ-2229/origin(这个问题是以2的倍数为物品的背包)1#include<iostream>#include<cstdio>#include<fstream>#include<algorithm>#include<cmath>#include<deque>#include<vector>#include<que......
  • Nginx请求访问控制是怎样实现的
    首先来看下什么是漏桶算法和令牌桶算法Nginx并不直接实现漏桶算法或令牌桶算法,但这些算法在控制网络流量和请求速率方面非常有用。这些算法通常在网络编程、API服务、负载均衡等领域中使用,以确保系统的稳定性和性能。漏桶算法(LeakyBucket):*漏桶算法用于限制数据的传输速率。它......