计划php系统时的一些想法

时间:2010-01-27 11:40:57

标签: php authorization

我正准备构建一个相对较大的PHP系统,我只需要一些关于如何实现某个功能的想法。

我会允许用户注册。一旦注册,用户将具有将被分配到其帐户的安全级别。

因此,如果我的安全级别为1,2和3,那么向具有某些安全级别的人员展示某些内容的最佳方式是什么?

提前谢谢你。

2 个答案:

答案 0 :(得分:4)

在重新发明轮子之前,请务必查看Zend_ACL是否适合您。我自己没有使用它,但是从它在文档中的承诺,它可以做你需要的东西等等。

答案 1 :(得分:3)

Pekka关于查看Zend API的评论很好。许多用于PHP的Frameworks目前(遗憾地)实现了糟糕的垃圾(下面有可怕的业余代码),但Zend API几乎是独一无二的。

如果你自己滚动,如果你找不到符合你想要的东西(并且不能轻易扩展),那么做什么都没有错,那么我会采用OO方法并暴露用户通过课堂的属性。

e.g。

$user = new User($session->userId);
if (!$user->isAdministrator && !$user->canViewReports)
    someErrorHandler("You do not have permission to access this content.");

我会避免使用固定级别,而是遵循基于角色的方法。

即。我会避免像以下那样的水平:

  • 员工
  • 管理器
  • 管理员

相反,我会选择属性(就像说明性示例一样):

  • read_access
  • write_access
  • can_view_logs
  • can_view_reports
  • is_administrator

这使您可以在以后(不可避免地)发现您希望其他权限组返回并更改现有代码时更容易更明确。

这并不意味着将用户置于群组中是一个坏主意(它不是,你可以使用群组系统来实现这一点,例如用户可以同时使用“报告”和“日志”),但有关假设层次结构的安全级别通常是错误的方法(例如,级别1 =员工,级别2 =经理,级别3 =管理员) - 这是因为您几乎总是需要一个比简单的分层系统允许的更灵活的系统。

实际上,如果您最终采用这种方法,您可能希望拥有Permissions或Group类,以避免拥有过大的User类(可能最终会获得用于获取用户属性的东西,设置新密码,等)。

e.g。

$group = new Group($session->userId);
if (!$group->Administrators && !$group->Reporting)
    someErrorHandler("You do not have permission to access this content.");