WxPython跨平台开发框架之模块字段权限的管理

在我的很多Winform开发项目中,统一采用了权限管理模块来进行各种权限的控制,包括常规的功能权限(工具栏、按钮、菜单权限),另外还可以进行字段级别的字段权限控制,字段权限是我们在一些对权限要求比较严格的系统里面涉及到的,可以对部分用户隐藏一些敏感的信息,或者禁止不够权限的用户编辑它。本篇随笔介绍基于这一理念,实现在WxPython跨平台开发框架中的模块字段权限的管理。

1、字段权限的设计

字段的权限控制,一般就是控制对应角色人员的对某个模块的一些敏感字段的可访问性:包括可见、可编辑性等处理。

在设计字段权限的时候,我们需要了解这些也是基于RBAC的概念,基于角色进行授权的,而且我们的字段列表是属于具体的业务对象列表的,这里的业务对象是指一些我们具体的业务模块,如客户基础信息、人员基础信息、报价单等等,我们就是基于这些业务进行字段的控制的。

为了实现对业务模型的字段控制,我们在数据库中设计两个数据库,一个用于存储对应实体类名称的信息,如ID,实体类全名,类路径等主体信息;一个存储对应角色配置的字段列表信息,结合起来就可以实现对应角色的字段权限控制了,数据库表设计信息如下所示。

WxPython跨平台开发框架之模块字段权限的管理

如下界面所示,我们在权限系统里面也可以对其字段进行权限控制,如下图所示。先选择左边的具体角色,然后添加一些业务对象,并设置它们的权限即可。

WxPython跨平台开发框架之模块字段权限的管理

首次业务对象需要用户加入,这里以wxpython前端框架的实体类进行字段信息的标识处理,如下所示可以加载对应业务信息。

WxPython跨平台开发框架之模块字段权限的管理

确认后,系统记录对应角色对业务模块中的相关字段的权限处理。

我们在业务对象列表的【显示设置】处可以单击旁边的按钮,在弹出的界面上进行条件的设置,如下界面效果所示。

WxPython跨平台开发框架之模块字段权限的管理

这样我们就完成了对某个业务对象的各个字段进行配置了,具体的字段控制在业务模块里面添加部分代码即可实现了。

2、业务模块对字段控制的处理

如下面列表界面,对于隐藏的字段,统一进行符号的遮挡处理,即使导出Excel数据,结果也是替代。

WxPython跨平台开发框架之模块字段权限的管理

同时,如果系统界面有新增或者编辑界面,那么我们也需要隐藏才可以达到效果,如下是其的编辑界面效果(隐藏显示年龄字段了)。

WxPython跨平台开发框架之模块字段权限的管理

如果仅仅是禁止编辑,那么我们配置角色对该字段不允许编辑即可。

WxPython跨平台开发框架之模块字段权限的管理

那么用户对应客户信息模块的年龄字段可以看到,但是不能编辑。

WxPython跨平台开发框架之模块字段权限的管理

3、字段权限的列表控制处理

前面我们介绍了在权限系统中进行业务对象的字段权限的设置流程,以及以其中的【客户信息】的业务模块进行的演示,那么我们如何才能在自己的业务模块里面进行控制处理的呢?

首先我们需要在业务列表绑定的时候,需要获取我们当前用户能够访问的字段列表,默认是全部可见,但是如果用户设置了条件,那么就需要获取对应的权限列表进行控制了,具体的控制代码如下所示。

在我的WxPython跨平台开发框架中,我们对于常规窗体列表界面做了抽象处理,一般绝大多数的逻辑封装在基类上,基类提供一些可重写的函数给子类实现弹性化的处理。

WxPython跨平台开发框架之模块字段权限的管理

有了基类的挡箭牌,我们就可以统一在上面进行列表界面中字段权限的判断处理了。

我们在基类窗体的类上,对更新表格数据的处理进行调整,增加对字段权限的获取,在传递给实际更新表格的接口即可,如下代码所示。

WxPython跨平台开发框架之模块字段权限的管理

由于在窗体基类,可以获得对泛型类型的一些属性,因此我们也就直接获得该对象的字段权限的配置了,如下代码所示。

```
async def get_columns_permit(self) -> dict[str, int]:
        """获取当前用户对该模块的列权限字典"""

        # 1、获得对象的模块路径+类名
        entityFullName = f"{self.model.__module__}.{self.model.__name__}"

        # 2、获取当前用户对该模块的列权限字典
        result = await api_fieldpermit.get_columns_permit(
            entityFullName, settings.CurrentUser.id
        )
        return result
```

因为对客户信息的实体类,我们在数据库的表中配置的记录如下所示。

WxPython跨平台开发框架之模块字段权限的管理

根据实体类全称和字段名称,以及对应该用户的角色ID,我们就能唯一确定该字段的权限了。

因此我们在自定义的表格数据对象中,设置返回的单元格值进行控制处理即可进行脱敏处理了。

WxPython跨平台开发框架之模块字段权限的管理

由于我们的表格数据默认就是只读的,因此只需要判断隐藏的进行脱敏处理即可。

通过上面的控制,就可以实现列表中对字段的统一控制处理了。对于不同的业务表对象,都不需要单独的进行设置,已经在基类统一处理相关的逻辑了。

3、字段权限的显示窗体控制处理

如果在开发界面的时候,把列表的展示统一放在wx.Grid列表控件进行展示,不再独立设计展示窗体,那么上面列表控制就已经达到了字段权限的控制目的了:可见或不可见、可编辑或只读等处理。

在我的wxpython开发框架中,我一般倾向于设计一个界面来展示业务对象的内容,一般新增,查看或者编辑都放在这个窗体上展示信息,比较直观,那么这种对字段权限的控制也需要延伸到这个显示窗体上;

