根据用户权限隐藏/禁用 GUI 元素的最佳方法?

2024-02-23

我正在启动一个 Web 应用程序,其客户端在纯 ExtJS 中实现,中间层在 Grails 中实现。该应用程序具有基于角色的授权,其中用户可以拥有许多细粒度的角色,例如 SOME_FORM_READ、SOME_FORM_UPDATE、SOME_DATA_DELETE、SOME_DATA_READ 等。根据用户的角色,某些 GUI 元素需要禁用或隐藏,而其他元素则需要禁用或隐藏。处于只读模式。

我在网上做了一些搜索,但没有找到任何专门解决这个问题的设计模式,所以我想出了自己的设计。我确信很多 Web 应用程序都会有类似的要求,所以我想在这里发布我的设计并听听人们对此的意见。我的设计绝不是完美的,但我希望它能在大家的意见下得到改进。虽然我正在使用 ExtJS,但总体设计也应该适用于类似的框架,如 GWT、Flex、Swing 等。

所以,事情是这样的:

我们需要在客户端层处理有关授权的四种类型的代码(或信息):

  1. GUI元素操作代码,例如:

    面板.隐藏() form.setReadOnly(true)

  2. GUI元素权限要求,例如:

    form.requires('READ', 'FORM_READ_ROLE')

    adminPanel.requires('ADMIN_ROLE')

  3. 用户权限信息,基本上是用户拥有的角色列表;

  4. 授权逻辑:根据用户权限决定隐藏/禁用哪些元素;

设计的核心是一个单例,名为GUIPermissionManager,简称GPM。这是一种集中式设计,大部分代码都在 GPM 中,因此 GUI 元素不会受到授权代码的污染。这就是 GPM 的工作原理:

  • GUI 元素(需要一定的权限才能访问)向 GPM 注册其权限信息,如下所示:

    GPM.register(this, 'DEPARTMENT_DELETE_ROLE'); // 删除部门按钮

  • GPM维护GUI权限注册列表

  • 用户登录时,GPM 会收到分配给该用户的角色列表

  • GPM 遍历 GUI 权限注册列表,并根据用户权限,确定要隐藏 GUI 的哪一部分,然后相应地调用 element.hide()

问题:

  • GUI 元素以树形层次结构组织,例如面板包含按钮栏和窗体,因此隐藏面板时,无需进一步检查是否需要隐藏按钮栏和窗体。Problem:如何在GPM中注册和维护这个层次信息?
  • 目前,我只能想到 GUI 元素的两种用例:隐藏元素或将元素设置为只读(例如表单)。还有其他用例吗?
  • 在ExtJS中,要隐藏一个元素,我们调用hide(),但是要设置表单只读,我们必须想出自己的函数,假设它称为setReadOnly(),如何让GPM知道调用哪个函数?将函数作为注册的一部分传递?
  • 将表单设置为只读的最佳方法是什么?如果我使用 setReadOnly() 功能扩展表单组件,将会出现大量代码重复,并且我必须对每个需要权限控制的表单执行此操作。是否可以在 GPM 中创建动态表单转换器,以便如果表单设置为只读,它会自动将所有可编辑字段替换为仅显示字段?

Q1:分层 UI 元素隐藏 - 在我看来,优化 GPM 以避免隐藏已经通过父级隐藏的元素不会有太大的性能提升。我的理由:

  1. 您在用户登录时加载一次权限,而不是一直加载权限。
  2. 根据编码方式,无论如何都需要额外的处理来确定层次结构。
  3. 通过充分的规划,您可以避免注册数十个组件并坚持使用总体容器。

如果您确实想跟踪层次结构信息,则始终可以使用所有容器组件提供的“contains”方法来检查 DisplayObject 是否包含在其子列表中的任何位置(包括下游链)。每次注册组件时都可以调用它来检查它是否已经有注册的父组件。

然后可以在字典中设置一个标志来忽略该组件上的隐藏。在迭代注册组件列表以确定应隐藏哪些内容时,可以首先检查此标志。字典可以使用与注册组件的 UID 相对应的键。此外,当需要忽略其他 GPM 功能时,例如表单禁用(因为表单永远不会被看到),此标志可用于忽略该组件。

