2017-09-15 63 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; 
    } 
} 

注意:请使用此代码段作为参考或起点,因为我没有正确测试它。但基本概念是正确的。用它作为伪代码。如果发现错误,请在此处更新:)