问题描述
我们系统中有一些表是使用第三方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状态代码)。
-
创建另一个具有只读权限的mySql用户。
-
.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 =秘密
-
在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
它保护您免受...
- 创建
- 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