利用umi插件快速实现权限控制

简介: 本文介绍在umijs3中如何利用内置插件快速集成权限管理功能。

umi3内置了@umijs/plugin-access可以快速实现精细的权限控制功能,本文将会实现页面级的权限功能,并给出实现代码。

本文使用的的umi版本为3.x。

关于 @umijs/plugin-access

src/access.ts 时启用。

我们约定了 src/access.ts 为我们的权限定义文件,该文件需要默认导出一个方法,导出的方法会在项目初始化时被执行。该方法需要返回一个对象,对象的每一个值就对应定义了一条权限。

按照文档,我们将实现一个可读权限,没有权限时显示404页面。

// src/access.ts
export default function (initialState) {
  const { userInfo } = initialState;

  return {
   read: userInfo.userName === 'abc',
  };
}

关于 @umijs/plugin-initial-state

上面代码中的initialState来源于另一个插件@umijs/plugin-initial-state:

src/app.ts 并且导出 getInitialState 方法时启用。

按文档说明,添加如下配置:

export function getInitialState() {
  return new Promise((resolve) => {
    // 模拟 api请求获取用户信息
    setTimeout(
    () => {
        resolve({
        userInfo: { userName: 'abc' },
      });
    }, 500);
   });
}

正常情况下,应该可以在src/.umi目录下看到生成的plugin-initial-stateplugin-access目录,表示我们成功启用了这两个插件。

代码中使用

全局设置

一般umi项目中会有一个全局的布局文件 src/layouts/index.ts,里面组件的props.children为当前路由需要渲染的页面,我们可以在这里对权限进行判断,没有权限时显示404页面:

import NotFound from '@/pages/404';
import { useAccess } from 'umi';

const { children } = props;
const access = useAccess();
const authChildren = access.read ? children : <NotFound />;
 

把要渲染的组件换成authChildren即可。

其他页面设置

@umijs/plugin-access还提供了Access组件:

import { useAccess, Access } from 'umi';
import NotFound from '@/pages/404';

const EditPage = props => {

  const access = useAccess(); 
 
  return (
    <div>
      <Access
        accessible={access.write}
        fallback={<NotFound />}
      >
        Edit page
      </Access>
    </div>
  );
};

其他

这部分主要讲讲实践中遇到的问题以及解决方法。

与dva状态同步

我们一般会把用户信息存放在dva model中,如果我们在getInitialState中调用了获取了用户信息的方法,我们可以同步到dva model中,省去了在dva中触发effect再调用一次相同的接口:

// src/access.ts
import { getDvaApp } from 'umi';

export default function (initialState) {
  const { userInfo } = initialState;

  // 触发reducer
  getDvaApp()._store.dispatch({ type: 'common/update', userInfo });
  
  return {
   read: userInfo.userName === 'abc',
  };
}

如何动态修改access中的值?

翻一下插件生成的代码找找思路:

// src/.umi/plugin-access/AccessProvider.ts
  const { initialState } = useModel('@@initialState');

  const access: AccessInstance = useMemo(() => accessFactory(initialState as any), [initialState]);

  return React.createElement(
    AccessContext.Provider,
    { value: access },
    React.cloneElement(children, {
      ...children.props,
      routes:traverseModifyRoutes(props.routes, access)
    }),
  );

可以看到,只是在根元素外面套了一层context,而我们要动态修改的,是这个access的值。它在一个useMemo中返回, 因此我们要修改access,只需修改initalState即可。

而修改initalState的方法很简单:

import { useModel } from 'umi';

const { initialState, setInitialState } = useModel('@@initialState');

setInitialState({ ...initialState, userInfo: { userName: 'newUser' } });

即可触发access的修改, 重新执行src/access.ts中的逻辑。

目录
相关文章
|
前端开发 JavaScript API
020 Umi@4 中如何实现动态菜单
020 Umi@4 中如何实现动态菜单
1510 0
020 Umi@4 中如何实现动态菜单
|
域名解析 监控 JavaScript
宝塔面板pm2管理器部署node.js(express框架)sever文件,可以使用域名访问你的后端项目
宝塔面板pm2管理器部署node.js(express框架)sever文件,可以使用域名访问你的后端项目
2531 0
|
JavaScript 安全 Java
如何使用 Spring Boot 和 Ant Design Pro Vue 实现动态路由和菜单功能,快速搭建前后端分离的应用框架
本文介绍了如何使用 Spring Boot 和 Ant Design Pro Vue 实现动态路由和菜单功能,快速搭建前后端分离的应用框架。首先,确保开发环境已安装必要的工具,然后创建并配置 Spring Boot 项目,包括添加依赖和配置 Spring Security。接着,创建后端 API 和前端项目,配置动态路由和菜单。最后,运行项目并分享实践心得,包括版本兼容性、安全性、性能调优等方面。
882 1
|
数据采集 人工智能 Ubuntu
MyEMS开源能源管理系统开发工具
MyEMS 是一款基于 ISO 50001 标准的开源能源管理系统,支持建筑、工厂等场景的电、水、气等能源数据采集与分析,提供光伏、储能、微电网、AI 优化等功能。系统采用开源工具开发,包括 PyCharm、VS Code、Docker、Ubuntu 等,并搭配 MySQL 数据库及 DBeaver 客户端,助力企业实现低碳发展。社区版完全免费,适合开发者学习和部署。下载地址:[https://gitee.com/myems/myems](./https://gitee.com/myems/myems)。
722 32
|
存储 索引
antd中table组件选中单行换样式(比如背景颜色)
在Ant Design (antd)的Table组件中,可以通过设置`onRow`属性来定义行点击事件,从而改变被点击行的样式,如背景颜色。`onRow`是一个函数,返回一个对象,对象包含事件处理函数,如`onClick`。同时,使用`rowClassName`属性来指定行的类名,结合状态管理,可以实现点击某行后改变其背景颜色的效果。具体实现时,需要在组件状态中保存当前被点击行的索引,然后通过`rowClassName`判断并返回相应的类名。
1892 2
antd中table组件选中单行换样式(比如背景颜色)
Vue3进度条(Progress)
这是一个基于 Vue2 的进度条组件,支持线性 (`line`) 和圆形 (`circle`) 两种模式。可通过多种属性自定义进度条的样式和行为,包括宽度、进度百分比、颜色、线宽、线帽样式等。此外,还支持显示进度文本或图标,并允许通过插槽自定义内容。该组件提供了丰富的配置选项,适用于多种应用场景。
1992 5
Vue3进度条(Progress)
|
关系型数据库 Go 开发工具
|
JSON 中间件 数据格式
Gin框架学习笔记(六)——gin中的日志使用
Gin框架学习笔记(六)——gin中的日志使用
1381 0
|
网络协议 C++ Docker
Docker pull拉取镜像报错“Error response from daemon: Get "https://registry-1.docker.io/v2”解决办法
Docker pull拉取镜像报错“Error response from daemon: Get "https://registry-1.docker.io/v2”解决办法
71619 2
|
API 网络架构
016 Umi 项目中的菜单与权限
016 Umi 项目中的菜单与权限
1903 0
016 Umi 项目中的菜单与权限