Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/257.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Silex-拒绝从服务器端访问客户端_Php_Symfony_Silex - Fatal编程技术网

Php Silex-拒绝从服务器端访问客户端

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

在服务器端,我接收到一个带有Uri路径的请求,客户端希望使用头中的令牌访问该路径。我的服务器将查看
主机名
令牌
,并确保它们有效。如果没有,我想阻止客户端访问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')在此之后是否应取消所有操作?我找到了问题所在。我使用了错误的include
Symfony\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!'); 
});