2015-03-22 4 views
4

Иногда мы хотели бы разделить пользователей и администраторов в разных 2 таблицах.
Я думаю, что это хорошая практика.Как использовать аутентификацию для нескольких таблиц в Laravel 5

Так что я искал, если это возможно в Laravel 5.

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

Поэтому я потратил некоторое время на поиск исходного кода и, наконец, нашел способ добиться этого.

+0

@DerGolem Я имел выкладываю решение, когда этот вопрос был поднят. не может это увидеть? – JasonW

ответ

5

Прежде чем читать следующее, вы должны иметь базовые знания в ServiceProvider, Facade и IoC в Laravel 5. Здесь мы идем.

Согласно документу Laravel, вы можете найти Фасад 'Auth' ссылается на Illuminate\Auth\AuthManager, у которого есть магический __call(). Вы можете увидеть основные функции не в AuthManager, но в Illuminate\Auth\Guard

Охранник имеет поставщика. Этот провайдер имеет свойство $model, согласно которому EloquentUserProvider будет создавать эту модель на "new $model". Это все, что нам нужно знать. Вот код.

1. Нам нужно создать AdminAuthServiceProvider.

public function register(){ 
    Auth::extend('adminEloquent', function($app){ 
     // you can use Config::get() to retrieve the model class name from config file 
     $myProvider = new EloquentUserProvider($app['hash'], '\App\AdminModel') 
     return new Guard($myProvider, $app['session.store']); 
    }) 
    $app->singleton('auth.driver_admin', function($app){ 
     return Auth::driver('adminEloquent'); 
    }); 
} 

2.Facade:

class AdminAuth extends Facade { 
     protected static function getFacadeAccessor() { return 'auth.driver_admin'; } 
    } 

3. добавить псевдоним Kernel:

'aliases' => [ 
    //has to be beneath the 'Auth' alias 
    'AdminAuth' => '\App\Facades\AdminAuth' 
] 

Надеется, что это может быть полезным.

+4

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

+0

Есть ли проблема безопасности с этим методом? – user3201500

+1

Если я правильно понимаю это, пользователи «admin» и «non-admin» будут в отдельных таблицах. В этом случае вы будете запрашивать таблицу «admin» для области администрирования и «пользователи» для областей без админов. Поэтому пользователи с перекрывающимися идентификаторами не должны быть проблемой, так как вы будете искать пользователей «admin» в таблице «admin». Даже если вы знаете идентификатор пользователя, у вас должно быть совпадающее имя пользователя и пароль, чтобы установить сеанс, поэтому здесь не должно быть никаких проблем. Сеанс, а не идентификатор пользователя, является «ключом», и это гарантировано уникальным по PHP (при использовании лучших практик). – cmpreshn

2

Я создал пакет Laravel, где вы можете обрабатывать несколько аутентификации.

Шаг 1: Композитор требует

Во-первых, композитор требуется пакет multiauth

composer require sarav/laravel-multiauth dev-master 

Шаг 2: Замена по умолчанию аутентификации поставщик услуг

Заменить

Illuminate\Auth\AuthServiceProvider::class 

с

Sarav\Multiauth\MultiauthServiceProvider 

в вашей конфигурации/приложения.PHP файл

Шаг 3: Изменение auth.php

Измените конфигурационный файл/auth.php на что-то вроде этого

'multi' => [ 
    'user' => [ 
     'driver' => 'eloquent', 
     'model' => App\User::class, 
     'table' => 'users' 
    ], 
'admin' => [ 
    'driver' => 'eloquent', 
    'model' => App\Admin::class, 
    'table' => 'admins' 
    ] 
], 

Thats это! Теперь вы можете попробовать несколько аутентификаций, передав пользователю в качестве первого параметра. Например

\Auth::loginUsingId("user", 1); // Login user with id 1 

\Auth::loginUsingId("admin", 1); // Login user with id 1 

// Attempts to login user with email id [email protected] 
\Auth::attempt("user", ['email' => '[email protected]', 'password' => 'password']); 

// Attempts to login admin with email id [email protected] 
\Auth::attempt("admin", ['email' => '[email protected]', 'password' => 'password']); 

Для получения более подробной документации

http://sarav.co/blog/multiple-authentication-in-laravel/

http://sarav.co/blog/multiple-authentication-in-laravel-continued/

+0

Он работает, но как проверить, зарегистрирован ли администратор или нет. –

+1

Я получаю иллюминацию/Auth/Gaurd не найден. :(добавлено все предоставители по-прежнему. помогите – themesndesigns

+1

Illuminate/Auth/Gaurd не найдена. эта библиотека никогда не работала. –

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