[英]Laravel 4 Prevent Authenticated users from viewing other user profiles
[英]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.