Промежуточное ПО RedirectIfAuthenticated не работает

У меня проблема с промежуточным ПО RedirectIfAuthenticated

Когда я использую это промежуточное ПО в любом контроллере, подключение пользователя не обнаруживается (подключение пользователя имеет значение NULL). А именно, я использую множественную аутентификацию.

Перенаправить при проверке подлинности

class RedirectIfAuthenticated
{
    public function handle($request, Closure $next, $guard = null){
        //dd(Auth::guard($guard)->check()); // when the user is connected the result is null 
        //dd(Auth::user()); // when the user is connect the result is => Argument 2 passed to Illuminate\Auth\SessionGuard::__construct() must be an instance of Illuminate\Contracts\Auth\UserProvider, null given, called in /Users/diegoruiz/Desktop/app/XXX/vendor/laravel/framework/src/Illuminate/Auth/AuthManager.php on line 123


        if($guard == 'admin' && Auth::guard($guard)->check()) {
            return redirect('admin/accueil');
        }else if($guard == 'employer' && Auth::guard($guard)->check()){
            return redirect('/accueil');
        } else {
            return $next($request);
        }
    }
}

Контроллер входа в систему

    class LoginController extends Controller{
       use AuthenticatesUsers;
    ...
    public function __construct(){

    $this->middleware('guest')->except('logout');//It's not working.
    //$this->middleware('guest:admin')->except('logout');//It's not working.

    }
...
    }

config/auth.php

<?php
return [

    'defaults' => [
        'guard' => 'web',
        'passwords' => 'users',
    ],

    'guards' => [
        'web' => [
            'driver' => 'session',
            'provider' => 'users',
        ],
        'api' => [
            'driver' => 'token',
            'provider' => 'users',
        ],
        'admin' => [
            'driver' => 'session',
            'provider' => 'admin',
        ],
        'admin-api' =>[
            'driver' => 'token',
            'provider' => 'admins',
        ],
        'employer'=>[
            'driver' => 'session',
            'provider' => 'employers',
        ],
        'employer-api'=>[
            'driver' => 'token',
            'provider' => 'employers',
        ],
    ],

    'providers' => [
       'admins'=> [
            'driver' => 'UtilisateurUserProvider',
            'model' => App\Admin::class,
        ],
        'employers'=>[
            'driver' => 'UtilisateurUserProvider',
            'model'=> App\Employer::class
        ]
        // 'users' => [
        //     'driver' => 'database',
        //     'table' => 'users',
        // ],
    ],



    'passwords' => [
        'users' => [
            'provider' => 'users',
            'table' => 'password_resets',
            'expire' => 60,
        ],
        'admin' => [
            'provider' => 'users',
            'table' => 'password_resets',
            'expire' => 60,
        ],
        'employer' => [
            'provider' => 'users',
            'table' => 'password_resets',
            'expire' => 60,
        ],

    ],

];

UtilisateurUserProvider

<?php

namespace App\Providers;

use Illuminate\Auth\EloquentUserProvider as UserProvider;
use Illuminate\Contracts\Auth\Authenticatable as UserContract;
use Illuminate\Contracts\Support\Arrayable;
use Illuminate\Support\Str;

class UtilisateurUserProvider extends UserProvider{

    public function boot()
    {
        //
    }

    public function register(){
        //
    }

    public function retrieveByCredentials(array $credentials)
    {
        if (empty($credentials) ||
            (count($credentials) === 1 &&
                array_key_exists('mdp', $credentials))) {
            return;
        }

        // First we will add each credential element to the query as a where clause.
        // Then we can execute the query and, if we found a user, return it in a
        // Eloquent User "model" that will be utilized by the Guard instances.
        $query = $this->createModel()->newQuery();

        foreach ($credentials as $key => $value) {
            if (Str::contains($key, 'uti_mdp')) {
                continue;
            }
            if (is_array($value) || $value instanceof Arrayable) {
                $query->whereIn($key, $value);
            } else {
                $query->where($key, $value);
            }
        }

        return $query->first();
    }

