【发布时间】:2016-06-13 19:36:30
【问题描述】:
我有一个 Laravel 应用程序。在路线文件中,我有
Route::group(['prefix' => 'user'], function () {
Route::group(['middleware' => ['auth', 'roles'], 'roles' => ['buyer']], function() {
Route::get('dashboard/buyer', ['as' => 'buyer_dashboard', 'uses' => 'User\Buyer\DashboardController@index']);
});
Route::group(['middleware' => ['auth', 'roles'], 'roles' => ['seller']], function() {
Route::get('dashboard/seller', ['as' => 'seller_dashboard', 'uses' => 'User\Seller\DashboardController@index']);
});
});
我有一个中间件,它基本上检查路由中提供的 id 是否与当前登录的用户相同。如果不是这种情况,我会返回一个错误页面。这样做的原因是我想防止用户可以访问另一个用户的仪表板。我还想防止用户可以为其他人出价(通过更改 http 请求中的 id)
问题在于,在第一条路由中,id 指的是用户。在第二条路线中,id 指的是批次 id。
我是否有义务将第二条路线更改为:
Route::get('{id}/lot/{lot}/bid/create', ['as' => 'buyer_lot_bid_create', 'uses' => 'User\Buyer\BidsController@create']);
第一个 id 指的是用户,以便我可以检查用户的 id?
或者是否有另一种方法可以防止用户访问其他用户页面而无需在路由中明确传递用户/{id}?
【问题讨论】:
-
可以通过auth::user->id()查看登录用户的用户id;在你的代码中。不需要从http请求中获取。
-
好吧,我知道 auth::user->id() 是当前登录的用户。但它没有捕捉到登录用户可以访问其他用户的内容的情况。假设 id 为 1 的用户已登录并可以通过 /user/1/dashboard 访问他自己的仪表板,那么他仍然可以访问 /user/2/dashboard。因此,我也在检查路线 {id}。你明白我的意思了吗?
-
好的,所以在控制器函数中,您使用来自 url 的用户 ID,如果两者不相同,请尝试使用 auth::user->id() 检查它,然后使用重定向页面404 或 401 随意。
-
确实在中间件中这样做。因此,这意味着所有路由都应始终以我不喜欢的 user/id 开头。我正在寻找一种隐式传递用户 ID 的方法。
-
你不使用
Gate有什么原因吗?
标签: laravel