Как я знаю, Auth::attempt
используется для аутентификации пользователей из таблицы users
, но я хочу, чтобы аутентифицировать других пользователей из таблицы managers
и администратора из таблицы admins
. Я знаю, что плагин laravel-multiauth
уже существует. Но можем ли мы создать собственный AuthServiceProvider
для аутентификации пользователей из нескольких таблиц..?
Аутентификация пользователей из более чем двух таблиц в laravel 5
Ответ 1
Сначала создайте аутентификацию администратора в Illuminate\Foundation\Auth
like
<?php
namespace Illuminate\Foundation\Auth;
use Illuminate\Auth\Authenticatable;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Auth\Passwords\CanResetPassword;
use Illuminate\Foundation\Auth\Access\Authorizable;
use Illuminate\Contracts\Auth\Authenticatable as AuthenticatableContract;
use Illuminate\Contracts\Auth\Access\Authorizable as AuthorizableContract;
use Illuminate\Contracts\Auth\CanResetPassword as CanResetPasswordContract;
class Admin extends Model implements
AuthenticatableContract,
AuthorizableContract,
CanResetPasswordContract
{
use Authenticatable, Authorizable, CanResetPassword;
}
Затем создайте модель администратора, расширив Authenticatable
Admin Model:
<?php
namespace App;
use Illuminate\Foundation\Auth\Admin as Authenticatable;
class Admin extends Authenticatable
{
/**
* The attributes that are mass assignable.
*
* @var array
*/
protected $fillable = [
'name', 'email', 'password',
];
/**
* The attributes that should be hidden for arrays.
*
* @var array
*/
protected $hidden = [
'password', 'remember_token',
];
}
После этого вам нужно изменить config/auth.php
как config/auth.php
ниже: Добавить в массив провайдеров
'admins' => [
'driver' => 'eloquent',
'model' => App\Admin::class,
],
и добавить в массив охранников.
'user' => [
'driver' => 'session',
'provider' => 'users',
],
'admin' => [
'driver' => 'session',
'provider' => 'admins',
],
Теперь для аутентификации из таблицы пользователя
if (Auth::guard('user')->attempt(['email' => $email, 'password' => $password])) {
$details = Auth::guard('user')->user();
$user = $details['original'];
return $user;
} else {
return 'auth fail';
}
И для проверки подлинности из таблицы администратора
if (Auth::guard('admin')->attempt(['email' => $email, 'password' => $password])) {
$details = Auth::guard('admin')->user();
$user = $details['original'];
return $user;
} else {
return 'auth fail';
}
Ответ 2
Я только что сделал это в своем проекте для двух таблиц: users
и admin
, но вы можете сделать то же самое для более двух таблиц.
Давайте посмотрим
Как создать собственный AuthServiceProvider
для аутентификации пользователей из нескольких таблиц
У меня есть две таблицы admin
и users
сначала создайте базовую таблицу входа/регистрации route
, view
и controller
для user
с помощью команды Laravel 5.2 artisan
.
php artisan make:auth
Позволяет сделать таблицу admin
в качестве таблицы users
.
Контроллер для части администратора app/Http/Controllers/AdminAuth/AuthController
app/Http/Controllers/AdminAuth/PasswordController
(Просто скопировали эти файлы из app/Http/Controllers/Auth/AuthController
здесь)
config/auth.php
//Authenticating guards
'guards' => [
'user' =>[
'driver' => 'session',
'provider' => 'user',
],
'admin' => [
'driver' => 'session',
'provider' => 'admin',
],
],
//User Providers
'providers' => [
'user' => [
'driver' => 'eloquent',
'model' => App\User::class,
],
'admin' => [
'driver' => 'eloquent',
'model' => App\Admin::class,
]
],
//Resetting Password
'passwords' => [
'clients' => [
'provider' => 'client',
'email' => 'auth.emails.password',
'table' => 'password_resets',
'expire' => 60,
],
'admins' => [
'provider' => 'admin',
'email' => 'auth.emails.password',
'table' => 'password_resets',
'expire' => 60,
],
],
route.php
Route::group(['middleware' => ['web']], function () {
//Login Routes...
Route::get('/admin/login','AdminAuth\[email protected]');
Route::post('/admin/login','AdminAuth\[email protected]');
Route::get('/admin/logout','AdminAuth\[email protected]');
// Registration Routes...
Route::get('admin/register', 'AdminAuth\[email protected]');
Route::post('admin/register', 'AdminAuth\[email protected]');
Route::get('/admin', '[email protected]');
});
AdminAuth/AuthController.php
Добавьте два метода и укажите $redirectTo
и $guard
protected $redirectTo = '/admin';
protected $guard = 'admin';
public function loginPage()
{
if (view()->exists('auth.authenticate')) {
return view('auth.authenticate');
}
return view('admin.auth.login');
}
public function registrationPage()
{
return view('admin.auth.register');
}
это поможет вам открыть другую форму для входа в систему admin
создание промежуточного программного обеспечения для admin
class RedirectIfNotAdmin
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @param string|null $guard
* @return mixed
*/
public function handle($request, Closure $next, $guard = 'admin')
{
if (!Auth::guard($guard)->check()) {
return redirect('/');
}
return $next($request);
}
}
зарегистрировать промежуточное ПО в kernel.php
protected $routeMiddleware = [
'admin' => \App\Http\Middleware\RedirectIfNotAdmin::class,
];
используйте это промежуточное программное обеспечение в AdminController
например,
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Http\Requests;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Auth;
class AdminController extends Controller
{
public function __construct(){
$this->middleware('admin');
}
public function index(){
return view('admin.dashboard');
}
}
Аутентификация
Мы можем получить доступ к аутентифицированному пользователю напрямую, используя
Auth::user()
но если у вас есть две таблицы аутентификации, вы должны использовать
Auth::guard('guard_name')->user()
Как
Auth::guard('admin')->user()
А также для справки проверьте https://laracasts.com/discuss/channels/laravel/52-auth-multiple-tables?page=1
Ответ 3
Вы можете настроить несколько защит для проверки подлинности, причем каждый из них имеет другой поставщик. Поставщики определяют таблицу или модель, которые будут использоваться.
В config/auth.php
вы устанавливаете providers
следующим образом, и вы также устанавливаете соответствующий guards
для каждого из этих поставщиков:
'providers' => [
'users' => [
'driver' => 'eloquent',
'model' => App\User::class,
],
'managers' => [
'driver' => 'eloquent',
'model' => App\Manager::class,
],
'admins' => [
'driver' => 'eloquent',
'model' => App\Admin::class,
]
]
Затем вы можете аутентифицироваться следующим образом:
Auth::attempt($credentials) // use default guard for simple users
Auth::guard('manager')->attempt($credentials)
Auth::guard('admin')->attempt($credentials)
Ознакомьтесь с документами здесь.
Ответ 4
Попробуйте мою идею, если хотите. Я ожидаю, что разные table
имеют разные users
. Потому что это не сработает, если у вас есть те же user
в других таблицах.
- Выберите таблицу приоритетов (например, пользователей)
- Добавьте условие
-
if(Auth::user(attempt(...))
-
elseif(Auth::manager(attempt(...))
-
elseif(Auth::admins(attempt(...)))
-
Примечание. Ваша таблица приоритетов здесь users
, тогда, если пользователь не существует в этой таблице, он попытается использовать таблицу managers
, а если она еще не существует, она проверит admins
table, в противном случае (используйте else
) верните сообщение об ошибке.
Другой вариант:
Другой вариант - использовать этот пакет sarav/laravel-multiauth
. Вы можете следить за этой веткой. Как использовать аутентификацию для нескольких таблиц в Laravel 5 для получения дополнительной информации.
Дополнительная ссылка:
Может ли кто-нибудь объяснить Laravel 5.2 Multi Auth с примером
https://laracasts.com/discuss/channels/laravel/52-auth-multiple-tables?page=1
Ответ 5
Внедрить Multi Auth
в Larvel 5.2
Я рассматриваю две таблицы admin
и users
Laravel 5.2 имеет новую команду artisan
.
php artisan make:auth
он будет генерировать базовый логин/регистр route
, view
и controller
для таблицы пользователя.
Сделайте таблицу admin
как таблицу users
для простоты.
Контроллер Для admin
app/Http/Controllers/AdminAuth/AuthController
app/Http/Controllers/AdminAuth/PasswordController
(примечание: я просто скопировал эти файлы из app/Http/Controllers/Auth/AuthController
здесь)
config/auth.php
//Authenticating guards
'guards' => [
'user' =>[
'driver' => 'session',
'provider' => 'user',
],
'admin' => [
'driver' => 'session',
'provider' => 'admin',
],
],
//User Providers
'providers' => [
'user' => [
'driver' => 'eloquent',
'model' => App\User::class,
],
'admin' => [
'driver' => 'eloquent',
'model' => App\Admin::class,
]
],
//Resetting Password
'passwords' => [
'clients' => [
'provider' => 'client',
'email' => 'auth.emails.password',
'table' => 'password_resets',
'expire' => 60,
],
'admins' => [
'provider' => 'admin',
'email' => 'auth.emails.password',
'table' => 'password_resets',
'expire' => 60,
],
],
route.php
Route::group(['middleware' => ['web']], function () {
//Login Routes...
Route::get('/admin/login','AdminAuth\[email protected]');
Route::post('/admin/login','AdminAuth\[email protected]');
Route::get('/admin/logout','AdminAuth\[email protected]');
// Registration Routes...
Route::get('admin/register', 'AdminAuth\[email protected]');
Route::post('admin/register', 'AdminAuth\[email protected]');
Route::get('/admin', '[email protected]');
});
AdminAuth/AuthController.php
Добавьте два метода и укажите $redirectTo
и $guard
protected $redirectTo = '/admin';
protected $guard = 'admin';
public function showLoginForm()
{
if (view()->exists('auth.authenticate')) {
return view('auth.authenticate');
}
return view('admin.auth.login');
}
public function showRegistrationForm()
{
return view('admin.auth.register');
}
это поможет вам открыть другую форму для входа в систему admin
создание промежуточного программного обеспечения для admin
class RedirectIfNotAdmin
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @param string|null $guard
* @return mixed
*/
public function handle($request, Closure $next, $guard = 'admin')
{
if (!Auth::guard($guard)->check()) {
return redirect('/');
}
return $next($request);
}
}
зарегистрировать промежуточное ПО в kernel.php
protected $routeMiddleware = [
'admin' => \App\Http\Middleware\RedirectIfNotAdmin::class,
];
используйте это промежуточное программное обеспечение в AdminController
например,
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Http\Requests;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Auth;
class AdminController extends Controller
{
public function __construct(){
$this->middleware('admin');
}
public function index(){
return view('admin.dashboard');
}
}
Чтобы все это работало, а также использовать json аутентифицированного администратора,
Auth::guard('admin')->user()
Мы можем получить доступ к аутентифицированному пользователю напрямую, используя
Auth::user()
, но если у вас есть две таблицы аутентификации, вы должны использовать
Auth::guard('guard_name')->user()
для выхода из системы
Auth::guard('guard_name')->user()->logout()
для аутентифицированного пользователя json
Auth::guard('guard_name')->user()
Надеюсь, что это поможет.
Ответ 6
Создайте модель таблицы таблиц менеджеров и администраторов. Эта модель должна расширять Illuminate\Foundation\Auth\User
В config/auth.php
,
Добавить в массив провайдеров:
'managers' => [
'driver' => 'eloquent',
'model' => App\Manager::class,
],
Добавить в массив охранников:
'web_manager' => [
'driver' => 'session',
'provider' => 'managers',
],
Тогда. в LoginController
(создайте его для менеджера, использующего php artisan make:auth
), используйте признак Illuminate\Foundation\Auth\AuthenticatesUsers
и
переопределить свойства защиты и перенаправления.
protected $redirectTo = 'redirect_path_after_manager_login';
protected function guard()
{
return Auth::guard('web_manager');
}
Модель менеджера аутентифицирована, и вы можете получить объект менеджера auuthenticated Auth::guard('web_manager')->user();
Ответ 7
Это может быть полезно для вашего требования (только для версии laravel 5.3 или выше).
Hesto MultiAuth для Laravel 5.3, 5.4, 5.5 (см. руководство по версии)