2016-11-06 4 views
0

Кто-нибудь знает простой способ сделать в Laravel 5.3 без расширений:Laravel 5.3 Перенаправление на страницу администратора после входа в системе, только если пользователь является администратором

Если текущий пользователь администратор, то после авторизации/регистрации -> сделать перенаправление на администратор стр. Если текущий пользователь - веб-пользователь -> перенаправление на главную страницу.

В базе данных я положил поле $ table-> boolean ('admin') -> nullable(); Поэтому, когда пользователь зарегистрирован, он по умолчанию не является администратором.

В настоящее время я сделал это. И я получаю ошибку Call to undefined method Illuminate\Support\Facades\Auth::check() in AdminMiddleware.php

приложение \ Http \ Middleware \ AdminMiddleware.php

namespace App\Http\Middleware; 
use Closure; 
use Illuminate\Support\Facades\Auth; 

class AdminMiddleware 
{ 
    public function __construct(Auth $auth) 
    { 
     $this->auth = $auth; 
    } 
    public function handle($request, Closure $next) 
    { 
     if ($this->auth->check()) { 
      if (! $this->auth->user()->isAdmin()) { 
       Auth::logout(); 
       return redirect()->guest('/'); 
      } 
     } 
     return $next($request); 
    } 
} 

Kernel.php

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

приложение \ Http \ Контроллеры \ AdminController.php

namespace App\Http\Controllers; 
use Illuminate\Http\Request; 

class AdminController extends Controller 
{ 

    public function __construct() 
    {  $this->middleware('auth'); } 

    public function index() 
    {  return view('admin.dashboard'); } 

    public function registered() 
    {  return view('admin.registered'); } 

} 

ответ

1

После авторизации вы делаете это как:

if(auth()->user()->admin) { 
    // redirect to admin page 
} else { 
    // redirect to home page 
} 
1

Прежде всего, вы можете использовать это как приложение \ Http \ Middleware \ AdminMiddleware.php. проверяет, вошел ли пользователь в первую очередь, а затем, если пользователь является администратором.

Причина, по которой вы получили эту ошибку, вероятно, потому, что вы включили Auth неправильный путь.

namespace App\Http\Middleware; 
use Closure; 
use Auth; 

class AdminMiddleware 
{ 


    public function handle($request, Closure $next) { 

     /** 
     * Checks if user is Admin 
     */ 
     if(!$this->CheckAdmin()){ 

      //redirect to admin login 
      return redirect('/admin/login'); 

     } 

     /** 
     * Prodceed to next request 
     */ 
     return $next($request); 

    } 

    /** 
    * Checks if user is logged in as an admin 
    */ 
    private function CheckAdmin(){ 

     /** 
     * Check If User Is Logged In 
     */ 
     if (!Auth::check()) { 

      return false; 

     } 

     /** 
     * Check If User has administrator role 
     */ 
     if (!Auth::user()->isAdmin()) { 

      return false; 

     } 

     //passed Admin rules 
     return true; 

    } 


} 

Не забудьте использовать промежуточное ПО «admin» в вашем контроллере. Кажется, что вы используете стандартное промежуточное ПО «auth».

0

Выполните следующие действия: -

1) Создать новую таблицу в PHPMyAdmin

CREATE TABLE `role` (
    `id` int(10) UNSIGNED NOT NULL, 
    `role_name` varchar(255) COLLATE utf8_unicode_ci NOT NULL, 
    `role_description` text COLLATE utf8_unicode_ci NOT NULL, 
    `created_at` timestamp NULL DEFAULT NULL, 
    `updated_at` timestamp NULL DEFAULT NULL 
) ENGINE=InnoDB DEFAULT 

ALTER TABLE `role` 
    ADD PRIMARY KEY (`id`); 

-- 
-- AUTO_INCREMENT for dumped tables 
-- 

-- 
-- AUTO_INCREMENT for table `role` 
-- 
ALTER TABLE `role` 
    MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT; 

2) Добавить внешний ключ в таблице пользователей

CREATE TABLE `users` (
    `id` int(10) UNSIGNED NOT NULL, 
    `name` varchar(255) COLLATE utf8_unicode_ci NOT NULL, 
    `email` varchar(255) COLLATE utf8_unicode_ci NOT NULL, 
    `user_role` int(11) NOT NULL DEFAULT '0', 
    `password` varchar(255) COLLATE utf8_unicode_ci NOT NULL, 
    `remember_token` varchar(100) COLLATE utf8_unicode_ci DEFAULT NULL, 
    `created_at` timestamp NULL DEFAULT NULL, 
    `updated_at` timestamp NULL DEFAULT NULL, 
    `status` enum('0','1','2') COLLATE utf8_unicode_ci NOT NULL DEFAULT '0' 
) ENGINE=InnoDB DEFAULT; 

3) Добавить ниже код в пользовательской модели, т.е. user.php App/User.php

