利用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 中如何实现动态菜单
1533 0
020 Umi@4 中如何实现动态菜单
|
测试技术 Windows
umi如何配置环境变量
umi如何配置环境变量
1231 0
|
数据采集 人工智能 Ubuntu
MyEMS开源能源管理系统开发工具
MyEMS 是一款基于 ISO 50001 标准的开源能源管理系统,支持建筑、工厂等场景的电、水、气等能源数据采集与分析,提供光伏、储能、微电网、AI 优化等功能。系统采用开源工具开发,包括 PyCharm、VS Code、Docker、Ubuntu 等,并搭配 MySQL 数据库及 DBeaver 客户端,助力企业实现低碳发展。社区版完全免费,适合开发者学习和部署。下载地址:[https://gitee.com/myems/myems](./https://gitee.com/myems/myems)。
793 32
|
移动开发 前端开发 JavaScript
React 图片裁剪组件 Image Cropper
本文介绍了在React中实现图片裁剪功能的方法,涵盖基础知识、常见问题及解决方案。首先,通过第三方库如`react-image-crop`或`cropperjs-react`可轻松实现图片裁剪。接着,针对性能和兼容性问题,提供了优化图片加载、处理裁剪区域响应慢、解决浏览器差异等方案。最后,通过代码案例详细解释了如何创建一个基本的图片裁剪组件,并提出了优化建议,如使用`React.memo`、添加样式支持及处理大图片预览,帮助开发者避免常见错误并提升用户体验。
1079 67
|
Java
Java aop 如何获取请求头里的token
【8月更文挑战第13天】Java aop 如何获取请求头里的token
496 0
|
存储 索引
antd中table组件选中单行换样式(比如背景颜色)
在Ant Design (antd)的Table组件中,可以通过设置`onRow`属性来定义行点击事件,从而改变被点击行的样式,如背景颜色。`onRow`是一个函数,返回一个对象,对象包含事件处理函数,如`onClick`。同时,使用`rowClassName`属性来指定行的类名,结合状态管理,可以实现点击某行后改变其背景颜色的效果。具体实现时,需要在组件状态中保存当前被点击行的索引,然后通过`rowClassName`判断并返回相应的类名。
1956 2
antd中table组件选中单行换样式(比如背景颜色)
|
JSON JavaScript 前端开发
面试官:JS判断对象为空有几种方法?
面试官:JS判断对象为空有几种方法?
Vue3进度条(Progress)
这是一个基于 Vue2 的进度条组件,支持线性 (`line`) 和圆形 (`circle`) 两种模式。可通过多种属性自定义进度条的样式和行为,包括宽度、进度百分比、颜色、线宽、线帽样式等。此外,还支持显示进度文本或图标,并允许通过插槽自定义内容。该组件提供了丰富的配置选项,适用于多种应用场景。
2032 5
Vue3进度条(Progress)
|
存储 前端开发 JavaScript
React 文件上传组件 File Upload
本文介绍了如何在 React 中实现文件上传组件,包括基本的概念、实现步骤、常见问题及解决方案。通过 `&lt;input type=&quot;file&quot;&gt;` 元素选择文件,使用 `fetch` 发送请求,处理文件类型和大小限制,以及多文件上传和进度条显示等高级功能,帮助开发者构建高效、可靠的文件上传组件。
1184 3
|
前端开发 UED 开发者
React 表格组件设计
本文介绍了 React 表格组件的设计,涵盖基本表格、虚拟滚动表格、可编辑表格和响应式表格。详细探讨了常见问题、易错点及解决方法,并提供了代码示例,帮助开发者提升表格组件的性能和用户体验。
617 5

热门文章

最新文章