Laravel或Lumen ReadOnly模型?

问题描述

我们系统中有一些表是使用第三方API馈送的,我们的系统应该仅从它们中读取数据,而从不插入或更新任何内容

Laravel / Lumen中是否有任何功能,我们可以在模型中提到禁止/禁用插入/更新查询,就像我们有选项public $ timestamps = false;一样。禁用时间戳?

表位于同一数据库中,否则我们将基于MysqL用户对其进行限制。

解决方法

最安全的方法是使用readonly only on the tables创建第二个MySQL用户。
然后,在Laravel中,您可以与config/database.php中受限制的MySQL用户创建特定的连接。
然后在模型中,通过protected $connection属性指定所需的连接。

,

作为一种安全方式:

因为您可以限制对数据库的某些操作。

只读模型

但是您也可以禁用雄辩的模型。

laravel模型是从Illuminate\Database\Eloquent\Model扩展的

您可以从Model扩展ReadOnlyModel。

然后从该类扩展所需的任何模型。

此类应覆盖任何在db中写入数据的方法

所以我遵循源代码:

Update和updateOrFail,push等正在使用过的Model->save()方法。

创建,creteOrFail,删除等是在Builder中使用Model->save()方法的位置

save()方法在某些事件触发下使用performUpdate或performInsert ...

因此,阻止模型接触数据库的最简单的操作是实现:

   <?php

namespace App\ReadOnlyDB;

use Illuminate\Database\Eloquent\Model;
/**
* Just Extend all of Your Models from This Class
*
*/
class ReadOnlyModel extends Model
{
        public function save(){
            // do nothing
        }
}
Relation和BelongsTo类中的

save()方法也将使用Model-> save()方法。

,

我认为管理此问题的唯一正确方法是在MySQL用户端具有访问限制。原因如下:

如果要从Eloquent类中存入(禁用)保存/更新方法,则仅禁用自己代码的保存/更新。这类似于将钥匙挂在门把手上时锁定门。没有什么可以阻止您进行保存/更新的,因为您不必使用Eloquent类。

此外,第三方软件包可能会保留不依赖您的代码的数据。基本上,您必须检查其每一行代码,以确保您的数据库未更新。

因此,请在数据库用户级别应用这些限制。然后,由于某种原因您(或其他任何人)的代码调用$myModel->save()时,您应该面临ORM的异常,表明您没有权限。然后,相应地进行处理(例如返回特定的HTTP状态代码)。

,
  1. 创建另一个具有只读权限的mySql用户。

  2. .env文件中添加以下内容

    DB_CONNECTION_SECOND = mysql

    DB_HOST_SECOND = 127.0.0.1

    DB_PORT_SECOND = 3306

    DB_DATABASE_SECOND =数据库

    DB_USERNAME_SECOND =用户_2

    DB_PASSWORD_SECOND =秘密

  3. 在config / database.php中添加以下内容

    'mysql2' => [
    'driver'    => env('DB_CONNECTION_SECOND'),'host'      => env('DB_HOST_SECOND'),'port'      => env('DB_PORT_SECOND'),'database'  => env('DB_DATABASE_SECOND'),'username'  => env('DB_USERNAME_SECOND'),'password'  => env('DB_PASSWORD_SECOND'),],
  4. 在您的控制器中指定连接名称。.

    DB :: connection('mysql2')-> select(...);

,

有几种方法。
选项1:最快的可能是这种“只读”模型特征。 https://github.com/michaelachrisco/ReadOnlyTraitLaravel

它保护您免受...

  • 创建
  • forceCreate
  • 保存
  • 更新
  • firstOrCreate
  • firstOrNew
  • 删除
  • 破坏
  • 还原
  • forceDelete
  • performDeleteOnModel
  • finishSave
  • performUpdate
  • 触摸
  • 插入
  • 截断

选项2:一种完全不同的方式是在数据库配置和模型连接上进行的。因此,这包括两个部分。

project / config / database.php 复制并调整数据库连接。

'mysql' => [
            'driver'         => 'mysql','host'           => env('DB_HOST','127.0.0.1'),...
'readonly' => [
            'driver'         => 'mysql','read' => [
                'host' => env('DB_HOST','127.0.0.1')
            ],'write' => [
                'host' => 'this.will.404'
            ],...

project / app / MyReadOnlyModel.php

class MyReadOnlyModel extends Model
{
    protected $connection  = 'readonly';
...
}

如果您陷入有时希望模型可写的陷阱……我建议在同一张桌子上放置2个模型。

app / Normal / MyModel.php

app / ReadOnly / MyModel.php