利用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中的逻辑。

目录
相关文章
|
4月前
|
JavaScript Java 测试技术
基于springboot+vue.js+uniapp的一卡通密钥管理系统附带文章源码部署视频讲解等
基于springboot+vue.js+uniapp的一卡通密钥管理系统附带文章源码部署视频讲解等
26 2
|
16天前
|
开发框架 移动开发 前端开发
除了 HMR 插件,还有哪些技术可以实现热更新?
【10月更文挑战第23天】不同的热更新技术都有其特点和适用场景。开发者需要根据项目的具体需求和技术架构,选择合适的热更新技术来提高开发效率和用户体验。同时,随着技术的不断发展,热更新技术也在不断创新和完善,未来可能会出现更多更先进的热更新技术和方法。
|
4月前
|
前端开发 数据安全/隐私保护 开发者
vue3 组件级权限控制
vue3 组件级权限控制
52 1
|
5月前
|
存储 数据库 数据安全/隐私保护
Duplicator插件的主要功能是什么?
【6月更文挑战第4天】Duplicator插件的主要功能是什么?
53 1
|
6月前
|
资源调度 JavaScript 开发者
插件使用:扩展Vue功能与第三方插件
【4月更文挑战第23天】Vue凭借其轻量级和灵活性在Web开发中备受青睐,而插件则进一步增强了其功能。本文探讨了如何在Vue项目中选择、安装、配置和管理插件,以适应不同需求。要点包括:选择可靠且兼容的插件,使用npm或yarn安装,根据文档配置,以及注意性能影响。明智使用插件能提升开发效率,但需避免过度依赖,确保与项目目标和技术栈匹配。不断学习新插件,可保持技术领先并优化项目实践。
73 0
|
前端开发 NoSQL 数据库
Vue3 + Nest 实现权限管理系统 后端篇(三):基于RBAC 权限控制实现
RBAC(Role Based Access Control)是基于角色的权限控制,简单来说就是给用户赋予一些角色,那么该用户就会拥有这些角色的所有权限。接下来我们就用 NestJS 来实现基于 RBAC 的权限控制
420 0
Vue3 + Nest 实现权限管理系统 后端篇(三):基于RBAC 权限控制实现
|
6月前
|
缓存 前端开发 NoSQL
ruoyi-vue前后端分离项目权限控制以及登录流程详细笔记
ruoyi-vue前后端分离项目权限控制以及登录流程详细笔记
664 0
|
前端开发 Python
DRF--路由组件和版本控制
DRF--路由组件和版本控制
|
前端开发 数据安全/隐私保护
Vue3 + Nest 实现权限管理系统 后端篇(一):NestJS入门与基础配置(下)
Vue3 + Nest 实现权限管理系统 后端篇(一):NestJS入门与基础配置(下)
290 0
|
前端开发 数据可视化 JavaScript
Vue3 + Nest 实现权限管理系统 后端篇(一):NestJS入门与基础配置(上)
Vue3 + Nest 实现权限管理系统 后端篇(一):NestJS入门与基础配置(上)
845 0