2016-06-03 5 views
-2

Ich hole Menüs aus der Datenbank basierend auf Benutzerrechten und zeige es auf meiner Webseite, aber wenn ich auf eine URL zugreifen, deren Zugriff ich nicht habe, dann öffnet es auch diese Seite. Dafür habe ich die access_denied-Funktion erstellt und aufgerufen, die die Homepage des Benutzers umleitet. Ich habe die Funktion access_denied vom Konstruktor von AuthController aufgerufen, weil AuthController auf jeder Seite geladen wird.Wie Funktion in __constructor mit Laravel 5 aufrufen?

Ich habe folgenden Code verwende

AuthController

public function __construct() 
{ 
    $this->accessDenied(); 
} 

public function accessDenied() 
    { 
     $url_segment1 = Request::segment(1); 
     $url_segment2 = Request::segment(2); 

     $url_segment = $url_segment1 . '/' . $url_segment2; 
     $user_data = Auth::user()->toArray(); 
     $dadmin = array_keys($user_data['admin']); 
     //this is sample of array 
     // $user_data['admin'] => Array 
     //   (
     //   [admin/roles] => 1 
     //   ) 
     if (!in_array($url_segment, $dadmin)) { 
      return redirect('/home'); 
     }  
    } 

Aber ich bin immer folgende Fehler

Non-static method Illuminate\Http\Request::segment() should not be called statically, assuming $this from incompatible context 

Wenn ich falsch Prozess verwenden, dann bitte mir richtigen Weg vorschlagen, nicht autorisierte Benutzer die Umleitung auf Startseite.

+0

eine Middleware anstelle von Zugriffsfunktion verweigert –

+0

wo in Routing Verwendung Middleware ??? @AchrafKhouadja –

+0

entschuldigen Sie mich? Ich konnte –

Antwort

1

Zuerst sollten Sie eine Middleware erstellen. In einer Eingabeaufforderung:

php artisan make:middleware AccessDenyMiddleware 

Dann gehen Sie app/Http/Middleware/AccessDenyMiddleware.php und in den Griff Funktion {Ihren eigenen Code}

$url_segment1 = Request::segment(1); 
    $url_segment2 = Request::segment(2); 

    $url_segment = $url_segment1 . '/' . $url_segment2; 
    $user_data = Auth::user()->toArray(); 
    $dadmin = array_keys($user_data['admin']); 
    //this is sample of array 
    // $user_data['admin'] => Array 
    //   (
    //   [admin/roles] => 1 
    //   ) 
    if (!in_array($url_segment, $dadmin)) { 
     return redirect('/home'); 
    } 

Aber die folgende Zeile füllen

return $next($request); // If passed, proceed with the route 

Dann in einer Route, sollten Sie Folgendes eingeben:

Route::get('/yoururlhere', ['middleware' => 'AccessDenyMiddleware', function() { /* Put your work here */ } ]); 

Es gibt viel bessere Ansätze. Wie Authorization, wenn Sie mit Laravel 5.2

Oder vielleicht die Standard Authentifizieren Middleware ändern, wenn Sie Laravel verwenden 5

1

Sie eine Middleware für thath https://laravel.com/docs/5.2/middleware#introduction verwenden können.

php Handwerker machen: Middleware RoleRouteMiddleware

Sie sollten thath Code im Griff Methode der Middleware "App \ Http \ Middleware \ RoleRouteMiddleware" und verwenden Sie die $ request Variable anstelle der Fassade Antrag stellen.

Die Middleware würde E-Mail-Anfragen an Ihre App filtern.

eine Middleware registrieren, fügen Sie ihn auf app/Http/Kernel.php bei routeMiddleware Array

protected $routeMiddleware = [ 
    .... 
    'alias' => App\Http\Middleware\RoleRouteMiddleware::class, 
]; 

und es dann so auf bestimmten Strecken verwenden:

Route::get('admin/profile', ['middleware' => 'alias', function() { 
    //your code here 
}]); 

oder in Route gruoups:

Route::group(['middleware' => 'alias', function() { 
    //your filtered routes 
}]);