Middleware Slim PHP Framework 中如何响应

2024-03-14

我正在创建用于 REST API 身份验证的中间件。我的 API 是使用 Slim PHP 框架创建的,它提供了构建 API 的强大功能。这些功能之一是中间件。
我需要检查中间件中的凭据并向用户响应错误(带有 JSON 描述的 HTTP 代码)。
但不幸的是,每当我尝试停止并使用 HTTP 代码进行响应时,Slim Framework 都会给我一个异常。

<?php
require_once __DIR__.'/../Slim/Middleware.php';
class TokenAuth extends \Slim\Middleware {
    private $auth;
    const SECURED_URI_REGEX = "/^\/v\d\/store\/(orders|users|payment).*/";
    const TOKEN_PARAMETER = "token";
    const USER_EMAIL_PARAMETER = "user_email";
    public static $credentialsArray = array(TokenAuth::TOKEN_PARAMETER,TokenAuth::USER_EMAIL_PARAMETER);
    public function __construct() {  
    }
    public function deny_access() {
       print Response::respondWithHttpStatus($app,401,true);
    }
    public function call() {
         $app = $this->app;  
        $uri = $app->request->getResourceUri();
        if (preg_match(TokenAuth::SECURED_URI_REGEX, $uri)) {
             $tokenAuth = $app->request->headers->get('Authorization'); 
             if(isset($tokenAuth)) {
             $parsedCredentials = TokenAuth::parseAndValidateCredentials($tokenAuth); 
             if (!$parsedCredentials) {
                 Response::respondWithHttpStatus($app,401,true);
             }
             else {
                $auth = new Authenticator($parsedCredentials[TokenAuth::USER_EMAIL_PARAMETER],$app);
                print $auth->userHasToken();
             }
         }
         else {
             Response::respondWithHttpStatus($app,400,true);
         }
        }
        else {
             $this->next->call();
        }

    }

响应HttpStatus方法采用slim框架方法$app->halt($code, $response);

在这种情况下,当我尝试执行此方法时,我收到异常

Slim Framework 
The application could not run because of the following error:

Details

Type: Slim\Exception\Stop
File: /var/www/api/Slim/Slim.php
Line: 1022

如何处理这个问题。
我的目标是控制中间件中的用户凭据,如果出现问题,请使用适当的 HTTP 代码和描述错误原因的 JSON 消息进行响应。
也许采取另一种方式会更好。
请建议。

一种可能的解决方法

   $app->response->setStatus(400);
   $app->response->headers->set('Content-Type', 'application/json');
   print Response::respondWithHttpStatus($app,400,false);

以及响应函数

public static function basicRespond($app,$code,$message,$halt) {

    if(!isset($message) || empty($message)) {
        $message = Response::$RESPONSE_MAP[$code];
    }
    $response = json_encode($message);
    if($halt===true) {
        $app->halt($code, $response);
    }
    else {
        return $response;
    }
}

对于我的需求来说,抛出异常也可以是另一种解决方案,但就我而言,我不需要继续,只需设置标头、代码并且不调用 next - 对我有用。


你不能使用halt在中间件中:

https://stackoverflow.com/a/10201595/2970321 https://stackoverflow.com/a/10201595/2970321

Halt 只能在路由回调的上下文中调用。

相反,您可以手动生成400使用 PHP 的响应header随着exit:

header("HTTP/1.1 400 Access denied");
exit;

或者,

你可以定义一个新的异常类型:

class AuthException extends Exception {
    public function __construct() {
        $message = 'You must authenticate to access this resource.';
        $code = 400;
    }
}

在你的error route:

$app->error(function (\Exception $e) use ($app) {
    // Example of handling Auth Exceptions
    if ($e instanceof AuthException) {
        $app->response->setStatus($e->getCode());
        $app->response->setBody($e->getMessage());
    }
});

并抛出一个AuthException当授权被拒绝时:

throw new AuthException();

这基本上是如何完成的Slim-Auth https://github.com/jeremykendall/slim-auth.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Middleware Slim PHP Framework 中如何响应 的相关文章

