我们有一个 Web 应用程序,它的前端是用 GWT/GXT 实现的。用户可以属于不同的组,然后这些组可以拥有不同的权限。权限非常精细,例如comment_create、comment_edit、comment_delete 和comment_read。
根据用户权限启用和禁用用户界面控件的最佳方法是什么?我们有一个实用方法,它返回具有给定用户和权限名称的布尔值。但是目前每个控件都包含在 if 子句中,这使得代码有点混乱。
我们有一个 Web 应用程序,它的前端是用 GWT/GXT 实现的。用户可以属于不同的组,然后这些组可以拥有不同的权限。权限非常精细,例如comment_create、comment_edit、comment_delete 和comment_read。
根据用户权限启用和禁用用户界面控件的最佳方法是什么?我们有一个实用方法,它返回具有给定用户和权限名称的布尔值。但是目前每个控件都包含在 if 子句中,这使得代码有点混乱。
我有同样的问题,这是我的解决方案。
每个 UI 组件都有一个开/关状态(可见/隐藏、启用/禁用、可编辑/只读),并且该状态可以绑定到一个或多个权限。例如,如果用户具有 EDIT 权限,则可以启用编辑按钮,否则可以禁用。
我创建了一个绑定器类,将 UI 组件绑定到权限。绑定器通过事件总线知道当前用户权限(所有权限),其中使用事件发送一组权限。每次收到事件时,活页夹检查权限是否存在(另一种方法是为每个权限使用布尔值)并将更改应用于组件(例如启用或禁用它)。
事件总线是所有 UI 组件之间的唯一连接。
使用 Gin 和一些辅助类,我最终得到了类似这样的绑定代码:
FeatureBinder.bind(editButton, EDIT_PERMISSION);
我不确定您将如何在 GWT/GXT 中实现这一点,但启用菜单的旧 MFC 方式可能是一个开始的地方。
这有一条单独的ON_UPDATE_COMMAND_UI
消息,您提供了一个菜单 ID 和方法名称。该方法将被调用,您可以根据您的逻辑启用或禁用该菜单选项。在您的情况下,它将基于用户 ID。这是基于每个菜单 id 的,因此可以根据您的需要进行细粒度。
查看使用 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进行元编程。
请参阅装饰器模式。
与版本相比,您可以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);