Laravel 5.6使用策略授权操作

时间:2018-12-06 15:34:56

标签: php laravel

我正在尝试实施一项策略来阻止资源的编辑功能。

我的路线:

int main()
{
    using namespace detail;

    ReadStore store;
    PrintConvType func = ConvWrapper<double, &Foo>;

    Value result = func(3.14159, store);
     std::cout << std::get<std::string>(result) << '\n';
}

我的ImageRequestPolicy

Route::resource('imagerequests', 'ImageRequestController');

但是我仍然可以访问“ imagerequests / {id} / edit”路线

编辑

class ImageRequestPolicy
{
    use HandlesAuthorization;

    const STATUS_EXECUTING = "executing";

    public function edit(ImageRequest $imageRequest)
    {
        return $imageRequest->status !== self::STATUS_EXECUTING;
    }
}

ImageRequest模型

/**
 * The policy mappings for the application.
 *
 * @var array
 */
protected $policies = [
    ImageRequest::class => ImageRequestPolicy::class,
];

/**
 * Register any authentication / authorization services.
 *
 * @return void
 */
public function boot()
{
    $this->registerPolicies();

    //
}

编辑ImageRequestController方法

class ImageRequest extends Model

3 个答案:

答案 0 :(得分:4)

您的编辑方法有误,它的第一个参数必须是用户:

public function edit(User $user, ImageRequest $imageRequest)
{
    return $imageRequest->status !== self::STATUS_EXECUTING;
}

添加到ImageRequestController中,编辑方法:

public function edit(ImageRequest $imageRequest) {

$this->authorize('edit',$imageRequest);

...

}

$ user参数由laravel自动添加。

此外,您还需要在AuthServiceProvider中注册策略。

protected $policies = [
    ImageRequest::class => ImageRequestPolicy::class,
];

并且ImageRequest必须扩展Model类。是模型还是照明\ http \ request?

您的控制器有问题。您的路线是:

/ imagerequests / 26 / edit

在您的控制器中,您正在注入一个新的空白ImageRequest,这也许就是它通过授权测试的原因。试试这个:

public function edit($id, ImageRequest $imageRequest)
{
    $imageRequest = ImageRequest::findOrFail($id);

    $this->authorize('edit', $imageRequest);

    $requestTypes = RequestType::all();
    $attachments = $this->imageRequestRepository->getAttachmentsListOfImageRequestById($id);

    return view('imagerequest.edit', compact('imageRequest', 'requestTypes', 'attachments'));
}

答案 1 :(得分:0)

使用中间件保护路由。

use App\Post;
Route::put('/post/{post}', function (Post $post) {
    // The current user may update the post...
})->middleware('can:update,post');

希望这会有所帮助。

答案 2 :(得分:0)

关卡和政策之间的差异从文档中很难理解。门用于授权控制器方法,而资源则负责授权有关模型的操作,即实际的数据库记录。

因此,在您的情况下,您应该使用门而非策略。您仍然可以使用现有的策略类,但是您必须以其他方式进行注册。而不是使用

/**
 * The policy mappings for the application.
 *
 * @var array
 */
protected $policies = [
    ImageRequest::class => ImageRequestPolicy::class,
];

/**
 * Register any authentication / authorization services.
 *
 * @return void
 */
public function boot()
{
    $this->registerPolicies();
}

您应该使用

/**
 * Register any authentication / authorization services.
 *
 * @return void
 */
public function boot()
{
    $this->registerPolicies();

    Gate::resource('imageRequests', App\Policies\ImageRequestPolicy::class);
}

要进一步参考,请查看documentation on gates