资讯专栏INFORMATION COLUMN

Alain 菜单权限控制

seanlook / 799人阅读

摘要:为用户进行设置角色,登陆系统后,用户可使用其拥有角色对应的所有菜单。负责后台用户的菜单授权。这里仅实现了菜单的隐藏,需要再编写权限控制逻辑,使我们的系统更安全,但那是我们以后要考虑的事情。

问题描述

动态菜单管理,用户对应角色,角色对应菜单。

为用户进行设置角色,登陆系统后,用户可使用其拥有角色对应的所有菜单。

功能实现很简单,这里就不进行代码的讲解了,直接讲一下我所实现的思路。

实现 原设计

系统设置中,前台菜单遵循如下格式:

menus: [
    {
        text: "主导航",
        group: true,
        children: [
            {
                text: "首页",
                link: "/main",
                icon: "anticon anticon-compass"
            },
            {
                text: "系统设置",
                link: "/setting",
                icon: "anticon anticon-setting"
            }
        ],
    }
]

所以最开始的思路也很简单,后台的Menu实体中存储菜单所有相关的信息。

后台直接就查出当前登录用户所有的菜单,前台根据返回来的菜单数据构建前台菜单。

问题

能实现肯定是能实现,但我们进行设计时,考虑的不应仅仅是实现,考虑的更多的是我这么实现,效率高不高?以后好不好改?能不能被以后维护的人员快速理解?

斟酌之后,断然抛弃了这种实现,因为,不能把所有的数据都放在后台。

就拿icon字段来说,如果我们采用了上述实现:

那当我们以后想修改前台菜单图标的时候,需要去修改后台的数据初始化。这显然不合理,以后维护的人员肯定会存在一个疑问,这是谁设计的菜单?我改个前台的图标为什么要动后台?

新设计

既然不能讲数据都放在后台,那前后台就各司其职。

前台:包含菜单名称,菜单图标,菜单路由等信息。负责前台菜单的格式显示。

后台:只保留,菜单名,菜单路由,父菜单三项信息。负责后台用户的菜单授权。

核心思想就是:前台配置好所有的菜单,但默认将菜单隐藏。

应用启动时,查询后台接口,获取当前用户的所有授权菜单,授权一个,前台就显示一个。

前台菜单:写菜单时将hide置为true,默认隐藏。

menus: [
    {
        text: "主导航",
        group: true,
        children: [
            {
                text: "首页",
                link: "/main",
                hide: true,
                icon: "anticon anticon-compass"
            },
            {
                text: "系统设置",
                link: "/setting",
                hide: true,
                icon: "anticon anticon-setting"
            }
        ]
    }
]

然后就是具体的逻辑,先获取前台的菜单,即所有菜单。

获取当前用户授权菜单列表,以路由表示该菜单唯一,如果路由被授权,就把hide置为false

/**
 * 获取所有被授权的菜单
 */
getAllAuthMenu(): Observable> {
    // 获取前台菜单
    const menus = AppConfig.menus as Array;
    return this.httpClient.get("/menu/allAuthMenu")
        .pipe(map((allAuthMenus: Array) => {
            // 对菜单进行处理
            menus.forEach((menu: Menu) => {
                menu.children.forEach((childMenu: Menu) => {
                    childMenu.hide = !WebAppMenuService.checkMenuAuthOrNot(childMenu, allAuthMenus);
                });
            });
            return menus;
        }));
}
总结
先完成,再完美。这里仅实现了菜单的隐藏,需要再编写权限控制逻辑,使我们的系统更安全,但那是我们以后要考虑的事情。现在先加个TODO

先把客户想要的功能先实现了,至于你实现得如何,代码如何,客户统统不关心,我们在先满足客户对开发速度需求的前提下,以后再抽出时间将程序的某些功能完美。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/73480.html

相关文章

  • 发布 ng-alain 1.0.0 正式版

    摘要:发布时我就想说那得喝一杯,这个版本的等待其实在社区里反应是有点忐忑,所以当跟我说来今天要发布时我说那晚上得喝一杯。当然,今天也算是个不错的日子,也发布了正式版。发布没多久,带来了一些很酷的操作。希望真正做到让开发者更加专注于业务。 ng-zorro-antd 0.7.0 发布时我就想说那得喝一杯,这个版本的等待其实在社区里反应是有点忐忑,所以当VTHINK跟我说来今天要发布 0.7 时...

    dreamtecher 评论0 收藏0
  • Angular 容器部署

    摘要:很多人反应很难访问,所以转移到阿里云服务器上,因此做了一次完整的容器部署。在容器化过程中,我们并未配置任何等,只是保留服务所需的配置项而已,而这一部分我们可以放在反向代理层完成。 很多人反应很难访问 Github Page,所以 ng-alain.com 转移到阿里云服务器上,因此做了一次完整的 Angular 容器部署。 以下我会阐述 ng-alain 整个过程,其中包括 Docke...

    tracy 评论0 收藏0
  • Angular 容器部署

    摘要:很多人反应很难访问,所以转移到阿里云服务器上,因此做了一次完整的容器部署。在容器化过程中,我们并未配置任何等,只是保留服务所需的配置项而已,而这一部分我们可以放在反向代理层完成。 很多人反应很难访问 Github Page,所以 ng-alain.com 转移到阿里云服务器上,因此做了一次完整的 Angular 容器部署。 以下我会阐述 ng-alain 整个过程,其中包括 Docke...

    alighters 评论0 收藏0
  • 从0到1搭建element后台框架之权限

    摘要:项目中按钮权限注册全局自定义指令来完成的。如果对自定义指令不熟的话可以查阅官方文档。相关文章链接从到搭建后台框架打包优化从到搭建后台框架优化篇 前言 首先还是谢谢各位童鞋的大大的赞赞,你们的支持是我前进的动力!上周写了一篇从0到1搭建element后台框架,很多童鞋留言提到权限问题,这一周就给大家补上。GitHub 一、jwt授权认证 现在大多数项目都是采用jwt授权认证,也就是我们所...

    NervosNetwork 评论0 收藏0
  • vue权限管理系统

    摘要:权限系统后台管理系统一般都会有权限模块,用来控制用户能访问哪些页面和哪些数据接口。大多数管理系统的页面都长这样。表为角色权限关联表,一个角色拥有哪些权限是通过这张表查出来的。这样就是一个账号角色权限的关系。 vue权限系统 后台管理系统一般都会有权限模块,用来控制用户能访问哪些页面和哪些数据接口。大多数管理系统的页面都长这样。 showImg(https://segmentfault...

    bovenson 评论0 收藏0

发表评论

0条评论

seanlook

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<