2014-11-04 35 views
0

今天我在我的web服务中创建了一个函数,用于从mysql表中删除用户。 我使用SLIM框架来构建我的RESTful API。PHP:如何在不删除“身份验证”功能的情况下删除用户

这是我班的用户功能:

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”的用户,它总是出错,因为系统会删除用户依赖于它在头部授权submited API密钥。

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

有谁知道如何解决它?

谢谢:)

回答

0

我在这行代码很腥:

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

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

身份验证功能将你在执行deleteUser($user_id)之前运行,所以无论你怎么努力,你最终会删除当前认证的用户,因为$user_id = $db->getUserId($api_key)将当前认证USER_ID存储在全局变量。

这对您的实施将会非常糟糕,因为cureent用户会删除自己。那不是很酷的人。所以,我建议你最简单的解决方法,例如:

  1. 首先声明一个名为global $executor_id
  2. 然后global $user_id之外的另一个变量,更改您的代码从$user_id = $db->getUserId($api_key);$executor_id = $db->getUserId($api_key);它指定谁将会执行删除功能。
  3. 然后让你删除()函数中的index.php这样的:

    $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架构,但希望它帮助:)

+0

非常感谢!有用 ! – 2014-11-04 16:52:19

+1

我会添加到这个答案,你真的应该摆脱习惯使用'全局'声明赞成依赖注入。这将帮助您避免范围问题,如完全这样。 – 2014-11-04 16:53:51

+0

是的,我同意你@MikeBrant:D – 2014-11-04 18:22:02

相关问题