• 前端 权限控制 方式


    权限管理

    项目中经常有的场景是不同的用户的权限不同。

    • 不同的用户在页面中可以看到的元素和操作不同(控制元素显示和操作按钮)
    • 不同的用户对页面的访问权限不同(控制路由菜单)

    页面权限跟页面菜单 id 绑定。获取当前页面id后,找到对应的页面权限,控制页面按钮或者模块的显示隐藏。后端同步控制校验对应请求路由的权限。

    菜单管理 (只是维护信息)

    菜单绑定:页面元素和页面操作

    页面元素:【元素标志】【元素名称】【操作->控制当前页面元素数据记录的增删改查】

    页面操作:【操作标志】【操作名称】【API】

    权限管理 (给角色授权菜单、操作、显示权限)

    勾选菜单:给当前用户赋予可以展示的菜单

    勾选操作:在有权限的菜单下勾选操作和显示权限

    授予角色

    权限基础信息维护好后,给用户授予角色(权限组)

    Vue 可以基于全局指令来实现

    Raect 可以基于 umi.js access 插件

    // src/access.ts
    export default function(initialState) {
      const { userId, role, isAdmin, hasRoutes = [] } = initialState; // 后端维护和组织好权限数据
      // 返回一个权限对象、每一个key对应一个布尔值(一个操作权限)
      return {
        canReadFoo: true,
        canUpdateFoo: role === 'admin',
        canDeleteFoo: foo => {
          return foo.ownerId === userId;
        },
       adminRouteFilter: () => isAdmin, // 只有管理员可访问 
        normalRouteFilter: (route) => hasRoutes.includes(route.name), // initialState 中包含了的路由才有权限访问
    
      };
    }

      

    路由和菜单的权限控制

    routes: [
        {
          path: '/foo',
          name: 'foo',
          // ...
          access: 'normalRouteFilter', // 会调用 src/access.ts 中返回的 normalRouteFilter 进行鉴权
        },
        {
          path: '/admin',
          name: 'admin',
          // ...
          access: 'adminRouteFilter', // 会调用 src/access.ts 中返回的 adminRouteFilter 进行鉴权
        },
    ]
    

      

      

    页面内的权限控制

    import React from 'react';
    import { useAccess, Access } from 'umi';
    
    const PageA = (props) => {
      const { foo } = props;
      const access = useAccess(); // access 实例的成员: canReadFoo, canUpdateFoo, canDeleteFoo
    
      if (access.canReadFoo) {
        // 任意操作
      }
    
      return (
        <div>
          <Access accessible={access.canReadFoo} fallback={<div>Can not read foo content.</div>}>
            Foo content.
          </Access>
          <Access accessible={access.canUpdateFoo()} fallback={<div>Can not update foo.</div>}>
            Update foo.
          </Access>
          <Access accessible={access.canDeleteFoo(foo)} fallback={<div>Can not delete foo.</div>}>
            Delete foo.
          </Access>
        </div>
      );
    };
    

      

      

  • 相关阅读:
    bzoj3159: 决战
    Codeforces Round #516 (Div. 1, by Moscow Team Olympiad) C
    Codeforces Round #516 (Div. 1, by Moscow Team Olympiad) B
    Codeforces Round #516 (Div. 1, by Moscow Team Olympiad) A
    loj 6401 字符串
    BZOJ5194 雪地靴
    BZOJ 4709 柠檬
    BZOJ 3343 魔法
    [8月16日绍兴]试剂
    设备塔
  • 原文地址:https://www.cnblogs.com/winyh/p/14077738.html
Copyright © 2020-2023  润新知