【问题标题】:Modify request object in Slim framework在 Slim 框架中修改请求对象
【发布时间】:2014-07-10 09:50:03
【问题描述】:

我正在开发一个苗条框架中的小型 REST 应用程序。在这种情况下,用户密码在请求正文中作为 xml 或 json 加密发送。我想在可调用函数中解密该密码并更新请求正文,以便在实际的回调函数中我们可以在不解密的情况下验证密码。我想执行以下步骤:

$decrypt = function (\Slim\Route $route) use ($app) {
   // Decrypt password and update the request body
};

$update = function() use ($app) {
   $body = $app->request()->getBody();
   $arr = convert($body);
   $consumer = new Consumer($arr);
   if ($consumer->validate()) {
      $consumer->save();
      $app->response()->status(201);
   } else {
.....
   }   
}

$app->put('/:consumer_id', $decrypt, $update);

【问题讨论】:

  • 您想发送每个请求中加密的密码吗?
  • @GuilhermeCardoso,不,我想要它用于更改密码等操作。
  • 我现在在解密密码后将请求正文保存到 $app->body
  • 如果这对您有用,请继续!我回答了一个更强大的解决方案,但应用了满足项目需求和截止日期的解决方案。干杯;)
  • @GuilhermeCardoso,我在您回答之前发表了该评论

标签: request slim


【解决方案1】:

我们可以像下面这样修改body:

$env = $app->environment;
$env['slim.input_original'] = $env['slim.input'];
$env['slim.input'] = 'your modified content here';

Courtsey:ContentTypes 中间件

【讨论】:

    【解决方案2】:

    您说要解密密码并更新请求正文。如果您在客户端加密密码,我宁愿在 API 服务之类的服务器端层中解密密码(或者像 mvc 中的控制器一样消耗业务层的东西)。

    我确实相信这个解密过程应该属于您的应用程序,而不是在使用您的代码之前在外面进行。我不知道你是如何加密的,但如果你使用服务器端编程在这些请求中生成一个新的哈希,对我来说,这甚至是在库中进行加密的更好理由。

    这就是我处理此类任务的方式,我尝试仅使用框架来使用库而不处理任何逻辑。

    但是,如果您想这样做,您可以转换请求正文并将其保存在需要解密密码的服务的新位置。

    对于我需要专门为 Slim 层编写的几乎所有代码,我都使用中间件。我只传递消费类的函数,这些类充当 API 层并从 Slim 中抽象出来。对于您的情况,请使用中间件将此逻辑保留在自己的位置。

    class DecriptPasswordRequest extends \Slim\Middleware
    {
        public function call()
        {
            $decriptedRoutes = array('login', 'credentials');
            $app=$this->app;
            $container = $app->container;
            $currentRoute = $app->router()->getCurrentRoute();
    
            if ($app->request->getmethod() == 'POST' && in_array($currentRoute, $decriptedRoutes){
                $body = $app->request->post();
                if (!isset($body['password'])){
                    throw new Exception('Password missing');
                }
                $provider = new ClassThatDecryptPassword();
                $body['password'] = $provider->decrypt($body['password']);
            }
            $container['bodydecripted'] = $body;
            $this->next->call();
        }
    }
    

    【讨论】:

    • 你检查代码了吗?今天只有我有时间这样做。执行中间件调用函数时不会准备路由。因此我们不能在中间件 call() 函数中使用 getCurrentRoute() 函数。它会给你null。您可以使用 $app->request()->getPathInfo()。欲了解更多信息,请转到 herehere
    猜你喜欢
    • 1970-01-01
    • 2015-10-24
    • 2014-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-15
    • 2013-06-12
    相关资源
    最近更新 更多