在Slim框架中修改请求对象

时间:2014-05-26 03:28:54

标签: request slim

我正在开发一个简洁的框架中的小型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);

2 个答案:

答案 0 :(得分:2)

我们可以像下面那样修改身体:

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

Courtsey:ContentTypes中间件

答案 1 :(得分:1)

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

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

我是如何处理这类任务的,我试图只使用框架来消耗库而不处理任何逻辑。

但是,如果要执行此操作,可以转换请求正文并将其保存在需要解密密码的服务的新位置。

我几乎为每个需要专门写入Slim图层的代码使用Middleware。我只传递消耗类的函数,这些类充当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();
    }
}