Php Silex-拒绝从服务器端访问客户端
在服务器端,我接收到一个带有Uri路径的请求,客户端希望使用头中的令牌访问该路径。我的服务器将查看Php Silex-拒绝从服务器端访问客户端,php,symfony,silex,Php,Symfony,Silex,在服务器端,我接收到一个带有Uri路径的请求,客户端希望使用头中的令牌访问该路径。我的服务器将查看主机名和令牌,并确保它们有效。如果没有,我想阻止客户端访问API端点 下面是函数 $app->before(function(Request $request) use ($app) { $host = $request->getHost(); $token = $request->headers->get('token'); if(!$app['i
主机名
和令牌
,并确保它们有效。如果没有,我想阻止客户端访问API端点
下面是函数
$app->before(function(Request $request) use ($app) {
$host = $request->getHost();
$token = $request->headers->get('token');
if(!$app['isValidTokenService']($token)) {
$app['monolog']->addInfo(sprintf("%s is a invalid token", $token));
return $app->abort(401,'Unauthorized - bad credentials');
//return new Response('Unauthorized - invalid ****',401);
}
if(!$app['isValidHostService']($host)) {
$app['monolog']->addInfo(sprintf("%s is a invalid host", $host));
return $app->abort(401,'Unauthorized - invalid host');
//return new Response('Unauthorized - invalid ****',401);
}
return 'test';
});
我试着做一个返回新响应('Unauthorized-invalid****',401)代码>允许用户仍然访问端点。$app->abort()看起来很有魅力,但它不会对客户端做出任何响应,我认为这不是处理这种情况的正确方法
我如何正确处理这种情况以拒绝访问API端点并向我的客户端返回正确的错误代码。对不起,Joshua,我无法重现您的问题:
$ mkdir silex-test
$ cd silex-test
$ composer require silex/silex phpunit/phpunit
$ mkdir tests
现在在tests文件夹appTest.php中创建一个文件:
如您所见,从未调用/路由的控制器,因此Silex正在按预期工作
这只会给我带来一个问题:你使用的是哪个版本?(我已经用1.3和dev master尝试过了,dev master是2。0@dev)(虽然有点过时)解决了以前中间件的问题
更新
在上面的代码中,我试图说明返回新响应('before')
确实会取消所有其他执行。如果您查看断言:
$this->assertEquals('before', $app->handle($request)->getContent(), "before test didn't canceled the execution!");
我将处理一个请求的结果与/URI进行比较,后者应返回字符串,您永远不会看到我
但是它返回字符串before
,因为before
过滤器返回一个带有字符串before
的响应,并且从未调用路由路径/的控制器代码
如果要再次检查,请将控制器代码更改为:
$app->get('/', function() {
echo "You'll never see me as this is not called because of the before filter";
return new Response('you should never see me!');
});
并检查运行测试(vendor/bin/phpunit tests/appTest.php
)时是否从未输出字符串。您将永远看不到我,因为由于before筛选器,此字符串未被调用,因为从未调用过控制器代码。我不理解您的测试结果。返回新的响应('before')代码>在此之后是否应取消所有操作?我找到了问题所在。我使用了错误的includeSymfony\Component\BrowserKit\Response代码>@JoshuaDalley,很高兴你能来。
$this->assertEquals('before', $app->handle($request)->getContent(), "before test didn't canceled the execution!");
$app->get('/', function() {
echo "You'll never see me as this is not called because of the before filter";
return new Response('you should never see me!');
});