簡體   English   中英

Laravel 阻止用戶編輯/查看其他用戶的資源

[英]Laravel prevent users from editing/viewing other users' resources

在我的 Laravel 應用程序中,我有多個用戶帳戶,這些用戶帳戶擁有分配給他們的資源。 例如,說“付款”。 要編輯或查看付款,用戶將訪問/payment/edit/{payment}路線(其中payment是付款 ID)。

雖然我有一個身份驗證過濾器來阻止未登錄的用戶訪問此頁面,但沒有什么可以阻止的,例如,用戶 1 編輯用戶 2 的付款。

是否有我可以使用的過濾器來檢查付款(或任何其他資源)屬於哪個用戶以防止此類問題?

[我正在使用 Laravel 的模型綁定,它會自動獲取路由指定的模型,而不是我使用 eloquent 在控制器中獲取它。]

默認情況下不存在這樣的過濾器,但是您可以輕松創建一個(取決於您的數據庫的設置方式)。 在 app/filters.php 中,您可以執行以下操作:

Route::filter('restrictPermission', function($route)
{
    $payment_id = $route->parameter('payment');

    if (!Auth::user()->payments()->find($payment_id)) return Redirect::to('/');
});

這會將當前登錄用戶的 payment_id(在您的數據庫中)與傳遞到路由中的 {payment} 參數進行比較。 顯然,根據您的數據庫的設置方式(例如,如果 payment_id 在單獨的表中),您需要更改條件。

然后,將過濾器應用於您的路線:

Route::get('/payment/edit/{payment}', array('before' => 'restrictPermission'));

一種方法是在每個相關查詢中放置一個 where 語句。 雖然不是很漂亮,但它有效。

$payment = Payment::where('user_id', '=', Auth::user()->id)->find($id);

也可以使用如 seeARMS 建議的 url 過濾器,但我認為它不是很優雅。 嵌套此類邏輯的最合乎邏輯的位置是模型本身。 一種可能性是使用模型事件,但這只能讓您選擇攔截更新、插入或刪除語句,而不是選擇。 這在未來可能會改變。 也許您可以使用boot()事件,但我不確定這是否可行。

最后但並非最不重要的是,您可以使用查詢范圍

class Payment extends Eloquent {

    public function scopeAuthuser($query)
    {
        return $query->where('user_id', '=', Auth::user()->id);
    }
}

並在查詢中附加范圍

Payment::authuser()->find($id);

您可以在基本模型上執行此操作並從中擴展,因此您可以在所有相關模型中使用該方法。

考慮使用 Laravel 策略: https ://laravel.com/docs/6.x/authorization#policy-methods

<?php

namespace App\Policies;

use App\Post;
use App\User;

class PostPolicy
{
    /**
     * Determine if the given post can be updated by the user.
     *
     * @param  \App\User  $user
     * @param  \App\Post  $post
     * @return bool
     */
    public function update(User $user, Post $post)
    {
        return $user->id === $post->user_id;
    }
}

通過策略,您可以控制登錄用戶是否可以編輯給定記錄。

干杯!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM