Umi@3 中最灵活的权限控制方案

简介: Umi@3 中最灵活的权限控制方案

根据我上一次提到的方案,整合实现为 Umi@3 的插件。简单的试用了一下,发现几乎可以满足所有的需求,而且在我看来应该是理解成本最低的方案。

@umijs/plugin-access-layout


使用

使用 npm:

$ npm install --save-dev @umijs/plugin-access-layout

或者使用 yarn:

$ yarn add @umijs/plugin-access-layout --dev


说明

这个插件将 plugin-access 和 plugin-layout 插件的功能整合在一起,为了支持 Umi 的约定式用法,还有更多的动态设置方案。


特性

1、支持约定式和配置式

2、动态修改权限

3、动态使用菜单

4、支持运行时配置 Pro-Layout

5、支持页面级别配置 Pro-Layout

6、支持页面级权限

7、支持页面级修改权限

8、支持不使用 Pro-layout

9、兼容 Pro 旧项目的写法


搭配其他插件

1、配套 plugin-locale 使用,会默认开始国际化的菜单

2、配合 plugin-model 使用,可以使用 useModel('@@accessLayout')

3、配合 plugin-initial-state 使用,可以不指定权限判断数据


Config 配置

accessLayout: {
  iconNames: ['smile'], // 约定式用法,需要将所有用到的 icon 名称写全,为了按需加载
  useModel: true, // 声明是否搭配了 plugin-model 使用
}


运行时配置

export const accessLayout = {
  title: "Runtime Demo",
  // Pro-Layout 支持的所有配置
}


页面级配置

 useEffect(() => {
    setLayoutConfig({
      title: 'PageSetDemo',
      // Pro-Layout 支持的所有配置
    })
  }, []);


页面级别权限控制

import { useModel } from 'umi';
const { access } = useModel("@@accessLayout");
if (access.canAdmin) {
  // canAdmin 在src/access 中定义
  // 或者使用 setAccess 设置
  console.log('access.canAdmin')
}


页面级修改权限

import { useModel } from 'umi';
const IndexPage: FC<PageProps> = ({ index, dispatch }) => {
  const { setAccess } = useModel("@@accessLayout");
  return (
    <div className={styles.center} onClick={()=>setAccess({canAdmin:false})}>
      点击操作权限
    </div>
  );
};


扩展菜单配置

可以指定部分页面不使用 layout

const menuData = [
    {
      path: '/login',
      hideLayout:true
    },
  ];


支持约定式路由用法

// src/layouts/index
import { AccessLayout } from 'umi';
const BasicLayout = (props) => {
  // 这个数据可以是任意来源的,你可以在登录之后再去获取菜单数据
  const serveMenuData = [
    {
      path: '/',
      name: 'index',
      icon: 'smile',
    },
    {
      path: '/ListTableList',
      name: 'list',
      icon: 'heart',
      access: 'canAdmin'
    },
    {
      path: '/login',
      hideLayout:true
    },
  ];
  // 这个数据会传递给 src/access.ts
  // 搭配 plugin-initial-state 使用的话,这个可以不传
  const initState = {
        currentUser: {
          access: 'admin'
        }
      };
  return (
    <AccessLayout
      initState={initState}
      menuData={serveMenuData}
      {...props}
    >
    </AccessLayout>
  );
};
export default BasicLayout;




目录
相关文章
|
3月前
|
传感器 前端开发 Android开发
在 Flutter 开发中,插件开发与集成至关重要,它能扩展应用功能,满足复杂业务需求
在 Flutter 开发中,插件开发与集成至关重要,它能扩展应用功能,满足复杂业务需求。本文深入探讨了插件开发的基本概念、流程、集成方法、常见类型及开发实例,如相机插件的开发步骤,同时强调了版本兼容性、性能优化等注意事项,并展望了插件开发的未来趋势。
67 2
|
4月前
|
存储 JavaScript 前端开发
Vue3权限控制全攻略:路由与组件层面的用户角色与权限管理方法深度解析
Vue3权限控制全攻略:路由与组件层面的用户角色与权限管理方法深度解析
451 2
|
6月前
|
开发者 存储 API
Xamarin 云服务集成竟然如此强大,简化后端开发不再是梦,数据存储、用户认证、推送通知全搞定!
【8月更文挑战第31天】Xamarin 是一款强大的跨平台移动应用开发工具,通过与云服务集成,显著简化了后端开发。开发者无需自行搭建服务器,即可利用云服务提供的数据存储、用户认证、推送通知等功能,大幅减少数据库设计、服务器配置及 API 开发的时间成本。借助 Azure Mobile Apps 等云服务,Xamarin 可轻松实现数据存取操作,同时增强应用安全性与用户参与度,使开发者更专注于业务逻辑和用户体验,提升开发效率并降低成本。这种方式在快速发展的移动应用领域极具价值。
83 0
|
9月前
|
移动开发 HTML5
小气泡功能在中的两种实现方案
小气泡功能在中的两种实现方案
75 0
小气泡功能在中的两种实现方案
|
9月前
|
前端开发 JavaScript 测试技术
构建高效前端项目:模块化与组件化策略
【2月更文挑战第25天】 在现代网页开发中,随着用户对于网页性能和交互体验的期待不断提升,前端项目的复杂性也随之增加。为了应对这种复杂性并提高开发效率,本文将探讨模块化与组件化在前端项目中的应用策略。通过分析这两种方法的优势与适用场景,我们将揭示如何利用它们来优化项目结构,提升代码复用率,以及加快开发流程。
168 4
|
9月前
模块功能复用和扩展性
模块功能复用和扩展性 模块功能复用和扩展性是软件工程中的重要概念,主要体现在设计和实现阶段。
127 1
|
9月前
|
前端开发 JavaScript API
SPA与前端路由:构建无缝体验的现代前端应用
在前端开发领域,单页面应用(SPA)和前端路由成为了构建现代、高度交互性的应用程序的重要技术。本文将探讨SPA的优势以及前端路由的实践,帮助读者更好地理解如何利用这些技术来提升用户体验和开发效率。
120 1
|
存储 前端开发 JavaScript
前后端分离如何做权限控制设计?
近几年随着react、angular、vue等前端框架兴起,前后端分离的架构迅速流行。但同时权限控制也带来了问题。 网上很多前、后端分离权限仅仅都仅仅在描述前端权限控制、且是较简单、固定的角色场景,满足不了我们用户、角色都是动态的场景。 且仅仅前端进行权限控制并不是真正意义的权限控制,它只是减少页面结构暴露、增强用户体验的功效。
前后端分离如何做权限控制设计?
|
设计模式 数据安全/隐私保护
高效接入第三方登录且易扩展的方法
我们使用适配模式来实现一个实际的业务场景,解决实际问题。年纪稍微大一点的小伙伴一定经历过这样的过程。很早以前开发的老系统应该都有登录接口,但是随着业务的发展和社会的进步,单纯地依赖用户名密码登录显然不能满足用户需求。现在,大部分系统都已经支持多种登录方式,如QQ登录、微信登录、手机登录、微博登录等,同时保留用户名密码的登录方式。虽然登录形式丰富,但是登录后的处理逻辑可以不必改,都是将登录状态保存到Session,遵循开闭原则。首先创建统一的返回结果ResultMsg类。
169 0
|
开发工具 Android开发
Android推送集成方案总结
刚做完推送集成方案,记录下坑。 这里记录的特性和使用时针对写blog时采用的sdk的,具体使用流程和限制还请参考官方给出的sdk. #### 1、推送规则 小米手机用小米推送; 华为手机用华为推送; 其他手机用友盟推送。