/** 
    * Description : check user role which type of users login 
    */ 
    public function role() 
    { 
     return $this->hasOne('App\Role', 'id', 'user_role'); 
    } 
    /** 
    * Description : check has role if user has any role assigned 
    */ 
    public function hasRole($roles) 
    { 
     //die('inside hasRole'); 

     $this->have_role = $this->getUserRole(); 

     // Check if the user is a root account 
     if($this->have_role->role_name == 'Admin') { 
      return true; 
     } 

     if(is_array($roles)){ 
      foreach($roles as $need_role){ 
       if($this->checkIfUserHasRole($need_role)) { 
        return true; 
       } 
      } 
     } else{ 
      return $this->checkIfUserHasRole($roles); 
     } 
     return false; 
    } 

    /** 
    * Description : check role from database 
    */ 
    private function getUserRole() 
    { 
     return $this->role()->getResults(); 
    } 

    // 
    private function checkIfUserHasRole($need_role) 
    { 
     return (strtolower($need_role)==strtolower($this->have_role->role_name)) ? true : false; 
    } 

4) Создайте новый файл в \ приложения \ Http \ Middleware с именем CheckRole.php добавить ниже код в этом файле

<?php 
namespace App\Http\Middleware; 

// First copy this file into your middleware directory 

use Closure; 

use Illuminate\Support\Facades\Auth; 

class CheckRole{ 

    /** 
    * Handle an incoming request. 
    * 
    * @param \Illuminate\Http\Request $request 
    * @param \Closure $next 
    * @return mixed 
    */ 
    public function handle($request, Closure $next) 
    { 
     // Get the required roles from the route 
     $roles = $this->getRequiredRoleForRoute($request->route()); 

     // Check if a role is required for the route, and 
     // if so, ensure that the user has that role. 
     if($request->user()->hasRole($roles) || !$roles) 
     { 
      return $next($request); 
     } 

     return redirect('admin/logout'); 
     /*return response([ 

      'error' => [ 
       'code' => 'INSUFFICIENT_ROLE', 
       'description' => 'You are not authorized to access this resource.' 
      ] 
     ], 401);*/ 

    } 

    private function getRequiredRoleForRoute($route) 
    { 
     $actions = $route->getAction(); 
     return isset($actions['roles']) ? $actions['roles'] : null; 
    } 

} 

5) Заменить приведенный ниже код в \ приложения \ Http \ Kernel.PHP

protected $middlewareGroups = [ 
     'web' => [ 
      \App\Http\Middleware\EncryptCookies::class, 
      \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class, 
      \Illuminate\Session\Middleware\StartSession::class, 
      \Illuminate\View\Middleware\ShareErrorsFromSession::class, 
      \App\Http\Middleware\VerifyCsrfToken::class, 
      \Illuminate\Routing\Middleware\SubstituteBindings::class, 
     ], 
     'api' => [ 
      'throttle:60,1', 
      'bindings', 
     ], 
    ]; 

С ниже код

protected $middlewareGroups = [ 
     'web' => [ 
      \App\Http\Middleware\EncryptCookies::class, 
      \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class, 
      \Illuminate\Session\Middleware\StartSession::class, 
      \Illuminate\View\Middleware\ShareErrorsFromSession::class, 
      \App\Http\Middleware\VerifyCsrfToken::class, 
      \Illuminate\Routing\Middleware\SubstituteBindings::class, 
     ], 
     'CheckRole' => [ 
      'web', 
      'auth', 
      'roles' 
     ], 
     'api' => [ 
      'throttle:60,1', 
      'bindings', 
     ], 
    ]; 

И

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

С ниже кода

protected $routeMiddleware = [ 
     'auth' => \Illuminate\Auth\Middleware\Authenticate::class, 
     'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class, 
     'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class, 
     'can' => \Illuminate\Auth\Middleware\Authorize::class, 
     'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class, 
     'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class, 
     'roles'  => 'App\Http\Middleware\CheckRole', 
    ]; 

6) наиболее важный момент вашей Разгром файлов \ маршрутов \ web.php должно быть что-то вроде ниже контроллера может быть варьироваться в зависимости от ваших требований

Auth::routes(); 

Route::get('/', 'Auth\[email protected]'); 



Route::group(['middleware' => ['CheckRole'], 'roles' => ['admin']], function() { 
    //Route::get('/home', '[email protected]'); 
    Route::get('/admin/dashboard', '[email protected]'); 
    //Route::get('/home', '[email protected]'); 

}); 

Route::group(['middleware' => ['CheckRole'], 'roles' => ['employee']], function() { 
    //Route::get('/home', '[email protected]'); 
    Route::get('/employee', '[email protected]'); 

}); 
1

Laravel использует RedirectUsers::redirectPath(), чтобы перенаправить путь.

Только проверяет имущество redirectTo.

Если вы хотите применить пользовательскую логику - просто перепишите метод redirectPath() в свой контроллер.

namespace App\Http\Controllers\Auth; 
use App\Http\Controllers\Controller; 
use Illuminate\Foundation\Auth\AuthenticatesUsers; 
use Illuminate\Support\Facades\Auth; 

class LoginController extends Controller 
{ 
    use AuthenticatesUsers; 

    // protected $redirectTo = '/'; 
    public function redirectPath() 
    { 
     // ... 
     // custom logic here 
     // ... 

     // return desired URL 
     return '/my/custom/url/here'; 
    } 

    public function __construct() 
    { 
     $this->middleware('guest', ['except' => 'logout']); 
    } 

} 

Такой же подход будет работать для RegisterController и ResetPasswordController.

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