Laravel /流明只读模型?
Laravel / Lumen ReadOnly Model?
我们的系统中有一些表是使用第 3 方 API 提供的,我们的系统应该只从它们读取数据,而不会插入或更新任何内容。
Laravel/Lumen 中是否有任何功能,我们可以在模型中提到 disallow/disable insert/update 查询,就像我们有选项 public $timestamps = false;禁用时间戳?
这些表在同一个数据库中,否则我们会根据 MySQL 个用户进行限制。
最安全的方法是使用 readonly only on the tables.
创建第二个 MySQL 用户
然后在 Laravel 中,您可以在 config/database.php
.
中与受限 MySQL 用户创建特定连接
然后在模型中通过 protected $connection
属性.
指定想要的连接
是的,
作为一种安全的方式:
因为您可以限制对数据库的某些操作。
只读模型
但您也可以禁用 eloquent 模型。
laravel 模型扩展自 Illuminate\Database\Eloquent\Model
您可以从模型扩展 ReadOnlyModel。
然后从 class 中扩展您想要的任何模型。
这个class应该覆盖任何在数据库中写入数据的方法,
所以我按照源代码:
Update 和 updateOrFail、push 等使用的是 Model->save()
方法。
虽然 create、creteOrFail 、 delete 等位于使用 Model->save()
方法
的 Builder 中
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 classes 中的 save() 方法也会使用 Model->save() 方法。
我认为管理此问题的唯一正确方法是在 MySQL 用户端设置访问限制。原因如下:
如果您要从 Eloquent class 中存根(禁用)save/update 方法,您只会为您自己的代码禁用 save/update。这类似于将钥匙挂在门把手上时锁门。没有什么能阻止你做 saves/updates 因为你不一定要使用 Eloquent class.
此外,第 3 方包可能会保留不依赖于您的代码的数据。您基本上必须检查他们的每一行代码,以确保您的数据库没有更新。
因此,在数据库用户级别应用这些限制。然后,当出于某种原因您的(或其他任何人)代码调用 $myModel->save()
时,您应该面临来自 ORM 的异常,表明您没有权限。然后,相应地处理它(比如返回特定的 HTTP 状态代码)。
创建一个额外的 mySql 具有只读权限的用户。
在 .env 文件中添加以下内容
DB_CONNECTION_SECOND=mysql
DB_HOST_SECOND=127.0.0.1
DB_PORT_SECOND=3306
DB_DATABASE_SECOND=数据库
DB_USERNAME_SECOND=user_2
DB_PASSWORD_SECOND=秘密
在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'),],
在您的控制器中指定连接名称..
DB::connection('mysql2')->select(...);
有几种方法。
选项 1:可能最快的是这种“只读”模型特征。 https://github.com/michaelachrisco/ReadOnlyTraitLaravel
它保护你免受...
- 创建
- 强制创建
- 保存
- 更新
- firstOrCreate
- firstOrNew
- 删除
- 摧毁
- 恢复
- 强制删除
- performDeleteOnModel
- 推送
- 完成保存
- 执行更新
- 触摸
- 插入
- 截断
选项 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';
...
}
如果您有时陷入希望模型成为 writable 的陷阱...我建议在同一个 table.
上使用 2 个模型
app/Normal/MyModel.php
app/ReadOnly/MyModel.php
也许在您的模型中使用空的可填充属性可以解决您的问题!
protected $fillable = [];
我们的系统中有一些表是使用第 3 方 API 提供的,我们的系统应该只从它们读取数据,而不会插入或更新任何内容。
Laravel/Lumen 中是否有任何功能,我们可以在模型中提到 disallow/disable insert/update 查询,就像我们有选项 public $timestamps = false;禁用时间戳?
这些表在同一个数据库中,否则我们会根据 MySQL 个用户进行限制。
最安全的方法是使用 readonly only on the tables.
创建第二个 MySQL 用户
然后在 Laravel 中,您可以在 config/database.php
.
中与受限 MySQL 用户创建特定连接
然后在模型中通过 protected $connection
属性.
是的,
作为一种安全的方式:
因为您可以限制对数据库的某些操作。
只读模型
但您也可以禁用 eloquent 模型。
laravel 模型扩展自 Illuminate\Database\Eloquent\Model
您可以从模型扩展 ReadOnlyModel。
然后从 class 中扩展您想要的任何模型。
这个class应该覆盖任何在数据库中写入数据的方法,
所以我按照源代码:
Update 和 updateOrFail、push 等使用的是 Model->save()
方法。
虽然 create、creteOrFail 、 delete 等位于使用 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 classes 中的 save() 方法也会使用 Model->save() 方法。
我认为管理此问题的唯一正确方法是在 MySQL 用户端设置访问限制。原因如下:
如果您要从 Eloquent class 中存根(禁用)save/update 方法,您只会为您自己的代码禁用 save/update。这类似于将钥匙挂在门把手上时锁门。没有什么能阻止你做 saves/updates 因为你不一定要使用 Eloquent class.
此外,第 3 方包可能会保留不依赖于您的代码的数据。您基本上必须检查他们的每一行代码,以确保您的数据库没有更新。
因此,在数据库用户级别应用这些限制。然后,当出于某种原因您的(或其他任何人)代码调用 $myModel->save()
时,您应该面临来自 ORM 的异常,表明您没有权限。然后,相应地处理它(比如返回特定的 HTTP 状态代码)。
创建一个额外的 mySql 具有只读权限的用户。
在 .env 文件中添加以下内容
DB_CONNECTION_SECOND=mysql
DB_HOST_SECOND=127.0.0.1
DB_PORT_SECOND=3306
DB_DATABASE_SECOND=数据库
DB_USERNAME_SECOND=user_2
DB_PASSWORD_SECOND=秘密
在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'),],
在您的控制器中指定连接名称..
DB::connection('mysql2')->select(...);
有几种方法。
选项 1:可能最快的是这种“只读”模型特征。 https://github.com/michaelachrisco/ReadOnlyTraitLaravel
它保护你免受...
- 创建
- 强制创建
- 保存
- 更新
- firstOrCreate
- firstOrNew
- 删除
- 摧毁
- 恢复
- 强制删除
- performDeleteOnModel
- 推送
- 完成保存
- 执行更新
- 触摸
- 插入
- 截断
选项 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';
...
}
如果您有时陷入希望模型成为 writable 的陷阱...我建议在同一个 table.
上使用 2 个模型app/Normal/MyModel.php
app/ReadOnly/MyModel.php
也许在您的模型中使用空的可填充属性可以解决您的问题!
protected $fillable = [];