  • PHP DBlib PDO 问题

    我正在尝试通过 php 连接到 MSSQL 服务器 但我的 pdo 连接给我带来了困难和我不太理解的错误 我在下面粘贴的代码一周前运行得很好 突然间它就停止了 没有任何人进行任何更改 我仍然可以连接到服务器并直接从命令行运行查询 但我在 p
  • 如何将JS/CSS文件包含到Slim框架的模板中?

    我正在使用 Slim 框架开发一个简单的网络应用程序 我遇到了一个可能很简单的问题 我想将静态文件 CSS 和 Javascript 包含到我的模板中 我的项目文件夹结构如下 index php lt where all the routi
  • 提交简单 PHP 表单时出现禁止错误

    我有一个不复杂的问题 这似乎比应有的更复杂 我有一个简单的表单 用于向网站添加内容 有些字段需要输入html 然而 当您在表单的不同部分输入某些 html 元素时 它会认为它讨厌您并抛出禁止的 403 错误 这是下面的表格
  • 传递给 Illuminate\Routing\Middleware\ThrottleRequests::addHeaders() 的参数 1 必须是以下实例

    我创建了一个新的中间件来检查用户令牌我创建了中间件然后添加到 kernal php 但是当我尝试访问中间件中的 request 时我收到错误 这是我的中间件代码 namespace App Http Middleware use Illum
  • 与 PHP 相比,Python 与 HTML 的“流畅”程度如何?

    我正在考虑从使用 PHP 切换到使用 Python 来开发 Web 应用程序 但我想知道 Python 是否像 PHP 一样擅长在 HTML 中穿插 本质上 我发现它使用起来非常简单 直观将 PHP 放在我想要的位置 然后可以随意安排 组织
  • 很简单的PHP加法问题

    我想我已经关注这个问题太久了 为什么这段代码打印 no 它应该打印 yes 不是吗 我在 PHP 5 3 和 PHP 5 2 上尝试过 都打印 no See 比较浮点数 http www cygnus software com papers
  • Google Closure 编译器和 multipart/form-data 不起作用

    我正在向 google 闭包编译器 API 服务发出请求 content file get contents file js url http closure compiler appspot com compile post true p
  • 将 jQuery 与 Selenium WebDriver 结合使用 - 如何将 JSON 对象转换为 WebElement?

    我正在使用 Selenium WebDriver 我想执行 jQuery 代码来查找一些元素 我的代码如下 public function uploadGrantDoc script return itemlist grant file u
  • 唯一的图像哈希值即使 EXIF 信息更新也不会改变

    我正在寻找一种方法来为 python 和 php 中的图像创建唯一的哈希值 我考虑过对原始文件使用 md5 和 因为它们可以快速生成 但是当我更新 EXIF 信息 有时时区关闭 时 它会更改总和 并且哈希也会更改 有没有其他方法可以为这些文
  • PHP 何时实现了函数使用闭包? [复制]

    这个问题在这里已经有答案了 我在 PHP 手册中找不到解释的部分use 我有代码 num 0 array walk recursive REQUEST function mValue use num num 我的 Eclipse 抱怨 Pa
  • Chromecast CAF 接收器应用程序中的身份验证

    我有一个帮助 URL 在播放之前需要使用令牌进行身份验证 如何将令牌标头添加到接收方 CAF 应用程序 我在文档中进行了搜索 但找不到接收方 CAF 应用程序的任何身份验证参考 在 V2 播放器中我们可以拦截请求updateSegmentR
  • 将 Base64 字符串转换为图像文件? [复制]

    这个问题在这里已经有答案了 我正在尝试将我的 Base64 图像字符串转换为图像文件 这是我的 Base64 字符串 http pastebin com ENkTrGNG http pastebin com ENkTrGNG 使用以下代码将
  • 如何检测iPhone是否有视网膜显示屏?

