Laravel:路由中间件和策略之间的区别

2024-03-04

使用 Laravel 开发应用程序我意识到可以做什么Policy完全可以用Middleware。假设我想阻止用户更新路线,如果他/她不是信息的所有者,我可以轻松地从路线中进行检查,并且可以从策略中执行相同的操作。

所以我的问题是为什么我应该使用policy通过中间件,反之亦然


我目前正在对我的角色、权限和路线进行一次小型重构,并问自己同样的问题。

从表面上看,真正的中间件和策略似乎执行相同的总体思路。检查用户是否可以做他们正在做的事情。

作为参考,这里是 laravel 文档...

中间件“我可以看看这个吗?我可以去这里吗?”

HTTP中间件提供了一种便捷的HTTP过滤机制 请求输入您的应用程序。例如,Laravel 包括 验证应用程序用户的中间件是 已验证。如果用户未通过身份验证,中间件将 将用户重定向到登录屏幕。但是,如果用户是 经过身份验证后,中间件将允许请求继续进行 进一步进入应用程序。

当然,可以编写额外的中间件来执行各种操作 除了身份验证之外的任务。 CORS 中间件可能是 负责为所有离开的响应添加正确的标头 你的申请。日志中间件可能会记录所有传入请求 到您的应用程序。

https://laravel.com/docs/master/middleware#introduction https://laravel.com/docs/master/middleware#introduction

在我的阅读中,中间件是关于在请求级别进行操作的。在“这个用户可以see页面?”,或“该用户可以在这里执行某些操作吗?”

如果是这样,它将转到与该页面关联的控制器方法。有趣的是,中间件可能会说:“是的,你可以去那里,但我会写下你要去的地方。” ETC。

一旦完成。它不再控制或说明用户正在做什么。我将其视为中间人的另一种方式。

Policies“我可以这样做吗?我可以改变这个吗?”

除了提供开箱即用的身份验证服务之外, Laravel 还提供了一种简单的方法来组织授权逻辑和 控制对资源的访问。有多种方法和方法 帮助您组织授权逻辑的助手,以及 我们将在本文档中介绍它们中的每一个。

https://laravel.com/docs/master/authorization#introduction https://laravel.com/docs/master/authorization#introduction

然而,政策似乎更关心doing。用户可以更新任何条目,还是只能更新自己的条目?

这些问题似乎适合控制器方法,其中组织了对资源的所有操作调用。检索该对象、存储或更新文章。

As tjbb 提到 https://stackoverflow.com/a/35028244/723255/,中间件会使路由变得非常混乱并且难以管理。这是我的路线文件中的示例:

问题

    Route::group(['middleware' =>'role:person_type,person_type2',], function () {
        Route::get('download-thing/{thing}', [
             'as' => 'download-thing', 
             'uses' => 'ThingController@download'
        ]);
    }); 

这在我的路线文件中很难阅读!

另一种政策方法

