12

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

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

4

5 回答 5

3

我有同样的问题,这是我的解决方案。

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

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

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

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

FeatureBinder.bind(editButton, EDIT_PERMISSION);
于 2013-10-23T16:00:10.173 回答
1

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

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

于 2010-07-06T09:30:57.647 回答
1

Acris 安全

查看使用 AcrIS 保护 GWT 客户端:使用注释以声明方式定义控件的权限。从文章来看,

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

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

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

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

即使您不使用 acris,该方法也是工作调查。(这与在 OP 的评论中链接的基于属性的授权中提到的方法相同。)查看源代码,它看起来像使用生成器SourceWriter进行元编程。

于 2014-01-15T16:23:19.990 回答
0

请参阅装饰器模式

于 2010-07-06T09:40:57.260 回答
0

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

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);
于 2011-07-08T05:52:56.680 回答