    如何检测 iPhone 是否配备视网膜显示屏 有靠谱的办法吗 要么是纯 PHP 要么最好是 Zend Framework 方式来执行此操作 我通过这个弄清楚了 var retina window devicePixelRatio gt 1
  • 安全地评估简单的数学

    我想知道是否有一种安全的方法来评估数学 例如 2 2 10000 12000 10000 20 2 2 40 20 23 12 无需使用eval 因为输入可以来自任何用户 我需要实现的只是整数的加法和减法 是否有任何已经存在的代码片段 或者
  • 使用 yaml 路由描述时如何在运行时获取 Symfony2 中的路由名称?

    在这里你可以找到我的n关于 Symfony2 的第一个问题 我正在与一个分页捆绑 https github com makerlabs PagerBundle wiki使用中提供的路由名称routing yml文件 从我的角度来看 这种方法
  • 将 docker-compose.yml 中的包安装到 docker 容器中

    我是 docker 和 docker compose 的初学者 我需要你的帮助 我正在使用 docker compose 制作 PHP NGINX PostgresQL symfony 开发环境 这里是 web image nginx 1
  • Yii2 无效调用:设置只读属性

    我有一个Post具有多对多关系的模型Tags 在 Post 模型中定义 public function getTags return this gt hasMany Tags className id gt tag id gt viaTab
  • 如何强制下载图片?

    我的页面上有一个动态生成的图像 如下所示 img src 我不想告诉我的用户右键单击图像并点击保存 而是想公开一个下载链接 单击该链接将提示下载图像 如何实现这一目标 最初我在 js 中尝试这样做 var path my image att
  • 将 Hbase 与 PHP 集成 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我已经安装了 Hbase 现在我正在寻找一些 PHP 库来将 hbase 与 PHP 集成 我尝试了 2 个库 第一个是我尝试与 th
  • 突出显示单词并提取其附近文本的函数

    我有一个文本例如 Etiam porta semmalesuada magna mollis euismod 整数取数 ante venenatis dapibus posuere velit aliquet 埃蒂亚姆 门塔 塞姆 male

随机推荐

  • mysql 加载数据内文件更新

    我目前正在使用 mySQL LOAD DATA INFILE 将 csv 文件插入到我的数据库中 该 csv 文件每天都会下载到服务器 以保持产品数据最新 我想知道的是如何使用新的 csv 更新表并保留没有不同的现有数据 这是我目前的声明
  • scala 中的插入排序实现

    我正在尝试 Scala 我想看看如何在 scala 中实现插入排序 并满足以下要求 嵌套 for 循环 输入数组 Int 如果可能的话 通过引用方式修改函数内容的方法 否则返回 Array Int 如果这不是实现插入排序的 Scala 方法
  • 抓取时如何避免连接节点中的所有文本

    当我从 HTML 或 XML 中抓取多个相关节点来提取文本时 所有文本都会连接成一个长字符串 从而无法恢复单个文本字符串 例如 require nokogiri doc Nokogiri HTML lt
  • sed 仅替换完全匹配

    我不想替换像这样的字符串Europe12 with Europe12 yesturday在一个文件中 不改变Europe12 36文件中也存在的字符串 I tried basename Europe12 sed i s b basename
  • 为什么Matlab中复数共轭转置是默认的

    如果矩阵有复数元素并且我想使用命令将 A 转置为 A gt gt A 为什么设计是这样的a bi转变为a bi 它有什么用 From here http mathworld wolfram com ConjugateTranspose ht
  • 站点根相对路径不起作用

    我不明白这一点 它搞砸了整个网站 因为我使用的是 php 模板 根据我读过的每一篇文章 据说以 开头的链接会让我从根开始 但是 当我以 开头时 它根本不起作用 我的变量位于 public html cis130 textfiles php
  • 将 fgetcsv 响应转换为特定的 json

