2016-01-04 1 views
4

Я пытаюсь создать промежуточное программное обеспечение для пользователей разных типов в своем приложении Laravel 5.2. Итак, что я делаю, это создание разных посредников для разных пользователей.Laravel 5.2 - Использование Auth :: check() не работает в MIddleware

Насколько я знаю, Auth :: check() не будет работать без использования промежуточного веб-сайта от here.

Итак, что я сделал IS-

routes.php

Route::group(['middleware' => ['web','admin']], function() 
{ 
    //suspend, activate, delete 
    Route::get('users', [ 
     'uses'   => '[email protected]', 
     'as'   => 'users' 
    ]); 

    //Edit,activate,suspend, delete 
    Route::get('articles', [ 
     'uses'   => '[email protected]', 
     'as'   => 'articles' 
    ]); 
}); 

AdminMiddleware.php

<?php 

namespace App\Http\Middleware; 

use Closure; 
use Auth; 

class AdminMiddleware 
{ 
    /** 
    * Handle an incoming request. 
    * 
    * @param \Illuminate\Http\Request $request 
    * @param \Closure $next 
    * @return mixed 
    */ 
    public function handle($request, Closure $next) 
    { 
     if (Auth::check()) 
     { 
      return "asd"; 
      //return Auth::user(); 
      //return redirect('home'); 
     } 
     else 
     { 
      return redirect('login'); 
     } 

     //now return the valid request 
     return $next($request); 
    } 
} 

Kernel.php

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

AdminController.php

<?php 

namespace App\Http\Controllers; 

use Illuminate\Http\Request; 

use App\Http\Requests; 
use App\Http\Controllers\Controller; 

class AdminController extends Controller 
{ 
    public function users() 
    { 
     return view('admin.users'); 
    } 

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

Но я получаю этот error-

enter image description here

когда "возвращение Auth :: пользователя(); "называется внутри промежуточного слоя,„вернуть Auth :: пользователя();“работает в другом месте (вид и контроллеры), но не работает, как старые версии Laravel

Может кто-нибудь, пожалуйста, помогите

+0

почему вы пытаетесь вернуть пользовательскую модель из промежуточного слоя? – lagbox

+0

На самом деле я хочу знать тип пользователя в моем промежуточном программном обеспечении, чтобы я мог решить, что с этим делать, так как для тестирования я пытаюсь вернуть все. –

+0

просто 'dd', что вы хотите проверить, не верните их. Что вы пытаетесь проверить на «пользовательской» модели? – lagbox

ответ

2

Вы могли.? потенциально сделать что-то вроде этого, отрегулируйте при необходимости

public function handle($request, Closure $next) 
{ 
    $user = $request->user(); 

    if (! $user || $user->user_type != 'admin') { 
     return redirect('login'); 
    } 

    return $next($request); 
} 

ошибки вы получаете приходите от того, что вы не возвращающих Response объекта из промежуточного слоя. VerifyCsrfToken промежуточного слоя пытается добавить печенье в ответ он получает от передачи запроса по трубопроводу. s случае он не получает объект Response, а вместо него строку или User, потому что в вашем промежуточном программном обеспечении была возвращена строка или User.

+0

Привет, это не работает, я получаю такую ​​же ошибку. –

+0

работает отлично для меня на 5.2. кажется, проблема с вашим стекем, потому что нет надлежащего объекта ответа, который передается обратно через конвейер, но опять же, возврат текста или пользовательского объекта из вашего промежуточного программного обеспечения не поможет вам, он просто собирается сломать вещи. – lagbox

0

Вы также добавили маршруты в веб-группу, поэтому убедитесь, что ваш файл ядра должен иметь следующую промежуточную группу.

/** 
* The application's route middleware groups. 
* 
* @var array 
*/ 
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, 
    ], 

    'api' => [ 
     'throttle:60,1', 
    ], 
]; 

Ошибка, связанная с сеансом. убедитесь, что ваш файл ядра содержит сеансы middlewares.

+1

В OP уже есть группа промежуточного программного обеспечения. если бы они этого не сделали, они не получили бы ошибку, исходящую из промежуточного программного обеспечения csrf, которое предоставляется веб-группой. – lagbox

0

Привет @Cowboy и @lagbox, Спасибо за помощь, к сожалению, они не работали, но я решил это.

Я решил ее running-

кэш PHP ремесленника: прозрачный

композитор свалка-автозагрузка

PHP ремесленник ясно скомпилированные

PHP ремесленник оптимизации

, а затем промежуточное ПО-

<?php 

namespace App\Http\Middleware; 

use Closure; 
use Auth; 

class AdminMiddleware 
{ 
    /** 
    * Handle an incoming request. 
    * 
    * @param \Illuminate\Http\Request $request 
    * @param \Closure $next 
    * @return mixed 
    */ 
    public function handle($request, Closure $next) 
    { 
     if (Auth::check()) 
     { 
      if(strcmp("admin" , Auth::user()->user_type) != 0) 
       return redirect('home'); 
      else 
       return $next($request); 
     } 
     else 
     { 
      return redirect('login'); 
     } 

     //now return the valid request 
     //return $next($request); 
    } 
} 

И маршрутные

Route::group(['middleware' => ['web','admin']], function() 
{ 
    //suspend, activate, delete 
    Route::get('users', [ 
     'uses'   => '[email protected]', 
     'as'   => 'users' 
    ]); 

    //Edit,activate,suspend, delete 
    Route::get('articles', [ 
     'uses'   => '[email protected]', 
     'as'   => 'articles' 
    ]); 
});