Q2。在我的脑海中,您可以禁用/启用组件、实现状态更改或拦截事件和所有警报。这确实是一个太宽泛的问题,因为任何事情都可以做——这完全取决于设计师。

Q3。你可以:

  1. 注册组件时提供参数,例如指示它们的类型(用于隐藏的容器、用于设置为只读的表单等)
  2. 检查注册的每个组件以确定将如何处理它。

您本质上是与各种组件建立契约,其中 GPM 知道它们的接口并相应地与它们交互。

Q4。您始终可以将表单设置为禁用(enabled = false)。这会阻止任何用户交互。某些外观将发生更改以指示组件已禁用,因此您可能需要修改其外观以防止某些此类显示行为。在该行中,您还可以更改它们的外观以隐藏某些元素,例如 TextInput 框的边框,以便使其看起来更像是“视图”而不是禁用的输入。

可以创建一个“转换器”来使用 RichText 组件等更改 TextInputs。这将需要大量的工作,并且可能应该构建到扩展的 Form 类而不是 GPM 中。我认为每个组件类型的不同皮肤状态可能是更好的解决方案,以避免仅仅为了改变表单的显示方式而创建和销毁组件。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

根据用户权限隐藏/禁用 GUI 元素的最佳方法? 的相关文章

  • 如何将图像放在 UIButton 中文本的右侧?

    如果可以避免的话 我不想使用子视图 我想要一个UIButton其中包含背景图像 文本和图像 现在 当我这样做时 图像位于文本的左侧 背景图像 文本和图像都有不同的高亮状态 最简单的解决方案 iOS 10 及更高版本 Swift button
  • C 中的 N 依赖注入 - 比链接器定义的数组更好的方法?

    Given a 库模块 在下文中称为Runner 它作为可重复使用的组件 无需重新编译 即静态链接库 中应用程序分区架构的 而不是主分区 请注意 它仅包含main 出于演示目的 Given a set 顺序无关 调用的其他模块 对象Call
  • 跨平台 UI 工具包 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我需要编写跨平台 GUI 应用程序 我可以使用什么工具包 目前我在 Windows MSVC 和 Linux gcc 中工作 最流行的选择
  • 错误“达到 inotify 监视的用户限制”。 ExtReact 构建

    我安装了 ExtReact 并附有示例 当我跑步时 npm start 我收到错误 ERROR in extjs reactor webpack plugin Error ERR BUILD FAILED ERR com sencha ex
  • 如何使用Python在没有窗口的情况下在屏幕上显示文本

    问题 我需要在没有窗口的情况下直接将文本写入屏幕 文本需要显示在所有其他窗口和全屏应用程序之上 并且不应以任何方式单击或交互 Example The text doesn t need to have a transparent backg
  • 从多个 UiBinder 引用单个 ClientBundle 类会产生任何费用吗?

    我有一个 ClientBundle 其中包含整个应用程序所需的 css 资源 默认背景颜色 常见布局模式等 一位表示设计目标 http code google com webtoolkit doc latest DevGuideClient
  • mod_rewrite GUI?

    任何人都有用于开发 mod rewrite 规则的图形工具 理想情况下 它会显示重写管道 然后当给定 uri 实例时 会显示应用时的转换 让它们正确设置总是很痛苦 因此任何使其变得更容易的方法都会有所帮助 对于 htaccess 阅读 mo
  • 服务作为 SOA 中的中介

    我知道什么是 通常的 中介设计模式 维基百科中有一些描述 http en wikipedia org wiki Mediator pattern http en wikipedia org wiki Mediator pattern 在我的
  • GWT 是否重用 Google Closure Compiler,如果不重用,为什么?

    谷歌网络工具包 GWT http code google com webtoolkit 执行 javascript 代码的内联 缩小和删除未使用的代码 以及其他一些优化 这些也是由谷歌闭包编译器 http code google com c
  • 游戏GUI框架

    我目前正在重新修改游戏的用户界面 OpenLieroX http www openlierox net即 我正在寻找一个可以轻松创建 GUI 的库 框架 具体来说 这是我的要求 开源 游戏是 LGPL 的 遇到许可问题是我们最不想关心的事情
  • IoC 服务的抽象类还是接口?

    我目前正在使用 IoC 在项目中提供存储库的具体实现 我读过的所有示例都使用接口作为服务的定义 但是 在阅读了 Microsoft 的建议后 建议更喜欢抽象类而不是接口 http msdn microsoft com en us libra
  • 拦截jTable选择改变事件

    I found 这个论坛主题 http www javakb com Uwe Forum aspx java programmer 2407 Row non selectable in a JTable这建议重写 ListSelection
  • java异常处理策略[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • Windows 窗体中的标准 Windows 菜单栏

    我注意到添加了一个MenuStrip 来自工具箱 我的表单设计不会产生像许多本机 Windows 应用程序中那样的菜单栏 相反 我得到了一个像 Visual Studio 自己的菜单栏 没有任何样式设置MenuStrip似乎模仿了更常见的本
  • Android:“dp”到“px”转换?

    我正在读这篇文章 http developer android com guide practices screens support html http developer android com guide practices scre
  • 黑莓 - 带动画的加载/等待屏幕

    有没有办法显示 加载 屏幕带动画在黑莓手机上 选项 PME动画内容 多线程 图像集 定时器 计数器 标准轮辋 API 其他方式 有这个吗 Thanks 费明 安东尼 1 谢谢大家 你们给了我部分答案 我的最终解决方案 1 创建或生成 免费
  • python 中的代表

    我实现了这个简短的示例来尝试演示一个简单的委托模式 我的问题是 这看起来我已经理解了委托吗 class Handler def init self parent None self parent parent def Handle self
  • 如何将 Jfreechart(饼图)添加到 netbeans 的面板中

    我正在使用 netbeans gui 编辑器 并且正在尝试添加一个本身位于内部框架中的 Jfreechart 并且这个内部框架我想将其添加到面板中 正如您在此图中看到的那样 抱歉 我无法直接发布图像 因为我新手 http www flick
  • Qt 创建布局并动态添加小部件到布局

    我正在尝试在 MainWindow 类中动态创建布局 我有四个框架 它们是用网格布局对象放置的 每个框架都包含一个自定义的 ClockWidget 我希望 ClockWidget 对象在调整主窗口大小时相应地调整大小 因此我需要将它们添加到
  • 优雅降级 - 何时考虑

    在为使用 AJAX 的应用程序设计和构建 UI 时 您何时考虑优雅降级 对于禁用 JavaScript 或正在使用屏幕阅读器的用户 最后 网站的 AJAX 版本完全完成后 在每个发展阶段 I don t 还有别的事 这些日子 渐进增强 ht

随机推荐

  • 如何在 AssemblyResolve 事件之前在运行时加载程序集?

    实际上 我尝试在我的解决方案中实现某种 静态链接 程序集 所以我尝试了以下方法 使用 CopyLocal false 添加对我的程序集的引用 使用 添加为链接 将 dll 文件本身添加到我的解决方案中 使用 添加资源 添加现有文件 将 dl
  • 尝试根据当前 URL 中的当前字符串向属性添加类

    我整个早上都在努力让它发挥作用 但没有成功 如果我执行以下代码 persist header a each function var this this if window location href indexOf signage 1 t
  • 使用 JInternalFrame 和一些按钮

    我们可以使用一个JInternalFame https docs oracle com javase tutorial uiswing components internalframe html主框架中有一个按钮 该框架包含一个JDeskt
  • 如何让 CMake 在生成 Visual Studio 解决方案后执行一些脚本

    我正在使用 CMake 来构建一个项目 我想在 CMake 生成解决方案后执行一些脚本 比如 python 脚本 这样我就不必每次都手动执行它 我正在使用 Cmake 2 8 有谁知道 Cmake 为此目的提供的任何 userhook 或其
  • 在 Java 中读取和写入同一个文件

    我想读自criteria txt文件 以标记化并在同一文件的末尾附加标记 程序抛出异常 No file found 我不知道我的错误在哪里 任何建议都会对我有帮助 先感谢您 这是我的代码 import java io import java
  • 如何以 HTML 格式发送 PUT/DELETE 请求?

    我正在 PHP 中制作 REST API 我知道我可以通过以下方式捕获请求方法 SERVER REQUEST METHOD 但是 如何在浏览器中触发 PUT DELETE 请求 我无法想象更改表单标记的方法属性以指定除 GET 或 POST
  • 线程只运行一次

    当线程完成后 您无法使用 start 方法再次运行它 它会抛出异常 谁能解释一下 为什么 这样的架构决策背后的原因是什么 因为在单独的线程中执行代码的方法不是创建一个线程 这与什么是线程的系统视图相关 关于绿色线程和系统线程之间的区别有无穷
  • 防止刷新时插入重复记录而不重定向

    我有这样的脚本 if isset POST comment posted user comment mysql real escape string POST user comment add user comment Event addU
  • 如何获取Unity中正在注入的对象的类型?

    我有一个类型在其构造函数中接收另一个类型 该类型通常是创建它的对象的类型 例如 public class Logger public Logger Type parent 我想指示Unity解决Logger将需要它的对象的类型作为参数传递给
  • WCF Rest 4.0 中不带尾部斜杠的简单 URL 路由

    我有一个基于 WCF REST 服务模板 40 CS 的 WCF REST 4 0 项目 我想公开简单的服务端点 URLwithout尾部斜杠 例如 CarService cs http www domain com cars http w
  • 工具箱 Visual Studio 2015 中缺少报告查看器标记

    我最近安装了 Visual Studio 2015 Community 现在我的工具箱没有报表查看器标签 我的 ASP NET 项目中所有现有的报表查看器都显示 创建控件时出错 我已经检查了所有参考文献 它们似乎没问题 当我运行项目时 报告
  • 如何使用 swt 向表中添加行

    我正在学习 swing 并对将行插入到表格有一个疑问 我的要求是我必须通过按添加按钮添加新行 但我无法继续 请找到下面的代码 如果有人知道请帮助我 public class TableShellExample Display d Shell
  • 如何计算sklearn中交叉验证的每个模型中的特征重要性

    我在用RandomForestClassifier with 10 fold cross validation如下 clf RandomForestClassifier random state 42 class weight balanc
  • 如何在车把模板中使用 {{{{raw-helper}}}}

    我有一个效果很好的车把模板 我希望能够将以下内容放入其中 这显然会在处理车把文件时呈现 所有的 最终都是空白的 这不好 我找到了 raw helper 块助手 并像这样尝试 raw helper
  • 按比例随机将 NA 插入到数据帧中

    我有一个完整的数据框 我希望将数据框中 20 的值替换为 NA 以模拟随机缺失数据 A lt c 1 10 B lt c 11 20 C lt c 21 30 df lt data frame A B C 谁能建议一种快速的方法来做到这一点
  • 获取最大值之前的值

    例如 给定这个稀疏 id 表 id 1 2 3 6 7 我可以使用以下查询从表中获取最高的 id SELECT max id FROM Comics I get id 7 如何获取最高 id 之前的 id 即使值不连续 一般来说 您可以首先
  • VSTO 写入 Excel 中的单元格!

    为什么这有效 Excel Worksheet Application ActiveSheet get Range A1 A1 Value2 text 但这并没有 Excel Worksheet activeSheet Excel Works
  • 泛型作为方法返回类型

    我在 StackOverflow 上四处寻找我面临的问题的答案 我遇到了很多好的答案 但仍然没有回答我的问题 Java中通过反射获取泛型参数的类型 https stackoverflow com questions 1901164 get
  • 在discord.py中添加角色

    我尝试了许多不同的方法 并在 youtube 上进行了搜索 但我尝试的所有方法都不起作用 已过时或不相关 如何向提到的用户添加角色 这就是我的代码 你看 最后我在 里写的 client command commands has permis
  • 根据用户权限隐藏/禁用 GUI 元素的最佳方法?

    我正在启动一个 Web 应用程序 其客户端在纯 ExtJS 中实现 中间层在 Grails 中实现 该应用程序具有基于角色的授权 其中用户可以拥有许多细粒度的角色 例如 SOME FORM READ SOME FORM UPDATE SOM