因此,我有一个拉拉项目与多个角色的(管理,合作伙伴,经销商)作为经销商和合作伙伴,我可以下载文件分配给我使用一个枢轴表。
作为合作伙伴,我可以看到分配给我的角色的一个文件可以下载。但是在我的数据库中,一个经销商可以下载多个文件。但是,如果我编辑链接:http://localhost:8000/partner/download/{file id,我也可以作为合作伙伴下载所有文件。
我想保护这个安全,所以我只能下载分配给这个特定角色的文件。
表文件:
表用户:
表的作用;
表格下载(文件和用户的枢轴):
下载控制器:
public function download(Request $request, int $fileId)
{
$id = Auth::user();
$fullfile = File::find($fileId);
$downloadfile = File::find($fullfile, ['file'])->pluck('file')->last();
return response()->download($downloadfile);
$fullfile->userfile()->attach($id);
return back();
}web.php
Route::group(['middleware' => 'role:partner', 'prefix' => 'partner', 'as' => 'partner.'], function(){
Route::resource('/dashboard', App\Http\Controllers\partner\PartnerController::class);
Route::resource('/profile', App\Http\Controllers\partner\ProfileController::class);
Route::resource('/file', App\Http\Controllers\partner\FileController::class);
Route::get('/download/{fileId}',[FileController::class, 'download'])->name('file.download');
});index.blade.php
<tbody>
@foreach($files as $file)
<tr>
<td>{{$file->title}} </td>
<td>
<a class="btn btn-big btn-succes" style="background: orange;" href="{{ route('partner.file.show', $file->id) }}">View</a>
</td>
<td>
<a class="btn btn-big btn-succes" style="background: green;" href="{{ route('partner.file.download', $file->id) }}" >Download</a>
</td>
<td>{{@$file->language->name}} </td>
@foreach($file->tag as $tags)
<td style="background:{{$tags['color']}} ;">{{@$tags->name}} </td>
@endforeach
</tr>
@endforeach
</tbody>
```发布于 2022-10-21 10:22:08
我想你有几张有关系的桌子:
用户、角色、文件
用户:角色- N:1角色: Files M:N (也就是说,如果您的文件是多态的,或者您希望某个文件被多个角色下载,如果两者都没有,那么1:N就足够了)
如果没有,请提供您为他们提供的架构。
但是,如果您有这样的模式,那么应该比较容易,您只需要为路由http://localhost:8000/partner/download/{file id}使用中间件,它将按角色过滤掉用户,如果无法访问就返回404。
如果您提供的路由是位于/public目录中的文件的路径(这意味着您将文件存储在/public/partner/download中),我建议为数据库中的每个文件创建一个散列(类似于Str::http://localhost:8000/partner/download/{hash} (16))并使用路由http://localhost:8000/partner/download/{hash}
发布于 2022-10-21 11:22:03
使用策略怎么样?
class FilePolicy
{
use HandlesAuthorization;
/**
* Determine whether the user can view any models.
*
* @param \App\Models\User $user
* @return \Illuminate\Auth\Access\Response|bool
*/
public function view(User $user, File $file)
{
return $user->role_id == 'Partner';
}
}然后在控制器中添加
public function download(Request $request, int $fileId)
{
$fullfile = File::find($fileId);
$this->authorize('view',$fullFile);
$id = Auth::user();
$downloadfile = File::find($fullfile, ['file'])->pluck('file')->last();
return response()->download($downloadfile);
$fullfile->userfile()->attach($id);
return back();
}https://stackoverflow.com/questions/74152035
复制相似问题