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 中如何响应 的相关文章

  • 尝试使用 SQL 身份验证登录失败

    我正在尝试使用 sa 用户名及其密码连接到 SQL Server 2008 在 SQL Server 日志文件中我看到以下错误 用户 sa 登录失败 原因 尝试使用 SQL 登录 认证失败 服务器配置为 Windows 身份验证 仅有的 当
  • 使用 PHP 将表单数据发送/发布到 URL [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我有一个通过 POST 提交的表单 提交表单后我捕获变量 如何连接表单数据 然后将其 POST 到 url 然后重新定向到感谢页面 这不是确
  • Laravel 验证:对 null 的成员函数调用失败()

    这段代码几天前还可以工作 但我似乎做了一些事情导致它崩溃 我有这条路线 Route post admin routemanagement AdminController addRoute 看起来像这样 public function add
  • Laravel 所有会话 ID 与 Redis 驱动程序

    在我的应用程序中 我希望允许某些用户能够注销除他 她之外的所有其他用户 当会话驱动程序设置为文件时 我已经完成了此功能 但现在我使用 redis 作为会话驱动程序 并且我无法找到任何方法来列出所有当前会话 就像我在文件时所做的那样司机 问题
  • mySQL 基于不同表的 SELECT(计数)更新表

    我有一个课程表和一个科目表 CLASS class id class name subject id date time imagine some rows here SUBJECT subject id subject name curr
  • 多语言网站的 .htaccess 规则

    我正在重新设计 PHP 多语言网站 en es de fr ru 的 URL 该网站的 URL 是这样的 www mysite com page www mysite com page subpage1 www mysite com pag
  • 在浏览器上验证 JWT

    我一直在读关于JWT https jwt io 我知道它分为三个部分 即header payload and signature 我将哈希算法保留在标头中 将基本信息保留在有效负载中例如 姓名 年龄 职务 有效期等在有效负载中 然后这两个都
  • 下拉 Ajax onchange SonataAdminBundle Symfony2 问题

    我正在尝试在 SonataAdminBundle 中实现 onchange 下拉菜单 我的实体就像 class BuilderHomePage var integer ORM Column name id type integer null
  • 无循环按键对多维数组求和

    我有这个 Array 0 gt Array f count gt 1 uid gt 105 1 gt Array f count gt 0 uid gt 106 2 gt Array f count gt 2 uid gt 107 3 gt
  • 将 gsutil 与谷歌驱动器(不是谷歌云存储)一起使用

    gsutil https cloud google com storage docs gsutil csw 1 gettingstarted use 博托配置文件 https cloud google com storage docs gs
  • 如何诊断这些 PHP 代码覆盖分段和 zend_mm_heap 损坏错误

    我一直很高兴在我的 Ubuntu 机器上编码 这是一台拥有大量内存的强大机器 我正在研究 4 个新课程 一边编写和运行单元测试 在某些时候 我注意到 虽然单元测试完成得很好 但代码覆盖率却没有 在消息 正在生成代码覆盖率报告 等 之后 我会
  • 将 Javascript 正则表达式转换为 PHP

    我知道这个问题已经被问了大约十几次 但是从技术上讲 这个问题并不是一个骗局 如果您愿意 请检查其他问题 基本上 我有一个 Javascript 正则表达式来检查用于前端验证的电子邮件地址 并且我使用 CodeIgniter 在后端进行双重检
  • 将 __DIR__ 常量与字符串连接作为数组值,该数组值是 PHP 中的类成员

    谁能告诉我为什么这不起作用 这只是我在其他地方尝试做的事情的一个粗略的例子 stuff array key gt DIR value 但是 这会产生错误 PHP Parse error syntax error unexpected exp
  • 如何向 opencart 管理添加新模块?

    我想在 opencart 管理中将子菜单项 位置 添加到 目录 菜单项 在选择位置时 我想看到我自己的位置管理视图页面 该页面与 opencart 数据库中我自己的位置表相互关联 请让我知道在哪里以及创建什么 mvc 才能在开放购物车中实现
  • 根据 WooCommerce 中的特定付款方式添加费用

    在 WooCommerce 中 我需要为特定支付网关申请自定义手续费 我这里有这段代码 如何向 WooCommerce Checkout 添加手续费 http www endocreative com add handling fee wo
  • PHP写入文件时,如何使用现有文本在文件前面添加和追加文本?

    我正在使用 PHP 创建一个 xml 文件 这里有一些示例代码 myFile example file xml fh fopen myFile w while row mysql fetch array result stringData
  • 修复 PHP 中格式错误的 HTML?

    我正在根据用户提供的片段构建一个大型 HTML 文档 这些用户有以各种方式格式错误的烦人习惯 浏览器足够强大且宽容 但我希望能够验证并 理想情况下 修复任何格式错误的 HTML 如果可能的话 例如 td b Title b td 可以合理地
  • 在 MySQL 表中存储用户密码的最佳 PHP 哈希方法?

    我已经阅读 Stack Overflow 问题大约 15 分钟了 每一个问题似乎都与我之前读到的问题相矛盾 Bcrypt SHA1 MD5 等 我目前对我的密码进行 MD5 但我想让我的数据库在发生泄露时更加安全 我知道这个问题已经被问了一
  • 需要用户使用 NTLM 重新进行身份验证

    我是 NTLM web config 中的authenication windows 有一个 asp net mvc 2 0 站点 现在 一旦用户登录 他们就会一次保持登录状态数周 该应用程序的使用正在向共享使用登录服务帐户的计算机的用户开
  • 在 while 循环内查询可以吗?

    我在一个数据库中有两个表 我正在查询第一个表限制 10 然后循环结果 在 while 循环内 我使用第一个查询中的数据作为参数再次执行另一个查询 以下是该脚本的示例

随机推荐

  • 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 代码