亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Slim 4 中的路由中間件不會停止調用路由中的可調用

Slim 4 中的路由中間件不會停止調用路由中的可調用

PHP
慕沐林林 2022-08-05 09:35:21
我正在Slim4中處理授權中間件。這是我的代碼:$app = AppFactory::create();$app->add(new Authentication());$app->group('/providers', function(RouteCollectorProxy $group){    $group->get('/', 'Project\Controller\ProviderController:get');})->add(new SuperuserAuthorization());身份驗證中間件檢查用戶并正常工作。提供程序控制器中的 get 方法是public function get(Request $request, Response $response): Response{    $payload = [];    foreach(Provider::all() as $provider){        $payload[] = [            'id' => $provider->id,            'name' => $provider->name,        ];    }    $response->getBody()->write(json_encode($payload));    return $response;}超級用戶授權如下所示class SuperuserAuthorization{    public function __invoke(Request $request, RequestHandler $handler): Response{        $response = $handler->handle($request);        $authorization = explode(" ", $request->getHeader('Authorization')[0]);        $user = User::getUserByApiKey($authorization[1]);        if(! Role::isSuperuser($user)){            return $response->withStatus(403);//Forbidden        }        return $response;    }}問題是,即使用戶不是超級用戶,應用程序也會繼續執行。結果,我得到了所有提供者的json和http代碼403 :/路由中間件難道不應該阻止請求進入應用程序并立即返回403嗎?我知道我可以創建狀態為403的新空響應,因此數據不會出來,但關鍵是請求永遠不應該超出這個中間件,我是對的還是我只是誤解了這里的東西......
查看完整描述

2 回答

?
慕俠2389804

TA貢獻1719條經驗 獲得超6個贊

中間件的更新版本是:


class SuperuserAuthorization{

    public function __invoke(Request $request, RequestHandler $handler): Response{

        $authorization = explode(" ", $request->getHeader('Authorization')[0]);

        $user = User::getUserByApiKey($authorization[1]);

        if(! Role::isSuperuser($user)){

            $response = new Response();

            return $response->withStatus(403);//Forbidden

        }

        return $handler->handle($request);

    }

}


查看完整回答
反對 回復 2022-08-05
?
富國滬深

TA貢獻1790條經驗 獲得超9個贊

路由中間件難道不應該阻止請求進入應用程序并立即返回403嗎?

Slim 4 使用 PSR-15 兼容中間件。在PSR-15元文檔中有一個很好的例子來說明如何實現授權中間件。如果您不希望進一步處理請求,則需要避免調用。$handler->handle($request)

正如您在示例中看到的,如果請求未獲得授權,則返回與 返回值不同的響應。這意味著你的觀點是說:$handler->handle($request)

我知道我可以創建狀態為403的新空響應,因此數據不會出來,但關鍵是請求永遠不應該超出這個中間件

在某種程度上是正確的,但是您應該通過在調用處理程序之前返回適當的響應來防止請求進一步發展,或者引發異常并讓錯誤處理程序處理它。

下面是一個簡單的中間件,它隨機授權一些請求,并為其他請求拋出一個異常:

$app->group('/protected', function($group){

    $group->get('/', function($request, $response){

        $response->getBody()->write('Some protected response...');

        return $response;

    });

})->add(function($request, $handler){

    // randomly authorize/reject requests

    if(rand() % 2) {

        // Instead of throwing an exception, you can return an appropriate response

        throw new \Slim\Exception\HttpForbiddenException($request);

    }

    $response = $handler->handle($request);

    $response->getBody()->write('(this request was authorized by the middleware)');

    return $response;

});

要查看不同的響應,請訪問路徑幾次(請記住中間件是隨機操作的)/protected/


查看完整回答
反對 回復 2022-08-05
  • 2 回答
  • 0 關注
  • 192 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號