laravel 中每个用户的个人 s3 存储桶
Individual s3 bucket for each user in laravel
我有一个 Laravel 应用程序,我想为我的注册用户提供一个安全的存储系统。
- 我应该如何规划它,我应该为每个用户创建一个新的存储桶,还是为一个存储桶中的每个用户创建文件夹
- 如何限制用户不能访问彼此的文件夹?
谢谢
一定要一桶一桶,然后用文件夹分开。在我看来,Buckets 更多的是将应用程序分开以便相互交互。
我会创建一个前缀并始终使用它,如果代码使用相同的函数,您可以确保它们不能与其他文件交互。
public function saveFile($user, $fileName, $file) {
Storage::put($user->getS3Prefix() . $fileName, $file )
}
public function getFile() {
return Storage::get($user->getS3Prefix() . $fileName)
}
现在在你的用户模型上,有一个前缀生成,理论上可以是用户 ID。
class User {
public function getS3Prefix() {
return "/{$this->id}/";
}
}
这是一个简单直接的解决方案,我认为您不需要考虑太多。
有一个聪明的解决方案,S3配置有一个根选项,指示哪个文件夹应该是根。
所以在服务提供商中,你实际上可以做这样的事情。
if ($user = Auth::user()) {
config(['storage.disks.s3.root' => "/{$user->id}/"]);
}
我认为这是一个有点不稳定的解决方案,并且当上下文中没有用户(例如在命令或作业中)时很难控制。但认为它作为另一种替代解决方案是合适的。
我有一个 Laravel 应用程序,我想为我的注册用户提供一个安全的存储系统。
- 我应该如何规划它,我应该为每个用户创建一个新的存储桶,还是为一个存储桶中的每个用户创建文件夹
- 如何限制用户不能访问彼此的文件夹?
谢谢
一定要一桶一桶,然后用文件夹分开。在我看来,Buckets 更多的是将应用程序分开以便相互交互。
我会创建一个前缀并始终使用它,如果代码使用相同的函数,您可以确保它们不能与其他文件交互。
public function saveFile($user, $fileName, $file) {
Storage::put($user->getS3Prefix() . $fileName, $file )
}
public function getFile() {
return Storage::get($user->getS3Prefix() . $fileName)
}
现在在你的用户模型上,有一个前缀生成,理论上可以是用户 ID。
class User {
public function getS3Prefix() {
return "/{$this->id}/";
}
}
这是一个简单直接的解决方案,我认为您不需要考虑太多。
有一个聪明的解决方案,S3配置有一个根选项,指示哪个文件夹应该是根。
所以在服务提供商中,你实际上可以做这样的事情。
if ($user = Auth::user()) {
config(['storage.disks.s3.root' => "/{$user->id}/"]);
}
我认为这是一个有点不稳定的解决方案,并且当上下文中没有用户(例如在命令或作业中)时很难控制。但认为它作为另一种替代解决方案是合适的。