laravel 5.4, добавление второй аутентификации (админ-панель)

Я хочу создать вторую аутентификацию в laravel 5.4 для страницы администрирования.


Прежде всего, позвольте мне описать мою проблему: у меня есть функциональный вход пользователя (аутентификация laravel по умолчанию) через 'web'-guard. Теперь я хочу создать вторую аутентификацию для панели администратора. У меня есть еще одна таблица, в которой хранятся имя, токен (что-то вроде пароля) и уровень полномочий.

Вторая / отдельная таблица - это зависимость, заданная системой, для которой разработана страница, поэтому я не могу это изменить.

У меня есть страница входа в панель администрирования, но когда я пытаюсь пройти аутентификацию, меня каждый раз перенаправляют обратно на страницу входа.


Я уже погуглил все это и наткнулся на несколько хороших примеров:

  1. https://jamesmcfadden.co.uk/custom-authentication-in-laravel-with-guards-and-user-service-providers

    • other links are in the controller paste on pastebin (link down below)

Но я не мог этого понять.


Вот что я уже сделал:

  • Добавлен второй охранник с именем «admin» в config / auth.php

    'guards' => [
        'web' => [
            'driver' => 'session',
            'provider' => 'users',
        ],
    
        'admin' => [
            'driver' => 'session',
            'provider' => 'admin',
        ]
    ],
    
    'providers' => [
        'users' => [
            'driver' => 'eloquent',
            'model' => App\User::class,
        ],
    
        'admin' => [
            'driver' => 'eloquent',
            'model' => App\Admin::class,
        ]
    ],
    
  • Добавлена ​​необходимая модель

    namespace App;
    
    use Illuminate\Notifications\Notifiable;
    use Illuminate\Foundation\Auth\User as Authenticatable;
    
    class Admin extends Authenticatable
    {
        use Notifiable;
    
        protected $fillable = [
            'mID',
            'mAccount',
            'mName',
            'mServerIP',
            'mAuthority',
            'mToken'
        ];
    
        protected $hidden = [
            'mContactIP', 'mToken'
        ];
    
        protected $table = 'administration';
        protected $connection = 'common';
    
        public $timestamps = false;
    
        public function getAuthIdentifierName()
        {
            return 'mAccount';
        }
    }
    
  • Добавлены необходимые маршруты в routes / web.php

    Route::group(['prefix' => 'admin'], function () {
        Route::get('/login','Auth\ElevationController@showLoginForm')->middleware('web');
        Route::post('/login','Auth\ElevationController@elevate');
        Route::get('/logout','Auth\ElevationController@demote');
    
        Route::get('/', function (){return redirect('admin/dashboard');});
        Route::get('/dashboard', 'AdminController@index');
    
    });
    
  • Добавлено новое промежуточное ПО в app / Http / Middleware с именем «RedirectIfElevated» с помощью команды «php artisan make: middleware '

    public function handle($request, Closure $next, $guard = 'admin')
    {
        if (!Auth::guard($guard)->check())
        {
            if(!Auth::guard('web')->check())
            {
                return redirect('/');
            }
    
            return redirect('/admin/login');
        }
    
        return $next($request);
    }
    
  • и в Kernel.php

    protected $routeMiddleware = [
        .
        .
        .
        'admin' => \WarShape\Http\Middleware\RedirectIfElevated::class,
    ];
    
  • наконец, я создал свой Контроллер: https://pastebin.com/s6iJgFAB

  • и создал представление

    @extends('layouts.app')
    
    @section('content')
    <div class="container">
        <div class="row">
            <div class="col-md-8 col-md-offset-2">
                <div class="panel panel-default">
                    <div class="panel-heading">Elevation</div>
                    <div class="panel-body">
                        <form class="form-horizontal" role="form" method="POST" action="{{ url('/admin/login') }}">
                            {{ csrf_field() }}
    
                            <div class="form-group{{ $errors->has('password') ? ' has-error' : '' }}">
                                <label for="mToken" class="col-md-4 control-label">Token</label>
    
                                <div class="col-md-6">
                                    <input id="mToken" type="password" class="form-control" name="mToken" required>
    
                                    @if ($errors->has('password'))
                                        <span class="help-block">
                                        <strong>{{ $errors->first('password') }}</strong>
                                    </span>
                                    @endif
                                </div>
                            </div>
    
                            <div class="form-group{{ $errors->has('g-recaptcha-response') ? ' has-error' : '' }}">
                                <label for="recaptcha" class="col-md-4 control-label">Solve Captcha <br> & Elevate!</label>
    
                                <div class="col-md-6">
                                    {!! app('captcha')->display($attributes = [], $lang = app()->getLocale()) !!}
    
                                    @if ($errors->has('g-recaptcha-response'))
                                        <span class="help-block">
                                        <strong>{{ $errors->first('g-recaptcha-response') }}</strong>
                                    </span>
                                    @endif
                                </div>
                            </div>
    
                            <input type="hidden" name="mAccount" value="{{ Auth::guard('web')->user()->login }}">
    
                            <div class="form-group">
                                <div class="col-md-8 col-md-offset-4">
                                    <button type="submit" class="btn btn-primary">
                                        Elevate
                                    </button>
                                </div>
                            </div>
                        </form>
                    </div>
                </div>
            </div>
        </div>
    </div>
    @endsection
    

Итак, вопрос, на который мне нужен ответ:

  1. Где я что-то пропустил? Где я напортачил?

Надеюсь, вы поможете мне с этим, и спасибо за вашу помощь!


person pollux    schedule 02.07.2017    source источник


Ответы (2)


Прошу прощения, если я не отвечу на ваш вопрос, но разве вы не можете добавить простой столбец в свою таблицу пользователей, например is_admin, и разрешить только пользователям, которым is_admin = 1, получить доступ к панели администрирования с помощью промежуточного программного обеспечения, вместо того, чтобы входить дважды?

person tompec    schedule 02.07.2017
comment
Это самый распространенный способ. Я видел это несколько раз в сети. Но мне приходится использовать вторую таблицу, потому что в ней хранятся необходимые данные для другого приложения, которые я не могу изменить. Я также думал о написании собственного класса входа в систему, но даже тогда я не знаю, как передать данные из базы данных в охранник / сеанс авторизации. Есть какие-нибудь советы по этому поводу? - person pollux; 02.07.2017

Я исправил это с помощью следующего пользовательского метода входа в систему:

public function elevate(Request $request)
{
    // login
    $this->validateLogin($request);
    $admin = Admin::where('mAccount', '=', Auth::guard('web')->user()->login)
       ->where('mToken', '=', $request->input('mToken'))->first();
    if($admin){
       Auth::guard('admin')->login($admin);
        return redirect('/admin/dashboard');
    }
    else{
        throw new \ErrorException('Elevation failed!');
    }
}

protected function validateLogin(Request $request)
{
    $this->validate($request, [
        'mToken' => 'required|string|min:8',
        'g-recaptcha-response' => 'required|captcha'
    ]);
}
person pollux    schedule 03.07.2017