    public function validateCredentials(UserContract $user, array $credentials){

        $plain = $credentials['mdp'];
        return $this->hasher->check($plain, $user->getAuthPassword());
    }

}

Ядро

class Kernel extends HttpKernel
{
    protected $middleware = [
        \App\Http\Middleware\CheckForMaintenanceMode::class,
        \Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,
        \App\Http\Middleware\TrimStrings::class,
        \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,
        \App\Http\Middleware\TrustProxies::class,
    ];


    protected $middlewareGroups = [
        'web' => [
            \App\Http\Middleware\EncryptCookies::class,
            \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
            \Illuminate\Session\Middleware\StartSession::class,
            // \Illuminate\Session\Middleware\AuthenticateSession::class,
            \Illuminate\View\Middleware\ShareErrorsFromSession::class,
            \App\Http\Middleware\VerifyCsrfToken::class,
            \Illuminate\Routing\Middleware\SubstituteBindings::class,
        ],

        '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,
        'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class,
        'can' => \Illuminate\Auth\Middleware\Authorize::class,
        'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
        'signed' => \Illuminate\Routing\Middleware\ValidateSignature::class,
        'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
        'entrepriseDatabase' => \App\Http\Middleware\SetEntrepriseDatabase::class,
    ];
}

когда я использую Auth::user() в поле зрения, у меня есть эта ошибка


person diego    schedule 15.08.2018    source источник
comment
можете ли вы показать примерно строку 123 из verification.blade.php   -  person lagbox    schedule 15.08.2018
comment
@lagbox в представлении всего 18 строк   -  person diego    schedule 15.08.2018
comment
да, извините, неправильно прочитал, можете ли вы предоставить это представление   -  person lagbox    schedule 15.08.2018
comment
не предоставляйте изображения кода, предоставьте код... в виде текста   -  person lagbox    schedule 15.08.2018
comment
@lagbox, какой провайдер вам нужен, вам нужен этот провайдер config/app.php?   -  person diego    schedule 15.08.2018
comment
Вы зарегистрировали своего поставщика услуг? то есть используя Auth::provider("UtilisateurUserProvider", function () { return new UtilisateurUserProvider(); }) ?   -  person apokryfos    schedule 15.08.2018
comment
я использую этот провайдер для перегрузки методов, принадлежащих классу EloquentUserProvider. [stackoverflow.com/questions/ 44069557/   -  person diego    schedule 15.08.2018
comment
"вид" verification.blade.php   -  person lagbox    schedule 15.08.2018


Ответы (2)


Проблема заключается в config/auth.php, когда вы вызываете Auth::user(), тогда он увидит для пользователя Auth в auth.php, но, согласно вашему auth.php, он отсутствует:

'providers' => [
   'admins'=> [
        'driver' => 'UtilisateurUserProvider',
        'model' => App\Admin::class,
    ],
    'employers'=>[
        'driver' => 'UtilisateurUserProvider',
        'model'=> App\Employer::class
    ]
    // 'users' => [
    //     'driver' => 'database',
    //     'table' => 'users',
    // ],
],

Вы должны указать пользователя, а в пользовательской таблице добавить еще одну роль столбца, которая содержит сотрудника, администратора и т. д. Ваше отношение к таблице неверно.

person Ammar Ali    schedule 16.08.2018

Я бы дал другой способ не использовать промежуточное ПО, если ваша задача состоит в том, чтобы уточнить пользователя и перенаправить его на разные маршруты.введите здесь описание изображения

person Laziz Khaydarov    schedule 15.08.2018
comment
Здесь, в моей таблице пользователей, у меня есть столбец администратора, который уточняет, кто является пользователем. - person Laziz Khaydarov; 15.08.2018
comment
У меня есть наследство ([работодатель]---›[пользователи]‹---[admin]), и в таблице пользователей у меня есть адрес электронной почты и пароль. Ваше решение в порядке, но я хотел бы использовать промежуточное программное обеспечение, созданное Laravel. - person diego; 15.08.2018