有没有方法或架构设计模式可以实现安全、清晰的基于角色/权限的访问控制和UI便利,而不将它们耦合在一起?
长话短说,我看到很多Web应用程序中对角色和权限的使用含糊不清,并且我经常遇到这些歧义导致的误解和实现困难。
以下是一个简化的例子。业务需求要求某个特定角色的权限集应该禁止访问显示完整地址列表的系统的某些部分。但同时,这个角色的用户需要在其他网页上的自动完成列表中读取地址。
我看到过粗心的开发人员创建一个权限条目来禁止访问地址,后来他们发现用户实际上需要从系统的其他部分读取地址。然后他们为特殊情况发明了另一个特定的权限,其中地址可以被读取。
但对我来说,这似乎是一个模糊不清且可能存在风险的情况。如果用户无法访问某些特定数据,则他/她根本就不应该能够访问它。添加一个专门的权限仅用于下拉列表似乎是一个故意的安全漏洞。如果用户通过异步请求加载列表,并且服务器正在使用相同的控制器操作返回列表(应该这样做以避免代码重复),那么当它们有时被禁止时,服务器将如何知道何时不返回地址?
这种情况引发了一个问题:“如果某些特定角色的用户可以通过其他方式访问列表,为什么他们一开始就不能看到完整的地址列表?”而业务分析师经常给出的答案是“好吧,地址列表不是因为数据安全原因而被禁止,只是因为这个特定角色的用户不需要对地址列表进行任何操作,它将成为他们工作区的多余项目”。
因此,现在问题对我来说似乎很清楚:一些权限存在仅用于控制UI而不是严格控制对某些数据的访问。这种(滥)用权限让我感到不舒服。因此,这就是一开始提出的问题。
长话短说,我看到很多Web应用程序中对角色和权限的使用含糊不清,并且我经常遇到这些歧义导致的误解和实现困难。
以下是一个简化的例子。业务需求要求某个特定角色的权限集应该禁止访问显示完整地址列表的系统的某些部分。但同时,这个角色的用户需要在其他网页上的自动完成列表中读取地址。
我看到过粗心的开发人员创建一个权限条目来禁止访问地址,后来他们发现用户实际上需要从系统的其他部分读取地址。然后他们为特殊情况发明了另一个特定的权限,其中地址可以被读取。
但对我来说,这似乎是一个模糊不清且可能存在风险的情况。如果用户无法访问某些特定数据,则他/她根本就不应该能够访问它。添加一个专门的权限仅用于下拉列表似乎是一个故意的安全漏洞。如果用户通过异步请求加载列表,并且服务器正在使用相同的控制器操作返回列表(应该这样做以避免代码重复),那么当它们有时被禁止时,服务器将如何知道何时不返回地址?
这种情况引发了一个问题:“如果某些特定角色的用户可以通过其他方式访问列表,为什么他们一开始就不能看到完整的地址列表?”而业务分析师经常给出的答案是“好吧,地址列表不是因为数据安全原因而被禁止,只是因为这个特定角色的用户不需要对地址列表进行任何操作,它将成为他们工作区的多余项目”。
因此,现在问题对我来说似乎很清楚:一些权限存在仅用于控制UI而不是严格控制对某些数据的访问。这种(滥)用权限让我感到不舒服。因此,这就是一开始提出的问题。