对于普通的编辑控件,我们只能控制控件的可读写、可见与否的处理。为了避免重复对字段权限的请求,我们在列表界面请求获得的字段权限列表,可以传递给新增、编辑对话框界面,如下代码是在子类列表界面,打开新增、编辑对话框的时候进行的处理。

```
async def OnEditById(self, entity_id: Any | str):
        """子类重写-根据主键值打开编辑对话框"""
        # 使用列表窗体获得的字段权限
        dlg = FrmCustomerEdit(self, entity_id, columns_permit=self.columns_permit)
        # if dlg.ShowModal() == wx.ID_OK:
        if await AsyncShowDialogModal(dlg) == wx.ID_OK:
            # 更新grid列表数据
            await self.update_grid()
        dlg.Destroy()
```

可以看到,已经对字段权限的字典对象进行了传递,方便使用,避免重复请求了。

一般常规的新增、编辑界面,我们对它们也是进行了基类的封装处理,以便对界面元素进行更好的统一控制。

WxPython跨平台开发框架之模块字段权限的管理

详细的基类设计如下所示,如对于客户信息的新增、编辑对话框,关系图如下所示。

WxPython跨平台开发框架之模块字段权限的管理

由于新增/编辑对话框中,往往使用我们自定义的控件进行处理,因此在自定义控件中,可以再初始化函数的时候,添加一个 permit 的属性字段,然后进行判断控件的处理即可。

```
# 字段权限,默认0表示不限制,1表示只读,2 隐藏
        self.permit = permit
        if permit == 2:
            self.Hide()  # 隐藏
        elif permit == 1:
            self.ReadOny()  # 只读
        else:
            pass  # 不限制
```

而对于非自定义的控件,我们就需要再外部初始化的时候,对它们进行一些额外的处理控制显示了。

```
age_permit = self.columns_permit.get("age", 0)
    self.txtAge = wx.SpinCtrl(panel, permit=age_permit)
    if age_permit == 2:
        self.txtAge.Hide()  # 隐藏
    elif age_permit == 1:
        self.txtAge.Disable()  # 只读
```

那么用户对应客户信息模块的年龄字段可以看到,但是不能编辑。

WxPython跨平台开发框架之模块字段权限的管理

由于新增、编辑界面是属于子类完全自定义控件和展示的逻辑,因此无法在基类统一进行处理,但是可以通过自定义控件的方式,减少过多的干预处理。

对于列表界面,则是 可以进行统一的字段的控制展示,比较一致。

以上就是字段权限的设计思路,实现控制过程,这样我们在权限里面实现了功能权限、菜单权限、数据记录权限、字段权限的综合控制 ,基本上能够满足大多数业务规则的要求了,从而提高了权限管理系统在整个应用开发中的通用性、便利性,一致性。

文章整理自互联网,只做测试使用。发布者:Lomu,转转请注明出处:https://www.it1024doc.com/5419.html

(0)
LomuLomu
上一篇 2025 年 1 月 6 日 下午6:47
下一篇 2025 年 1 月 6 日 下午7:48

相关推荐

  • 扣子又出新功能,支持一键部署小程序,太强了!!

    大家好,我是R哥。 作为一名程序员和技术博主,我一直关注如何使用工具提升生产力,尤其是在内容创作和应用开发领域。 拿我开发一个微信小程序为例,我需要懂前端、后端、运维 等全栈技术,开发流程和技术栈复杂,我还需要购买云服务器、云数据库 等各种基础设施,资源耗费非常多。 虽然现在有如 Cursor 这样的革命性 AI 开发工具,它突破了传统开发模式的壁垒,非开发…

    2025 年 1 月 11 日
    50600
  • Java内存泄漏问题的高效排查与优化指南

    目录导航1. 系统化诊断与优化框架2. 内存快照获取技术2.1 自动生成堆转储文件2.2 手动创建堆转储文件3. 专业分析工具应用3.1 内存分析工具MAT3.2 性能分析工具JProfiler3.3 企业级专用工具4. 深度排查内存泄漏4.1 内存差异对比分析4.2 可疑泄漏对象检测4.3 内存占用大户识别4.4 不可达对象追踪5. 问题确认与验证6. 代…

    2025 年 5 月 13 日
    20900
  • java: JDK isn‘t specified for module ‘product-service‘问题解决

    目录 问题 解决方法 1.打开File->Project Structure… 2.将Project SDK修改为17 Oracle OpenJDK 17.0.12,并Apply,OK 问题 添加module后报错:java: JDK isn’t specified for module ‘product-service’ 查看pom.xml文件也添加了…

    2025 年 1 月 11 日
    48600
  • 【C++】深入解析explicit关键字的奥秘(从原理到实践全面掌握explicit的用法)

    目录导航一、开篇引言二、揭开explicit的神秘面纱三、构造函数的隐式转换机制🍏单参数构造函数的隐式转换🔍explicit关键字的引入契机🍊多参数构造函数的特殊情况🔍explicit的实际应用价值🔍explicit的正确使用姿势四、核心要点回顾五、学习寄语 一、开篇引言 在日常C++编程实践中,explicit关键字可能并不常见于我们的代码中。然而,在标准…

    2025 年 5 月 15 日
    17100
  • 思维导图xmind如何安装?附安装包

    前言 大家好,我是小徐啊。我们在Java开发中,有时候是需要用到思维导图的,这可以帮助我们更好的理清思路,提高开发的效率。而说到思维导图,最有名的就是xmind了,它的功能十分强大,几乎是思维导图里面最强大的那一个。但是,默认只能使用初级功能,高级功能需要额外再开通,今天小徐就来介绍下如何安装xmind以及升级,让我们可以使用pro的功能。文末附获取方式。 …

    2025 年 1 月 11 日
    55500

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信