代码之家  ›  专栏  ›  技术社区  ›  sam

php oop-如何处理授权?

  •  5
  • sam  · 技术社区  · 16 年前

    我正在为我的想法建立一个管理系统。我精通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 回复  |  直到 16 年前
        1
  •  3
  •   Artefacto    16 年前

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

    在我最近的项目中,我遇到了几个不同的模型。最简单的方法之一是基于页面的权限,如果您使用基于页面的流,并使用对象作为支持,这是很好的方法:在页面顶部定义应该访问它的人,以防重定向。这是最简单的一个,但在特定的应用程序中非常有用。

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

    我目前使用的是MVC模式,我有一个控制器,它将操作分派给它的子代。它唯一的公共方法是 execAction($params) 它会呼叫 actionAction($params) 但首先它会检查权限。

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

        2
  •  1
  •   Martin Bean    16 年前

    我已经写了一个非常可靠和健壮的CMS系统。我是这样做的,我希望你能推断出一些关于自己解决问题的信息。

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

    希望这有帮助。

        3
  •  0
  •   Liutas    16 年前

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

    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

        4
  •  0
  •   Richard Harrison    16 年前

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

    在类外验证可能更糟,因为存在授权检查错误或完全错过的真正危险。它还会在对象之间创建错误类型的链接,因为对象本身不受控制。

    如果要在创建对象时在对象外部执行此操作,则最好要求对象提供 interface 例如可以由单独的对象验证的iaauthorisable。

    例如

    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为空,则不允许。显然,这需要适当地扩展和设计,这留给读者作为练习。

        5
  •  0
  •   Bob Fanger    16 年前

    面向对象的基础知识
    如果把它包括在课堂上是合理的。你 能够 去做吧。
    Book类是否具有身份验证功能?不,像download()和converttopdf()这样的函数更有意义。

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

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

    但是,当您使用MVC结构时,所有内容都是一个类,因此它成为决定哪个类的问题。
    我倾向于将身份验证规则放在控制器类中,将对数据库逻辑的身份验证放在用户类中。

    推荐文章