我有一个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}?
答案 0 :(得分:0)
在中间件中执行此操作听起来不错。您已经遇到过针对您的中间件规则的一个例外情况,并且您会认真地遇到更多问题。
有两种方法可以做到这一点:
使用laravel的内置授权工具:https://laravel.com/docs/5.1/authorization
如果检查是路由中提供的" id与当前登录用户相同"然后,根本不需要通过路径传递用户的ID。用户可以访问例如。 /dashboard/buyer
路线中没有参数。他们访问的是谁的仪表板?当然是登录用户之一。因此,用户甚至无法尝试访问其他用户的信息中心。同样招标。您可以设置bid
端点,以便不通过路由传递出价工具的ID - 它只是设置为控制器方法中登录用户的ID。再说一遍,甚至没有办法代表其他用户竞标。
答案 1 :(得分:0)
class AuthServiceProvider extends ServiceProvider
{
public function boot(GateContract $gate)
{
$this->registerPolicies($gate);
$gate->define('see-profile', function ($user, $profile) {
return $user->id === $profile->user_id;
});
}
控制器:
public function profile($id)
{
$post = Profile::findOrFail($id);
if (Gate::denies('see-profile', $profile)) {
abort(403);
}
}