0

Ich baue einige API-Endpunkte mit Laravel, und ich verwende JWTAuth als Token-Anbieter für die Autorisierung von Anfragen.Wie verhindert man den Zugang zu Model by ID mit JWTAuth und Laravel?

Ich habe das Setup bekommen eine Gruppe von API Routen zu schützen, die korrekt mit funktioniert:

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

Das Message Modell gehört zu einer User

ich mit einigen Anfragen auszuführen bin versucht, dass Beziehung, während die Anforderung von der Bereitstellung von Daten, die nicht zu dem Benutzer gehören:

  1. Erhalten Sie eine Liste der Meldungen des angemeldeten Benutzers
  2. eine einzelne Nachricht des angemeldeten Benutzers Erhalten

Die wichtigste Frage ich habe, ist, wie der Benutzer zu verhindern, dass eine Message zugreifen, die ihnen nicht gehören. Ich habe dies in meinem Controller:

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

, die offensichtlich die Message zurückkehren werden, unabhängig davon, ob es gehört zu diesem Benutzer. Haben Sie Vorschläge, wie Sie den Zugriff auf die Nachrichten anderer Benutzer einschränken können?


Für die Auflistung aller Nachrichten, konnte ich die folgenden in der Steuerung tun:

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

Dies funktioniert, aber ich bin nicht sicher, ob dies der beste Weg ist, es zu tun . Vielleicht ist es, aber ein Feedback würde geschätzt werden. Ich bin verwirrt darüber, ob die Middleware mit dem umgehen soll, auf was der Benutzer Zugriff hat oder ob er Teil der eloquenten Abfrage sein sollte.

+0

Sie möchten wahrscheinlich einen [globalen Bereich] (https://laravel.com/docs/5.4/eloquent#global-scopes). Sie können den Bereich bei Bedarf auf alle Abfragen eines bestimmten Modells anwenden. – Ohgodwhy

+0

Haben Sie schon eine Lösung gefunden? – Gayan

Antwort

0

Ihre Frage ist,

wie der Benutzer zu verhindern, dass eine Nachricht zugreift, die nicht ihnen gehört.

Das ist fallen unter Authorization

Sie Gates können Benutzer autorisieren und ich denke, es ist das Beste hier Ansatz. Faust von allem, das Sie ein Policy Objekt benötigen würden.

<?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 
    } 
} 

Sie können sogar die vorformulierten wie diese erzeugen,

php artisan make:policy MessagePolicy --model=Message 

Dann Sie es in Ihrem AuthServiceProvider wie diese registrieren,

<?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]'); 
    } 
} 

Und in der Controller können Sie es wie dies,

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

Hinweis: Bitte verwenden Sie dieses Code-Snippet als Referenz oder als Ausgangspunkt, da ich es nicht richtig getestet habe. Aber das zugrunde liegende Konzept ist richtig. Verwenden Sie dies als Pseudocode. Wenn etwas falsch gefunden wurde, aktualisieren Sie es bitte hier :)

Verwandte Themen