【问题标题】:Design patterns for enabling user interface elements based on user permissions?基于用户权限启用用户界面元素的设计模式?
【发布时间】:2010-07-06 09:22:07
【问题描述】:

我们有一个 Web 应用程序,它的前端是用 GWT/GXT 实现的。用户可以属于不同的组,然后这些组可以拥有不同的权限。权限非常精细,例如comment_create、comment_edit、comment_delete 和comment_read。

根据用户权限启用和禁用用户界面控件的最佳方法是什么?我们有一个实用方法,它返回具有给定用户和权限名称的布尔值。但是目前每个控件都包含在 if 子句中,这使得代码有点混乱。

【问题讨论】:

标签: design-patterns gwt permissions user-interface gxt


【解决方案1】:

我遇到了同样的问题,这里是我的解决方案。

每个 UI 组件都有一个开/关状态(可见/隐藏、启用/禁用、可编辑/只读),并且该状态可以绑定到一个或多个权限。 例如,如果用户具有 EDIT 权限,则可以启用编辑按钮,否则可以禁用。

我创建了一个绑定器类,将 UI 组件绑定到一个权限。绑定器通过事件总线知道当前用户权限(所有权限),其中使用事件发送一组权限。每次收到事件时,活页夹都会检查权限是否存在(另一种方法是为每个权限使用布尔值)并将更改应用于组件(例如启用或禁用它)。

事件总线是所有 UI 组件之间的唯一连接。

使用 Gin 和一些辅助类,我最终得到了类似这样的绑定代码:

FeatureBinder.bind(editButton, EDIT_PERMISSION);

【讨论】:

  • +1 听起来很有趣。你能提供更多关于这种方法的伪代码吗? FeatureBinder 是否包含对所有需要权限的控件的引用?
  • FeatureBinder 是一个简单的帮助类,它为权限集更改事件创建一个事件处理程序。当发生新事件时,处理程序检查指定的权限(示例中的 EDIT_PERMISSION)是否在集合中,从而启用/禁用组件(editButton)。处理程序绑定到专用于权限集传播的特定总线。
【解决方案2】:

我不确定您将如何在 GWT/GXT 中实现此功能,但启用菜单的旧 MFC 方式可能是一个起点。

这有一个单独的 ON_UPDATE_COMMAND_UI 消息,您提供了一个菜单 ID 和方法名称。该方法将被调用,您可以根据您的逻辑启用或禁用该菜单选项。在您的情况下,它将基于用户 ID。这是基于每个菜单 ID 的,因此可以根据需要进行细粒度。

【讨论】:

    【解决方案3】:

    Acris security

    查看Securing GWT Clients With AcrIS:使用注释以声明方式定义控件的权限。从文章来看,

    public class CustomerPanel extends SecuredComposite {
    ...
        @Secured(Grants.SECURITY_MANAGEMENT)
        protected TextBox securityID;
    ...
    }
    

    虽然这种方法看起来很有前途,但该项目似乎并不活跃。 downloads 页面在 2012 年 5 月发布了最新版本,每个版本只有几百次下载(尽管这不考虑用作 Maven 依赖项)。 acris 的最新消息forum 是 2013 年 6 月关于迁移到 Git 的帖子。

    此外,最新发布的版本与 GWT 2.3 兼容,目前的开发重点是 GWT 2.5。

    此外,该框架看起来非常广泛,我担心它的模块化。仅仅尝试引入安全模块就需要许多依赖项和其他模块。

    即使您不使用 acris,该方法也需要深入研究。 (这与在 OP 的评论中链接的Attribute-Based Authorization 中提到的方法相同。)看看source,它看起来像使用generatorSourceWriter 进行元编程。

    【讨论】:

      【解决方案4】:

      请参阅decorator pattern

      【讨论】:

        【解决方案5】:

        您可以在受限小部件上使用setEnabled(boolean),与if 版本相比,可以节省2 行代码:

        Button editButton = new Button();
        editButton.setText("Edit");
        editButton.setEnabled(SecurityManager.userHasPermission(currentUser, Permissions.DOCUMENT_EDIT));
        toolbar.add(editButton);
        
        Button deleteButton = new Button();
        deleteButton.setText("Delete");
        deleteButton.setEnabled(SecurityManager.userHasPermission(currentUser, Permissions.DOCUMENT_DELETE));
        toolbar.add(deleteButton);
        

        【讨论】:

          猜你喜欢
          • 2013-03-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-11-29
          • 1970-01-01
          • 2014-08-13
          相关资源
          最近更新 更多