我有一个包含20个字段的.aspx表单,必须根据用户角色和订单记录的状态进行禁用。目前,该应用程序有5个角色和3个状态,因此我有300个不同的可能条件,我必须考虑。
我的第一个想法是将每个排列存储在一个表中,然后通过循环遍历字段来设置页面加载时的字段。有没有更好的办法?请注意,我使用的是.Net 2.0而不是MVC。
答案 0 :(得分:5)
我可能会存储每个字段的详细信息,然后是可以编辑它们的角色和状态,并按照这种方式进行。
系统有哪些规则?基本上,真的有300种可能的条件吗?或者是否真的某些字段只能针对特定状态进行编辑,然后只有某些角色可以编辑这些字段?或者某些字段是否也适用于某些角色?
如果更多的是前者,我可能会有这样的事情:
三个主要表格(如果您添加字段,角色或状态,则可以轻松扩展):
然后是两个链接表:
然后,对于任何给定的订单和用户,您可以找到哪些字段可以编辑订单的当前状态和用户角色,并且当您处理字段时,相应地设置访问权限 - 但是您设置控件 - 动态根据您返回的集合或页面上的静态生成它们。
如果您遇到角色可以覆盖状态的问题,您还可以在字段/角色表中存储一个布尔值,指示无论状态如何,该字段都应该是可用的。
答案 1 :(得分:3)
与其他响应者一样,我们也使用名为CSLA的业务对象框架。 CSLA通过要求类开发人员在属性get / set调用中进行安全检查来实现字段级安全性检查。典型的属性实现如下所示:
Private mFirstName As String = ""
Public Property FirstName() As String
<System.Runtime.CompilerServices.MethodImpl(Runtime.CompilerServices.MethodImplOptions.NoInlining)> _
Get
CanReadProperty("FirstName", True)
Return mFirstName
End Get
<System.Runtime.CompilerServices.MethodImpl(Runtime.CompilerServices.MethodImplOptions.NoInlining)> _
Set(ByVal value As String)
CanWriteProperty("FirstName", True)
If value Is Nothing Then value = ""
If Not mFirstName.Equals(value) Then
mFirstName = value
PropertyHasChanged("FirstName")
End If
End Set
End Property
请注意对CanReadProperty
和CanWriteProperty
的来电。第二个参数指定如果用户未被授权执行特定的读/写操作,则该方法应抛出异常。
CanReadProperty
和CanWriteProperty
的实现由框架的基类提供,但是在不采用整个CSLA框架的情况下应该是可重现的。这些实现检查AuthorizationRules
数据结构,该结构根据角色定义允许/拒绝的读/写访问权限。通常,在对象创建期间填充AuthorizationRules
结构。
在表示层中公开相同的CanReadProperty
和CanWriteProperty
方法,可以根据当前用户的访问权限启用/禁用UI元素。例如:
FirstNameTextBox.ReadOnly = Not CanWriteProperty("FirstName", false)
希望这些信息能为您提供开发自己实现的良好起点。如果您有兴趣了解有关CSLA的更多信息,请查看Expert C# 2008 Business Objects。
答案 2 :(得分:0)
我建议使用第三方框架来实现这一目标。我们在项目中使用CSLA框架。它允许我们在现场级别设置授权。