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