在回答您的第一个问题时,检查用户具有角色而不是特定权限的最大问题是权限可以由多个角色持有。例如,开发人员可以访问公司内部网上的开发人员门户,这也可能是其经理持有的许可。如果用户随后尝试访问开发人员门户,则将出现类似于以下内容的检查:
if(SecurityUtils.hasRole(developer)) {
// Grant them access to a feature
} else if(SecurityUtils.hasRole(manager)) {
// Grant them access to a feature
} else if...
(switch
用您选择的语言做的陈述会更好,但仍然不是特别整洁)
权限越常见或拥有的权限越广,您将需要检查的用户角色越多,以确保某人能够访问给定的系统。这也将导致以下问题:每次您修改角色权限时,都需要修改检查以反映这一点。在大型系统中,这将很快变得非常笨拙。
例如,如果仅检查用户是否具有允许他们访问开发人员门户的权限,则不管他们担任什么角色都将被授予访问权限。
要回答第二个问题,您拥有角色的原因是因为它们很容易修改和分发权限的“程序包”。如果您拥有一个具有数百个角色和数千个权限的系统,则添加新用户(例如,新的HR经理)将要求您仔细检查并赋予他们其他HR经理所拥有的所有权限。这样做不仅繁琐,而且如果手动进行也容易出错。相比之下,只需将“ HR Manager”角色添加到用户的个人资料即可,这将授予他们与具有该角色的其他所有用户相同的访问权限。
您可能会争辩说,您可以简单地克隆一个现有用户(如果您的系统支持此功能),尽管这样做确实为该用户授予了该时间段的正确权限,但将来可能会尝试为所有用户添加或删除权限难。这种情况的一个示例场景是,如果过去可能是人力资源人员也负责工资单,但后来公司变得足够大,可以专门雇用员工来处理工资单。这意味着HR不再需要访问薪资系统,因此可以删除权限。如果您有10个不同的HR成员,则需要手动检查并确保删除正确的权限,否则可能会导致用户错误。另一个问题是,它根本无法扩展。随着您在给定角色中获得越来越多的用户,这将使角色修改变得更加困难。将其与使用角色进行比较,使用角色时,您只需要修改所讨论的总体角色以删除权限,这将由拥有该角色的每个用户反映出来。