每周我们会让一些用户呼唤帮助,为什么你不能在表格Y上做X. 由于复杂的业务规则,我们经常不得不重新查看代码,以了解为什么当时没有特定的操作。有没有经过验证的策略来解决这个问题?
如何从GUI,业务规则和/或安全性中收集导致禁用按钮的所有信息?
用户无法从测量概览表单中删除测量值,因为
GUI
业务规则
安全
关于我们已经做出计算以确定是否应该禁用控件这一事实的有效评论。
我们使用家庭酿造ACL来处理安全问题。这些是决定是否应禁用控件的步骤
Write ACE
,则表示当前用户有权更改测量。 Deny Write ACE
请注意,业务对象只能使安全性更具限制性。如果全球安全要求无法完成,则无法完成。 Gui rules
。现在要确定是否应该启用一个按钮,GuiMap将结合由业务对象的ACL确定的安全性以及具有用户安全性的extremis来评估传递给它的每个函数。
事实上,每一层都建立在前一层之上,以确定最终结果。这与一个计算不同,以确定是否应启用按钮或其他任何内容。
如果你愿意的话就是这样:当ACL发出副本时,副本会将自己附加到主服务器上,并在主ACL更新时得到通知。这允许我们
这对我们来说非常有效,除了很难知道为什么某些东西被禁用。
答案 0 :(得分:2)
如果我理解正确,你有两个不同的问题:
1)每层中的检查只返回一个指示启用/禁用的布尔值,并且不返回原因。
您必须更改它,以便每个检查也返回原因;例如你可以返回一个元组(enabled, reason)
,其中access是你现在拥有的布尔值,并说明它被禁用的原因(例如作为一个字符串)。
根据您所处的环境,更改所有访问检查的返回类型可能不可行;如果你想避免这种情况,你可以报告“带外”的原因,例如:将其存储到全局(或更确切地说是线程局部)变量,UNIX中的la errno
或Windows中的GetLastError
。那不是那么优雅,当然会被许多人不赞成: - (
或者,您可以更改检查以抛出异常(使用描述性消息)而不是返回布尔值。同样,在许多环境中这都会令人不悦......
2)您的业务层将条目添加到对象的访问控制列表中。当您稍后检查访问权限时,您知道哪个条目拒绝访问,但您不知道为什么已添加此条目。
解决此问题,您可以向ACE添加reason
字段。当业务层添加ACE时,它会设置原因以描述拒绝访问的原因。然后,访问控制检查从此处读取原因并将其传递到GUI层,如上所述。
答案 1 :(得分:1)
我总是会明显地禁用控件,让用户在点击时通过悬停提示或对话框知道原因(如果你的GUI允许监听禁用控件上的事件)。
答案 2 :(得分:1)
如果文档中没有解释它并且在GUI上不清楚,我认为不得不查看代码。我已经完成了这一千次,所以我真的对这里发布的任何替代方案感兴趣:)
也许我们可以在每次禁用/启用按钮时将原因写入日志。例如:
答案 3 :(得分:1)
Lieven,我个人会建议您使用 oefe 给出的解决方案。
但是,由于您不满意,我在下面添加不同的方法。仅当您的GUI屏幕呈现过程是幂等的(即不会更改系统状态并且可以多次调用而不影响系统)时,这将起作用。
<强>缺点:强>
<强>优点:强>
<强>更新强>
或者对于原始但更简单的方法,您可以在一个时间递增一个模块,重构现有规则并使它们对控制的id和原因指示符参数敏感。如果存在原因指标参数,则规则本身应该填充原因。