设计基于用户权限启用用户界面元素的模式?

时间:2010-07-06 09:22:08

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

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

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

5 个答案:

答案 0 :(得分:3)

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

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

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

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

使用Gin和一些帮助类我最终得到了类似于绑定代码的东西:

FeatureBinder.bind(editButton, EDIT_PERMISSION);

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

请参阅decorator pattern

答案 3 :(得分:1)

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 :(得分:0)

您可以在受限制的小部件上使用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);