    我有一个带有标题的 CSV 文件 Description BusinessSurname IsCustomer IsSupplier AddressType Business Address IsInternational 第一排 Cont
  • JSTL、Bean 和方法调用

    我正在开发一个 JSP 我需要调用来自 Bean 的对象的方法 以前版本的页面没有使用JSTL 并且可以正常工作 我的新版本有这样的设置
  • 在 .NET 中加载第一个 sql 连接需要很长时间

    由于某种原因 第一次打开与 SQL Server 数据库的连接需要 7 秒 后续连接需要一秒 知道原因是什么吗 我正在使用 C 和 asp net 编译后 我每次重新启动站点时都会本质上 这意味着每次它需要实际创建 第一个 连接 我知道设置
  • 从数组中仅删除一个重复项

    我试图只从数组中删除 2 之一 但我的代码删除了所有这些 我的代码如下 var arr 2 7 9 5 2 arr filter item gt item 2 and var arr 2 7 9 2 2 5 2 arr filter ite
  • 让我的 jProgressBar 在 1 到 100 的计时器上运行

    我正在浏览这个线程 如何让定时器倒计时并带有进度条 https stackoverflow com questions 5931933 how to make timer countdown along with progress bar
  • 使用 pyinstaller 和 pysqlcipher 创建一个文件 exe 时出现问题

    我正在尝试创建一个文件 exe 以在任何 Windows 计算机上运行 但我遇到了 pysqlcipher 问题 我已经回到了一些基本代码 仅使用密钥创建一个简单的数据库 在我的开发机器上 无论我使用 python 文件还是编译的 exe
  • 使用 PyPDF2 批量旋转 PDF 文件

    我一直在编写用于批量旋转文件夹内的 PDF 文件的代码 但我找不到迭代和更改旋转文件的目标文件夹的方法 我的目的是将新文件以相同的名称保存在另一个文件夹中 from os import listdir from PyPDF2 import
  • 阻止空格键触发 Eclipse 中的自动完成

    Update This was fixed in Eclipse 2018 12 This behaviour is still default but can be configured off see the accepted answ
  • jQuery 单击事件的行为与 Firefox 中的实时功能不同

    使用 Firefox 时 将事件单击与实时功能结合使用会导致奇怪的行为 在 Firefox 中 右键单击时也会触发单击 Internet Explorer 7 和 Google Chrome 中都不会发生同样的情况 Example 没有直播
  • HTML:不同的浏览器以不同的实际 px 大小呈现 1em 的情况有多常见?

    如您所知 您可以使用 CSS 指定尺寸 以 px 或 em 为单位 据我了解 em 的意思是 当前元素字体的行高 我目前的方法是始终使用 px 也用于边距 这似乎是一个有争议的做法 问题 我可以依赖 px 和 em 的比例在不同浏览器中保持
  • Maven exec 插件不能依赖提供的依赖项?

    在我的 POM 中我有这个依赖项
  • 使用扩展方法时出现意外行为

    为什么会出现这种情况 请遵守以下代码 static class StringExtension public static string Remove this string s char c return s Replace c ToSt
  • 我想调试(在其中设置断点)System.Web.Mvc.DefaultControllerFactory,这可能吗?

    我有一个引用 GAC 中的 System Web Mvc 程序集的项目 我还有来自 Codeplex 的 ASP NET MVC 源代码 我想通过逐步了解 DefaultControllerFactory 的方法来更好地理解它 我该如何设置
  • Middleware Slim PHP Framework 中如何响应

    我正在创建用于 REST API 身份验证的中间件 我的 API 是使用 Slim PHP 框架创建的 它提供了构建 API 的强大功能 这些功能之一是中间件 我需要检查中间件中的凭据并向用户响应错误 带有 JSON 描述的 HTTP 代码