我们有一个Web应用程序,其前端是用GWT / GXT实现的。用户可以属于各种组,然后这些组可以拥有各种权限。权限非常精细,例如comment_create,comment_edit,comment_delete和comment_read。
根据用户权限启用和禁用用户界面控件的最佳方法是什么?我们有一个实用程序方法,它返回给定用户和权限名称的布尔值。但是目前每个控件都包含在if子句中,这使得代码变得混乱。
答案 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)
答案 3 :(得分:1)
查看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,它看起来像使用generator和SourceWriter进行元编程。
答案 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);