2017-09-15 157 views
0

我正在用Laravel構建一些API端點,並且我正在使用JWTAuth作爲授權請求的令牌提供程序。如何通過JWTAuth和Laravel阻止通過id訪問Model?

我已經得到的設置來保護一組正常工作使用API​​路線:

Route::group(['prefix' => '/v1', 'middleware' => 'jwt.auth'], function() { 
    Route::resource('messages', 'MessagesController'); 
}); 

Message模型屬於User

我試圖執行使用某些請求關係,同時保留提供不屬於用戶的數據的請求:

  1. 獲取登錄用戶消息列表
  2. 獲取用戶

登錄的個人信息主要的問題我已經是如何阻止用戶訪問Message不屬於他們。我有這個在我的控制器:

public function show($message_id) 
{ 
    $message = Message::findOrFail($message_id); 
    return $message; 
} 

這顯然將返回Message不管它是否屬於該用戶。 有關如何改善限制訪問其他用戶消息的建議?


的所有郵件的列表,我能夠做到在控制器中的以下內容:

public function index() 
{ 
    $user_id = Auth::User()->id; 
    $messages = Message::where('user_id', $user_id)->paginate(10); 
    return $messages; 
} 

這工作,但我不知道這是做的最好的方法。也許是的,但一些反饋將不勝感激。我很困惑中間件是否應該處理用戶有權訪問的內容,或者它是否應該成爲雄辯查詢的一部分?

+0

您可能需要一個[global scope](https://laravel.com/docs/5.4/eloquent#global-scopes)。如果需要,您可以將範圍應用於給定模型上的所有查詢 – Ohgodwhy

+0

找到任何解決方案了嗎? – Gayan

回答

0

你的問題是,

如何防止用戶訪問不屬於 給他們留言。

那落在下Authorization

您可以使用Gates對用戶進行授權,我認爲這是這裏的最佳方法。所有你需要一個Policy對象的拳頭。

<?php 

namespace App\Policies; 

use App\User; 
use App\Message; 

class MessagePolicy 
{ 
    /** 
    * Determine if the given Message can be viewed by the user. 
    * 
    * @param \App\User $user 
    * @param \App\Message $Message 
    * @return bool 
    */ 
    public function view(User $user, Message $Message) 
    { 
     return $user->id === $Message->user_id; 
     // Here this User's id should match with the user_id of the Massage 
    } 
} 

你甚至可以生成這樣的樣板,

php artisan make:policy MessagePolicy --model=Message 

然後你就可以在你的AuthServiceProvider這個樣子註冊,

<?php 

namespace App\Providers; 

use App\Message; 
use App\Policies\MessagePolicy; 
use Illuminate\Support\Facades\Gate; 
use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider; 

class AuthServiceProvider extends ServiceProvider 
{ 
    /** 
    * The policy mappings for the application. 
    * 
    * @var array 
    */ 
    protected $policies = [ 
     Message::class => MessagePolicy::class, 
    ]; 

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

     Gate::define('view-message', '[email protected]'); 
    } 
} 

而在你的控制,你可以使用它像這個,

public function show($message_id) 
{ 
    if (Gate::allows('view-message', Message::findOrFail($message_id)) { 
     return $message; 
    } 
} 

注意:請使用此代碼段作爲參考或起點,因爲我沒有正確測試它。但基本概念是正確的。用它作爲僞代碼。如果發現錯誤,請在此處更新:)