Laravel Vapor-允许未经身份验证的用户执行上传

nnt7mjpx  于 2023-06-25  发布在  其他
关注(0)|答案(3)|浏览(77)

默认情况下,Laravel Vapor要求用户经过身份验证才能执行上传。我需要允许一个未经认证的上传。我该怎么做?
谢谢

shyt4zoc

shyt4zoc1#

我认为如果你在你的UserPolicy中添加这样的内容,vapor应该可以工作

public function before($user)
{
    if (Auth::guest()) {
        return true;
    }
}
2sbarzqh

2sbarzqh2#

我们通过覆盖默认vapor/signed-storage-url路由的处理来处理这个问题。
routes/web.php中。

Route::post('vapor/signed-storage-url', [Controllers\SignedStorageUrlController::class, '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);
    }
}
k4emjkb1

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
    });

相关问题