//ThingController
public function download(Thing $thing)
{
    //Policy method and controller method match, no need to name it
    $this->authorize($thing);

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

Laravel:路由中间件和策略之间的区别 的相关文章

  • PHP使用正则表达式查找字符串

    我已经阅读了多个有关正则表达式的教程 但它只是不会留在我的脑海中 我永远无法让我的模式发挥作用 希望有人能帮忙 我有一个 php 变量 content 我需要在其中找到如下所示的特定模式 图库 名称 文件夹 我想搜索 starting wi
  • 在php中将数组写入文件并获取数据

    我有一个数组 使用后如下所示print r Array 0 gt Array 0 gt piklu name gt piklu 1 gt Array 0 gt arindam name gt arindam 2 gt Array 0 gt
  • 在 php 中回显 JSON 数据

    我正在尝试回显一些 JSON 数据 问题是数据包含变量 但我的代码没有将变量放入字符串中 这是我的代码 status row Status priority row Priority echo status status priority
  • html 下钻下拉所选值未插入 MYSQL

    我有两个下拉列表 首先从数据库下拉填充 根据第一个下拉列表的选定值从数据库填充第二个下拉列表 document ready function c change function var c1 c selected text if c1 aj
  • 如何使用 Angular4 进行 Codeigniter 视图?

    首先 我的 PHP Codeigniter 项目当前在服务器上运行 然后我在服务器上安装了最新的 Angular4 CLI Typescript 但我不知道如何与Codeigniter项目集成 如何像 AngularJS 一样在 Codei
  • 对自定义 symfony 约束进行单元测试

    这应该非常简单 但今天下午它让我发疯 对自定义 symfony 验证器进行单元测试的正确方法是什么 我能找到的所有文章都与我的做法完全相同 class Foo extends Constraint public string message
  • 将数组文字传递给 PostgreSQL 函数

    我有一个包含 select 语句的 Postgres 函数 我需要使用包含字符串值数组的传入变量添加条件 CREATE OR REPLACE FUNCTION get questions vcode text RETURN return v
  • 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
  • 如何记录 Doxygen 中不存在的变量?

    例如 我在配置文件中定义了 theme 全局变量 Doxygen 不处理该变量 但我想记录下来 我尝试这样做 var theme brief Active theme 但没有成功 您可以创建一个 doxygen 特定文件来记录变量 例如 配
  • MySQL:如何获取上次更新的更改

    我正在使用 MySQL 和 PHP 开发数据库应用程序 此时我正在尝试获取上次更新引起的更改 我解决问题的第一个方法是 使用 SELECT 获取 旧 状态 使用 UPDATE 进行更改 使用 SELECT 获取 新 状态 将数组与 php
  • Ubuntu 12.04 上的 PHP 从 5.3 升级到 php 5.6

    我正在按照本教程将 php 从版本 5 3 升级到 5 6 http phpave com upgrade php 53 to php 56 on ubuntu 1204 lts http phpave com upgrade php 53
  • Laravel 5.2 如何更新迁移而不丢失数据

    我使用的是 laravel 5 2 我通常会根据项目要求更新数据库 所以我希望在不丢失数据库记录的情况下执行此操作 我的意思不是如何为我的数据库播种 我的意思是当我的数据库处于活动状态并且我想更新它时抛出 laravel 迁移 我正要扔La
  • 为什么 symfony DOMCrawler 对象无法在依赖的 phpunit 测试之间正确传递?

    我有一个适用于我的 symfony 应用程序的 phpunit 测试套件 在该测试文件中 我在不同的测试之间有一些依赖关系 并在依赖关系之间传递一个 DOMCrawler 对象 这样我就不必每次都导航到它 但是 在采用我所做的方法时 您似乎
  • 解析 PHP 多维数组

    这里 下面给出 是我正在做的一些非常简单的 php 解析多维数组的事情 我只是搜索 突出显示 键 然后将一些键值对存储在另一个数组中 有没有更好的方法来实现这一点 我的意思是关于性能 而不是有 n 个 foreach 循环来达到你想要的效果
  • PHP:检查任何基于拉丁语的语言中的字母字符?

    使用 PHP 我想检查一个字符串仅包含字母字符 我不想允许任何数字或特殊字符 例如 ctype alpha 对于这个目的来说似乎很棒 问题是我想允许重音字母 例如法语等 例如 我想允许 L rien 我知道ctype alpha 可以与se
  • 需要初学者 PHP 帮助

    我学习 PHP 一段时间了 我想要一个澄清 我见过preg match使用不同的分隔符号调用函数 例如 preg match and preg match 今天我还看到了 正在使用 我的问题分为两部分 所有字符都可以使用什么 有一个标准吗
  • 严格标准:资源 ID#73 用作偏移量,转换为整数

    我使用这个 PHP 函数获取 MySql 结果 function fetcharray query id if query id query id this gt query res if query id this gt q array
  • 通过API更新Twitter背景

    我在通过 Twitter 的 API 更新背景时遇到了一些问题 target url http www google com logos 11th birthday gif ch curl init curl setopt ch CURLO
  • 在 while 循环内查询可以吗?

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

随机推荐

  • 有关 CUDA 中统一虚拟寻址 (UVA) 的信息/示例

    我试图理解 CUDA 中统一虚拟寻址 UVA 的概念 我有两个问题 是否有任何示例 伪 代码可以演示这个概念 我在 CUDA C 编程指南中读到 UVA 只能在 64 位操作系统上使用 为什么会这样呢 A 统一虚拟地址空间 http doc
  • 如何使用 Hibernate Context 会话创建通用 DAO 类

    我正在尝试使用 Hibernates Context Sessions 实现通用 DAO 以下是我的镜头 import java io Serializable public interface GenericDao
  • 在批处理文件中登录并注册系统

    所以 我非常努力地尝试在批处理文件中制作登录和注册系统 我注册成功 只是将用户名和密码回显到 dll 文件或 txt 文件 但我不知道如何登录 我尝试了很多代码 但我不明白在互联网上找到的登录 注册代码 例如 我尝试过的 echo off
  • 如何使Java应用程序独立?

    我必须将 Java 应用程序刻录到 CD 上 此应用程序必须在之前未进行任何安装的情况下在每台 Windows PC 上运行 也不应安装 JRE 我想您也可以将 JRE 从程序文件夹复制到 CD 上 然后 添加批处理脚本以使用 本地 JRE
  • 词法或预处理器问题:找不到“MyViewController.h”文件

    当我尝试更改视图控制器名称时 h and m 我收到此错误 Lexical or PreProcessor Issue MyViewController h file not found 仅供参考 尽管存在词法错误 但应用程序仍可以正确运行
  • Spring 3.1实例化bean时出错

    我有以下课程 public abstract class AbstractBusinessModule public class MS3BusinessModule extends AbstractBusinessModule public
  • 在 Woocommerce 中添加运送区域的州而不是邮政编码

    我有一个 woocommerce 网站 默认情况下 在 woocommerce 中 我可以通过邮政编码限制运输区域 但是 如何在送货区域中添加我所在国家 地区的州 以便客户可以通过结账页面中的 下拉菜单 选择他们居住的州 而不是输入邮政编码
  • Heroku 给出 500 错误,信息很少 + 内部服务器错误

    Heroku 在页面上显示此消息 internal server error 此错误显示在控制台中 GET 500内部服务器错误 检查 Heroku 应用程序的日志以查看更多详细信息 您可以使用流式传输日志Heroku CLI https
  • 远程 logcat - Android Studio

    是否可以看到远程设备上的应用程序的logcat 简而言之 是否可以远程logcat 我向客户端发送了一个应用程序 这在您的设备中给出了错误 我使用同一版本的模拟器进行了测试 但仅发生了该错误 是否可以查看远程应用程序的 logcat 设备
  • Brushes.White 减慢了图形演示速度

    下面是 Conway 的生命游戏在 WPF 中的 非常幼稚的 实现 这只是一个演示 xaml
  • 这种方法名称/局部变量混合会发生什么?

    我在一些代码中发现了一个执行以下操作的方法 def method1 method1 1 2 2 3 4 5 5 return method1 uniq end ruby 如何处理这个问题 我知道这是错误的代码 但是 ruby 如何知道如何处
  • 从文件加载公钥数据

    在我的应用程序中 我生成一个公钥 私钥对并将它们存储在磁盘上以供以后使用 加载并重新初始化私钥工作正常 但对于私钥 我得到一个未知的 KeySpec 类型 java security spec PKCS8EncodedKeySpec 我不知
  • Jquery / Javascript - 添加迄今为止的年份变量

    我有一个小麻烦 如果能得到一些帮助就太好了 我正在创建一个小表单 我想将当前日期格式化 dd mm yyyy 并从下拉框中添加年份变量以创建最终到期日期 唯一的麻烦是我不知道如何将开始日期解析为日期变量以完成计算 任何想法或帮助将不胜感激
  • 在 Delphi 中读取/解析非类型二进制文件的最佳方法

    我想知道解析非类型二进制文件的最佳方法是什么 例如 EBML 文件 http ebml sourceforge net EBML 基本上是一个二进制 xml 文件 它基本上可以存储任何内容 但目前它的主要用途是 MKV 视频文件 matro
  • 从数据库sqlite获取信息

    如何从数据库中获取信息 我想执行这一行 String nom db execSQL select name from person where id id 任何人都可以纠正我这一行以从表中获取人名吗 如果您的 id 是整数数据类型 请尝试此
  • 检测设备是否支持通话?

    下面的代码可以可靠地用来确定设备是否支持通话吗 我担心的是 如果苹果将 iphone 字符串更改为其他内容 假设他们决定拥有 iphone 3g iphone 4 等 UIDevice currentDevice model isEqual
  • Xamarin.forms 在 web 视图中显示 PDF 不起作用

    我从我的服务器下载 pdf 流 在我的应用程序中 我将 bytearray 作为 pdf 保存到本地文件夹中 但是当我在网络视图中打开它时 它只显示一个白色页面 我按照这个例子 https developer xamarin com rec
  • java.lang.illegalstateException数据库未打开android

    当我尝试插入数据库日志时 猫显示如下错误java lang illegalstateexception database not open android 但我已经使用打开数据库 db SQLiteDatabase openDatabase
  • Rails Admin 与 Active Admin:Rails Admin 生成工具[重复]

    这个问题在这里已经有答案了 可能的重复 Rails Admin 与 ActiveAdmin https stackoverflow com questions 6542075 rails admin vs activeadmin 我知道已经
  • Laravel:路由中间件和策略之间的区别

    使用 Laravel 开发应用程序我意识到可以做什么Policy完全可以用Middleware 假设我想阻止用户更新路线 如果他 她不是信息的所有者 我可以轻松地从路线中进行检查 并且可以从策略中执行相同的操作 所以我的问题是为什么我应该使