【问题标题】:How should i organize authority code?我应该如何组织权限代码?
【发布时间】:2010-03-16 11:15:50
【问题描述】:

我的用户属于以下类型

  • 未登录
  • 未验证
  • 已验证
  • 版主
  • 管理员

只有管理员和版主才能访问的所有代码(如禁止)都在从 BaseUser 继承的已验证继承的 ModeratorUser 中。某些页面可供所有用户访问,例如公共配置文件。如果用户登录,他可以发表评论。要检查这一点,我使用if (IsVerifiedUser)。现在问题来了。为避免用户被禁止时出现问题,他不会被识别为经过验证的用户。但是在极少数情况下,我需要知道他是否经过验证,我可以使用usertype & Verified

我不应该这样做吗?我的 VerifiedUser 类中有一堆代码,发现我正在将大量代码移至 BaseUser。这是我的帮助,因为未登录的用户可以访问该页面吗?我是否应该以不同的方式处理禁止用户并允许 IsVerifiedUser 为真,即使该用户被禁止?

【问题讨论】:

  • 你在这些类中有什么样的代码?该代码应该是关于成为用户,而不是关于允许特定类型的用户做的事情。
  • @John Saunders 查看我离开杰瑞的第一条评论
  • @acidzombie:Jerry 的 cmets 正是我所担心的。您将代码按用户的能力分组,而不是按功能分组。当规则改变时,你必须改变你的类层次结构。不好。
  • @John Saunders:我主要需要做一些小事,比如移动 PrivateMessage pm;进入 BaseUser 而不是 VerifiedUser。但是,我确实需要将一些特定于页面的功能(例如 ViewPrivateMessage)移动到可能是 BannedUser (我可能会创建它,它高于无法对 PM 做任何事情的未验证用户,低于可以发送 PM 的 VerifiedUser)。代码组织得很好,但是有很多页面特定的功能,我试图通过不允许 UnverifiedUsers 访问 pm 变量来减少错误。如果 PM 仍然是它自己的类,这还不好吗?
  • @acidzombie:你的结构错误地接管了用户的类层次结构,成为权限层次结构。不要那样做。

标签: language-agnostic authorize


【解决方案1】:

至少在我看来,像这样的大多数情况应该在数据中处理,而不是在代码中。硬编码(例如)操作 X 只能由管理员完成的事实往往相对脆弱。现在,您有五类用户,但是(仅举个例子)您几乎不可避免地(沿线某处)最终发明了其他一些用户类别,并且必须重新组织相当多的代码以适应(例如,版主和管理员之间的新步骤,或者可能是比普通验证用户低一个步骤的“受限用户”等)事实上,你已经基本上遇到了你的“被禁止”用户,他们大多像一个未经验证的用户,但在某些方面类似于经过验证的用户。

每次决定进行此类更改时都必须重写代码是一个糟糕的主意。相反,您应该(可能)预先定义您的五个(或可能六个)用户组,并(例如)为每个用户组分配一个位。同样,为每个函数分配一个位掩码。要验证给定用户是否可以执行给定功能,您可以将这些位掩码与在一起,并查看用户是否在其掩码中设置了适当的位。

这使得根据需要创建新组和/或更改权限分配以执行特定功能的用户组变得相当容易。特别是,它允许以管理方式更改此类权限,而不需要重写代码。

【讨论】:

  • 听起来很有趣。其中大部分不是“硬”编码的。例如,我有一个发送电子邮件功能。我知道只有经过验证的用户和更高级别的用户才能执行此操作,所以如果我是未经验证的用户,我不希望能够调用该函数(编译时错误)。在禁止经过验证的类的情况下会抛出一个禁止的异常,这很好,因为如果用户被禁止,调用其中的任何内容是我不想做的事情。你只是给了我一个我无法相信我没有想到也不会想到的解决方案。在未验证和已验证之间禁止用户。 (新评论格式原因)
  • 如何根据位标志编程“发送电子邮件”?我曾经让每个公共后端功能检查权限以查看用户是否符合条件。一位朋友建议最好让类抛出异常和通过继承不可见的函数(Base 不能调用已验证的函数 == 不易出错)。除了检查位而不是用​​户类型之外,我会回到旧的方式吗?我还会像以前一样拥有继承或一个大类吗? (里面有几个类)。
  • “硬编码”是指(例如)“已验证用户”和“发送电子邮件”之间的联系直接在代码本身中表达。如果您决定更改规则,使某人必须成为经过验证的用户 30 天才能发送电子邮件,则您必须修改代码并创建一个新类并将“发送电子邮件”成员从经过验证的用户类中移出到新班级。
  • 是的,我的建议听起来与您之前的做法非常接近。我不同意尝试使用类型来表示特权/权利是一个好主意。至于如何组织代码,我可能会考虑其成员真正相关的类,而不是仅仅因为同一级别的用户恰好能够做到这两点而处于同一个类中。然后,您将逐个类进行位掩码检查,而不是逐个函数。
  • 作为一个例子(我没有实数)我有 3 个页面,只有 mods 可以访问,每个页面都有 3 个功能(所以那是 9 个)。我有 5 个页面,只有经过验证的用户才能访问,平均每页 4 个功能(20)。你是说我应该使用位掩码来检查权限,但你是说我应该在同一个类中拥有这 29 个函数吗?可以说这些函数严格用于 html,如 getListOfUsers(pageNumber)、printReplySectionType1(它有 type1 divs arouind 它调用comment.printReplySection)等。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多