PHP OOP - 如何处理授权?

时间:2010-06-22 11:00:49

标签: php oop

我正在为我的想法建立一个管理系统。我精通PHP(至少足以完成我需要做的所有事情),但我对使用OOP没有经验。我尽可能多地使用它,但是我不熟悉的许多最佳实践,所以当我做事时我担心我会以错误的顺序执行它们。

对于这个项目,我有一个用户管理的东西的类,我需要检查用户是否有权管理它。我知道如何来检查权限,我的问题是:我应该在哪里做这个?

我应该在课外做这件事,如下:

if user permissions are valid
initialize class
else return error

或者我应该做什么

initialize class
class checks permissions 
class returns error if permissions are invalid

我不确定哪种正确的方法。一方面,根据我对OOP方法的了解,在类中检查似乎是最好的,但是我也有这样的感觉:当权限未知时,让它达到初始化类可能是坏的。

我该怎么做?如果有任何类型的文章涵盖这种事情,将非常感谢链接(我无法通过搜索找到任何东西,但我不是100%肯定,如果我正在寻找正确的东西,因为我对OOP知之甚少)

5 个答案:

答案 0 :(得分:3)

这取决于您的权限模型是什么,并且没有“一种正确的方法”来执行它。这是一个方法问题。重要的是,无论你选择什么,都要始终如一地使用它。

在我的最新项目中,我遇到了几种不同的模型。其中最直接的一种是基于页面的权限,如果您执行基于页面的流程,并使用对象进行支持,则会很好:您可以在页面顶部定义应该访问它的人,以防您可以重定向。这是最简单的一个,但在特定应用程序中非常有用。

相反,如果您使用对象来执行主流,则应该保护对象方法(而不是类实例化)。如果你有一个“save()”方法,只能由特定用户调用,那么当你输入该方法时,首先要检查你的权限。

我目前正在使用MVC模式,我有一个Controller,它将动作分派给它的孩子。它唯一的公共方法是execAction($params),它会自行调用actionAction($params),但首先会检查权限。

要记住的一件重要事情是:永远不要在UI上呈现不允许用户做的操作(除非你试图强迫他购买你的“PRO版本”,即); - )

答案 1 :(得分:1)

我写了一个非常可靠而强大的CMS系统。这就是我的工作方式,我希望你可以推断一些关于制作自己的解决方案的信息。

  • 我有一个索引文件,它加载Admin类。我的CMS中的功能是模块化的(因此包含在自己的文件和类中)。
  • 基于$_GET参数加载模块。
  • 因为检查$_GET参数并加载相应函数的函数位于我的Admin类($admin->pick_method())中,我的User对象中也有Admin {1}}类,我可以先检查所请求的模块是否在当前登录用户的权限数组中。
  • 如果权限检查返回true,我加载模块。如果false,我会显示友好的“未经授权的访问”页面。

希望这有帮助。

答案 2 :(得分:0)

我认为最好的办法是拥有一类权限。 然后你可以在创建对象之前或对象中进行检查。

create permission class
if access then create class and set permission object
else error
// do action
if have permissions show something
else do not show something

查看zend acl component

中的完成情况

答案 3 :(得分:0)

在类中进行验证会在类和权限授权之间生成依赖关系,这是不好的,因为您将两个可能不同的项目捆绑在一起。您可以通过Inversion of Control(例如dependency injection)或authorisation notifications using Emesary解决此问题。

在课堂外进行验证可能更糟糕,因为授权检查确实存在错误或完全错过。它还会在对象之间创建错误的链接类型,因为对象无法控制自身。

如果要在创建对象之外在对象之外执行此操作,则最好要求对象提供interface,例如IAuthorisable,可以通过单独的对象进行验证。

e.g。

interface IAuthorisable
{
    public function getRequirements();
}

class Authorisation
{
     public static createObject($newObj)
     {
          if ( canDo( $newObj->getRequirements()) )
              return $newObj;
          return null;
     }
}

class Something implements IAuthorisable
{
     public function getRequirements()
     { 
          return SomeSortOfIdentifierOrSomething;
     }
}

$mySomething = Authorisation::createObject(new Something($p1, $p2), "

如果$ mySomething为null,则不允许。显然,这需要适当扩展和设计,这留给读者练习。

答案 4 :(得分:0)

OO基础知识
如果将它包含在课堂中是有意义的。你可以做到这一点 Book类是否具有身份验证功能?不,像download()和convertToPDF()这样的函数更有意义。

我的方法
我总是试图找到阻力最小的路线。

如果有10个脚本/页面与1个类通信,1个或2个脚本需要对某些操作进行身份验证,我会将身份验证构建到这些1或2个脚本中。 (或将它们放在带有.htpasswd的子文件夹中)

但是当你使用MVC结构时,一切都是一个类,所以它成为决定哪个类的问题。
我倾向于将身份验证规则放在Controllers类中,并将身份验证规则放在User类中。