默认情况下,Laravel Vapor要求用户经过身份验证才能执行上传。我需要允许一个未经认证的上传。我该怎么做?谢谢
shyt4zoc1#
我认为如果你在你的UserPolicy中添加这样的内容,vapor应该可以工作
public function before($user) { if (Auth::guest()) { return true; } }
2sbarzqh2#
我们通过覆盖默认vapor/signed-storage-url路由的处理来处理这个问题。在routes/web.php中。
vapor/signed-storage-url
routes/web.php
Route::post('vapor/signed-storage-url', [Controllers\SignedStorageUrlController::class, 'store']);
在我们的SignedStorageUrlController中,我们使用store函数,去掉了这个检查:
SignedStorageUrlController
store
Gate::authorize('uploadFiles', [ $request->user(), $bucket = $request->input('bucket') ?: $_ENV['AWS_BUCKET'], ]);
导致:
<?php namespace App\Http\Controllers; use Illuminate\Support\Str; use Illuminate\Http\Request; use Laravel\Vapor\Http\Controllers\SignedStorageUrlController as VaporSignedStorageUrlController; class SignedStorageUrlController extends VaporSignedStorageUrlController { public function store(Request $request) { $this->ensureEnvironmentVariablesAreAvailable($request); $bucket = $request->input('bucket') ?: $_ENV['AWS_BUCKET']; $client = $this->storageClient(); $uuid = (string) Str::uuid(); $signedRequest = $client->createPresignedRequest( $this->createCommand($request, $client, $bucket, $key = ('tmp/'.$uuid)), '+5 minutes' ); $uri = $signedRequest->getUri(); return response()->json([ 'uuid' => $uuid, 'bucket' => $bucket, 'key' => $key, 'url' => 'https://'.$uri->getHost().$uri->getPath().'?'.$uri->getQuery(), 'headers' => $this->headers($request, $signedRequest), ], 201); } }
k4emjkb13#
也许比覆盖路由和控制器更干净的方法是允许访客通过授权门。根据文档,我们可以通过使用户参数可选或默认为null来允许客人通过大门。https://laravel.com/docs/10.x/authorization#guest-users由于默认控制器方法没有显式指定User模型,因此不会为访客调用UserPolicy。我们可以通过在AuthServiceProvider的 Boot 方法中定义一个uploadFiles门来克服这个问题:
Gate::define('uploadFiles', function (?User $user, $bucket) { // Your Auth Here });
3条答案
按热度按时间shyt4zoc1#
我认为如果你在你的UserPolicy中添加这样的内容,vapor应该可以工作
2sbarzqh2#
我们通过覆盖默认
vapor/signed-storage-url
路由的处理来处理这个问题。在
routes/web.php
中。在我们的
SignedStorageUrlController
中,我们使用store
函数,去掉了这个检查:导致:
k4emjkb13#
也许比覆盖路由和控制器更干净的方法是允许访客通过授权门。
根据文档,我们可以通过使用户参数可选或默认为null来允许客人通过大门。https://laravel.com/docs/10.x/authorization#guest-users
由于默认控制器方法没有显式指定User模型,因此不会为访客调用UserPolicy。我们可以通过在AuthServiceProvider的 Boot 方法中定义一个uploadFiles门来克服这个问题: