2016-03-02 2 views
3

Я хочу написать свое собственное промежуточное программное обеспечение, чтобы проверить, является ли текущий пользователь членом определенной группы. Если да, пользователь может перейти на маршрут, если нет, то пользователь будет перенаправлен на другую страницу.Laravel Middleware -> получить зарегистрированного пользователя

Мое промежуточное программное обеспечение работает, но я не знаю, как получить идентификатор текущих пользователей. Я пробовал метод Auth :: user(), но без успеха.

Это мой Middleware:

namespace App\Http\Middleware; 

use Closure; 
use App\User; 
use App\Usergroups; 
use Illuminate\Http\Request; 

class UserGroupMiddleware 
{ 
    /** 
    * Handle an incoming request. 
    * 
    * @param \Illuminate\Http\Request $request 
    * @param \Closure $next 
    * @return mixed 
    */ 
    public function handle(Request $request, Closure $next, $group = NULL) 
    { 
     $user_id = $request->user()->user_id; 
     $user = User::find($user_id); 
     $usergroup = Usergroups::find($user->benutzergruppe); 

     if($usergroup->slug == 'admin'){ 
      return $next($request); 
     } 
     return redirect('/'); 
    } 
} 
+1

Что вы подразумеваете под 'но без success' в этом случае? Если пользователь вошел в систему, вы должны проверить его следующим образом: 'if (Auth :: check()) {print Auth :: user() -> id; } ' – Cyclonecode

+0

Использование метода Auth :: user() ничего мне не дает. Пусто. Нет значений. Если я установил «benutzergruppe» в действительное значение, я могу пройти. Но даже, на мой взгляд, метод Auth :: user() не имеет значений. Ошибка не возникает, но если я попытаюсь получить доступ к существующему значению из пользовательской записи, он даст мое сообщение, что я пытаюсь получить свойство не-объекта – Brotzka

ответ

3

У вас есть доступ к текущему заверенному пользователю, если она была решена. Это означает, что вы должны убедиться, что вы поместите проверки групповое промежуточное программное после в auth промежуточное программное обеспечение на свой маршрут/группы маршрутов:

Route::group(['middleware' => ['auth', 'in_group:group_name']], function() { 
    // Routes 
}); 

Вы можете проверить свою роль, как это:

class UserGroupMiddleware 
{ 
    public function handle(Request $request, Closure $next, $group) 
    { 
     // Check user is in specified group here 
     if ($request->user()->memberOf($group)) { 
      return $next($request); 
     } 

     // Display a 403 Forbidden error 
     abort(403); 
    } 
} 
+0

Спасибо! Ваш намек привел меня на правильный путь. Но это не сработало, как вы это описали. – Brotzka

-1

Например, Martin Bean сказал, что мне пришлось включить другое промежуточное ПО. Но в этом случае это был не auth-middlewar. Я должен был включить веб-промежуточное программное обеспечение в свои маршруты.php.

routes.php:

Route::group(['middleware' => ['web', 'admingroup']], function() { 
    Route::get('/admin', '[email protected]'); 
}); 

UserGroupMiddleware.php:

namespace App\Http\Middleware; 

use Closure; 
use App\User; 
use App\Usergroups; 
use Illuminate\Http\Request; 
use Illuminate\Support\Facades\Auth; 

class UserGroupMiddleware 
{ 
    public function handle(Request $request, Closure $next, $group = NULL) 
    { 
     if(Auth::user()){ 
      $user_id = Auth::user()->user_id; 
      $user = User::find($user_id); 
      $usergroup = Usergroups::find($user->benutzergruppe); 

      if($usergroup->slug === 'admin'){ 
       return $next($request); 
      } 
     } 
     abort(403, 'No Access'); 
    } 
} 

Прежде чем я написал к промежуточному, я запустил команду

php artisan make:auth 

. Таким образом, все взгляды на элементы управления были созданы laravel.

Важно: Не забудьте зарегистрировать промежуточное программное обеспечение в вашем Kernel.php:

protected $routeMiddleware = [ 
     'auth' => \App\Http\Middleware\Authenticate::class, 
     'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class, 
     'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class, 
     'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class, 

     // Custom Middleware 
     'admingroup' => \App\Http\Middleware\UserGroupMiddleware::class, 
    ]; 
+1

Почему вы получаете идентификатор объекта _user_, просто чтобы попасть в базу данных, чтобы снова получить того же пользователя? Просто используйте '$ request-> user()'. –

+0

Этот код делает то же самое, что и у Мартина более тупым способом. – AjahnCharles

 Смежные вопросы

  • Нет связанных вопросов^_^