Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
谁/什么认证用户PHP OO_Php_Security_Oop_Authentication - Fatal编程技术网

谁/什么认证用户PHP OO

谁/什么认证用户PHP OO,php,security,oop,authentication,Php,Security,Oop,Authentication,在这里讨论如何进行身份验证,或者更可能。谁应该对用户进行身份验证 给出以下代码示例: <?php class User { public function isValid($username, $password) { //Logic to check if username/password match $this->setId($id); } } 您的用户对象将是用户配置文件的模型,包含用户名、密码、电子邮件等详细信息。但是,理论上,您可以在网站

在这里讨论如何进行身份验证,或者更可能。谁应该对用户进行身份验证

给出以下代码示例:

<?php
class User {
  public function isValid($username, $password) {
      //Logic to check if username/password match
      $this->setId($id);
  }
}

您的
用户
对象将是用户配置文件的模型,包含用户名、密码、电子邮件等详细信息。但是,理论上,您可以在网站上拥有配置文件,而无需将其链接到登录名(可能只有一名主管理员可以编辑配置文件)

您的
Auth
类将处理登录检查,正如我想象的那样,它还将处理设置和删除用户会话,这与实际的用户配置文件是分开的

  • User
    =用户数据的模型
  • Auth
    =验证逻辑

这样想,如果您决定更改配置文件身份验证的工作方式(可能删除您自己的登录过程并用Twitter OAuth替换),将身份验证逻辑与您的用户配置文件分离可能会更简单。

逻辑应该而不是在用户身上,原因有两个:

  • 它将逻辑与特定后端的身份验证耦合到用户
  • 该方法对外部参数而不是对象成员进行操作
  • 现在,您可以通过执行以下操作来解耦身份验证逻辑(1)并处理对象成员(2)

    但是这就产生了一个问题:为什么(以及如何)在用户身上存储密码。你肯定不想有明文。在我看来,散列密码不是用户的责任。事实上,如果不向用户添加salt,就不能在用户中散列它,这是我认为典型的用户属性所不具备的。您可以在$adapter中对密码进行哈希处理,然后用盐将其重新哈希,但这只是治标不治本。在OOP中,对象方法应该对对象的成员进行操作。但是,如果密码首先不应该是用户的成员,那么使用它的方法也不应该在User()上


    不用说,如果您使用的是ActiveRecord,那么很可能会有类似于上述内容的内容,或者将身份验证方法作为用户的静态方法,然后返回一个实例。就我个人而言,我不喜欢AR和静态方法,所以我会使用一个单独的身份验证服务类为我返回用户。

    你说得对,一个人在看电影时进行身份验证并不常见。在你与同事的争论中,你可能想概括如下:

    谁负责认证 用户

    这是一个问题,你可以问自己,每次你似乎卡在一个设计问题。我并不是说这是一条可以回答你所有问题的规则,但它可以在很多情况下消除困扰,你的问题就是一个很好的例子

    您可能还需要阅读以下文本:


    让你困惑的是:第三种解决方案<代码>类用户{公共静态函数身份验证($username,$password){/*test*/return$User;}}
    :)这是我喜欢的方式。然而,我认为没有办法。这取决于您的应用程序设计。我更喜欢第二种解决方案。看看Zend Framework的
    Zend_Auth
    ,它解决了这个问题,并且构建得很好
    Zend_Acl
    可能也会引起人们的兴趣。我们目前有一个RBAC系统,似乎可以正常工作。只是解决了我们想要验证用户身份的问题。您的示例方法
    isValid()
    建议它返回一个布尔值,而不是有效的用户配置文件。您应该使用
    isValid()
    检查有效的会话,然后使用
    getLoggedInUser()
    之类的方法调出登录的配置文件。用户不应该以明文或哈希形式包含密码。同样,凭据可以单独存储。我的例子来自于我发现在一些CMS数据库模式中很常见的东西。通过创建一个新的用户对象,您的第二点可以被取消。通过窗体设置给定的用户名和密码,并运行验证函数来检查属性。(尽管我不想那样!!;)我认为到目前为止,第一个是我能用来说服同事的最有说服力的方法。迈克也解释了。我们为用户holsd设置的数据库行当前包含用户名、哈希和salt。每行的盐是唯一的。将其从用户行中删除并添加到另一个表中有什么好处?用户对象本身不知道盐是否there@Tjirp实际上,我在示例代码中处理了这两个问题。它不是无效的。您所描述的是上面的示例应该显示的内容:使用u/p作为对象成员的用户对象。我下面的代码段解释了为什么这是个坏主意。密码不属于用户(任何Salt也不属于用户)。你需要凝聚力。
     <?php
     class Auth {
        public function isValid($username, $password) { 
          //Logic to check if username/password match
          $user = new User;
          $user->setId($id);
          return $user;
        }
      }
    
    class User … 
        public function authenticate(Authenticable $adapter)
        {
            $this->isAuthenticated = $adapter->authenticate(
                array(
                    'username' => $this->username,
                    'password' => $this->password,
                )
            );
        }
    }