【问题标题】:PHP: How to delete user without delete the 'authenticate' functionPHP:如何在不删除“身份验证”功能的情况下删除用户
【发布时间】:2014-11-05 00:42:31
【问题描述】:

今天我在我的 web 服务中创建了一个函数来从 mysql 的表中删除用户。 我使用 SLIM 框架来构建我的 RESTful API。

这是我班级用户中的功能:

    public function deleteUser($user_id) 
    {
        $stmt = $this->conn->prepare("DELETE 
                                      FROM users
                                      WHERE user_id = ?");
        if($stmt == FALSE)
        {
            die($this->conn->error);
        }
        else 
        {
            $stmt->bind_param("i", $user_id);
            $stmt->execute();
            $num_affected_rows = $stmt->affected_rows;
            $stmt->close();
            return $num_affected_rows > 0;
        }
    }

这是我在 index.php 中的代码

    $app->delete('/users/:user_id', 'authenticate', function() use($app) 
    {
        global $user_id;

        $db = new User();
        $response = array();

        $result = $db->deleteUser($user_id);

        if ($result) 
        {
            // user deleted successfully
            $response["error"] = false;
            $response["message"] = "User deleted succesfully";
        } 
        else 
        {
            // user failed to delete
            $response["error"] = true;
            $response["message"] = "User failed to delete. Please try again!";
        }
        echoRespnse(200, $response);
    });

问题是我的身份验证功能是从用户表中获取 user_id 以放置在标头授权中。

  function authenticate(\Slim\Route $route) 
  {
     // Getting request headers
     $headers = apache_request_headers();
     $response = array();                                                                                                                                                                                                                                                                                                                                                                                                                                                               
     $app = \Slim\Slim::getInstance();

     // Verifying Authorization Header
      if (isset($headers['Authorization'])) 
      {
         $db = new User();

         // get the api key
         $api_key = $headers['Authorization'];
         // validating api key
         if (!$db->isValidApiKey($api_key)) 
         {
             // api key is not present in users table
             $response["error"] = true;
             $response["message"] = "Access Denied. Invalid Api key";
             echoRespnse(401, $response);
             $app->stop();
         } 
         else 
         {
             global $user_id;
             // get user primary key id
             $user_id = $db->getUserId($api_key);
         }
      } 
      else 
      {
         // api key is missing in header
         $response["error"] = true;
         $response["message"] = "Api key is misssing";
         echoRespnse(400, $response);
         $app->stop();
      }
  }

所以每次我尝试删除带有'user_id'的用户时,总是出错,因为系统将删除用户取决于在标题授权中提交的API KEY。

我的目标是:删除功能将删除具有用户 ID 的用户。

有人知道怎么解决吗?

谢谢:)

【问题讨论】:

    标签: php mysql web-services rest slim


    【解决方案1】:

    这几行代码我很可疑:

    else 
    {
        global $user_id;
        // get user primary key id
        $user_id = $db->getUserId($api_key);
    }
    

    你自己最大的问题是,$user_id 作为全局变量的范围是什么?

    Authenticate 函数会在你执行deleteUser($user_id) 之前运行,所以无论你怎么努力,你最终都会删除当前已通过身份验证的用户,因为$user_id = $db->getUserId($api_key) 会将当前已通过身份验证的 user_id 存储到全局变量中。

    这对您的实施非常不利,因为curent 用户会自行删除。那不是很酷的人。因此,我建议您使用最简单的解决方法,例如:

    1. 首先在global $user_id 旁边声明另一个名为global $executor_id 的变量
    2. 然后,将您的代码从$user_id = $db->getUserId($api_key); 更改为$executor_id = $db->getUserId($api_key); 它指定谁将执行删除功能。
    3. 然后在 index.php 中创建你的 delete() 函数,如下所示:

      $app->delete('/users/:user_id', 'authenticate', function() use($app) 
      {
          global $user_id;
          global $executor_id;
      
          $db = new User();
          $response = array();
      
          $user_id = // please get the user_id that would be deleted here.
      
          $result = false;
          if($user_id != $executor_id)
              $result = $db->deleteUser($user_id);
      
          if ($result) 
          {
              // user deleted successfully
              $response["error"] = false;
              $response["message"] = "User deleted succesfully";
          } 
          else 
          {
              // user failed to delete
              $response["error"] = true;
              $response["message"] = "User failed to delete. Please try again!";
          }
          echoRespnse(200, $response);
      });
      

    抱歉,我对 SLIM 框架不熟悉,但希望对您有所帮助:)

    【讨论】:

    • 我想在这个答案中补充一点,你真的应该改掉使用global 声明来支持依赖注入的习惯。这将帮助您完全避免此类范围问题。
    • 是的,我同意你的看法@MikeBrant:D
    猜你喜欢
    • 2022-01-19
    • 2012-02-08
    • 1970-01-01
    • 1970-01-01
    • 2021-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多