2010-06-22 58 views
5

我正在为我的想法建立一个管理系统。我对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 

我不能确定这是正确的方法。一方面,根据我所了解的面向对象编程方法,在班级内部进行检查似乎是最好的,但是我也有这样的感觉,即在未知权限时初始化班级可能会很糟糕。

我该怎么做呢?如果有任何形式的文章涉及这类事情,我们将不胜感激(我无法通过搜索找到任何内容,但我不能100%确定是否正在寻找正确的东西,因为我知道的很少有OOP )

回答

3

这取决于什么是您的权限模型,并没有“一个正确的方法”来做到这一点。这是一个方法问题。重要的是,无论你选择什么,你都一贯地使用它。

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

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

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

要记住的一件重要事情是:在用户是不允许做UI从来没有现在的行为(除非你想逼他买你的“专业版”,这是);-)

+0

在某些系统中,您可以通过动态地(从浏览器开发工具中)将html添加到页面来向youserlf提供一些操作。所以检查行动也。 – 2010-06-22 11:38:00

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

1

做我写了一个非常坚实和强大的CMS系统。以下是我的工作方式,希望您能推断出一些有关制定自己的解决方案的信息。

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

希望这会有所帮助。

0

在类中验证会生成类和权限授权之间的依赖关系,因为您将两个潜在的不同项目绑定在一起,所以这不太合适。你可以通过Inversion of Control(例如,dependency injection)或者我通过authorisation notifications using Emesary来解决这个问题。

验证课外可能会更糟,因为授权检查存在错误或完全遗漏的真实危险。由于对象本身无法控制,它也会在对象之间创建错误的链接。

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

例如

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,则不允许。显然,这需要适当地扩展和设计,这对读者来说是一个练习。

0

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

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

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

但是,当你使用MVC结构时,一切都是一个类,所以它成为决定哪个类的问题。
我倾向于将认证规则放在Controllers类中,并对User类中的数据库逻辑进行认证。