As I know Auth::attempt is used to authenticate users from users table, but i want to authenticate another users from managers table and admin from admins table. I know there are laravel-multiauth plugin already exist. But can we create our own AuthServiceProvider for authenticating users from multiple tables..?
6 Answers
Answers 1
Try my idea if you want to. I'm expecting that different table has different users. Because it won't work if you have the same user in other tables.
- Choose your priority table (e.g. users)
- Add the condition
if(Auth::user(attempt(...))elseif(Auth::manager(attempt(...))elseif(Auth::admins(attempt(...)))
Note: Your priority table here is users, then if the user doesn't exists in that table, it will try the managers table, then if still doesn't exists, it will check the admins table, otherwise (use else) return a message error.
Other option:
Other option is to use this package sarav/laravel-multiauth. You can follow this thread. How to use authentication for multiple tables in Laravel 5 for more information.
More Reference:
Can anyone explain Laravel 5.2 Multi Auth with example
https://laracasts.com/discuss/channels/laravel/52-auth-multiple-tables?page=1
Answers 2
You could setup multiple authentication guards, with each one having a different provider. The providers define the table or model to be used.
In config/auth.php you setup the providers as follows and you also setup corresponding guards for each of those providers:
'providers' => [ 'users' => [ 'driver' => 'eloquent', 'model' => App\User::class, ], 'managers' => [ 'driver' => 'eloquent', 'model' => App\Manager::class, ], 'admins' => [ 'driver' => 'eloquent', 'model' => App\Admin::class, ] ] Then you can authenticate like this:
Auth::attempt($credentials) // use default guard for simple users Auth::guard('manager')->attempt($credentials) Auth::guard('admin')->attempt($credentials) Check out the docs here.
Answers 3
Implement Multi Auth in Larvel 5.2
I'm considering two tables admin and users
Laravel 5.2 has a new artisan command.
php artisan make:auth it will generate basic login/register route, view and controller for user table.
Make a admin table as users table for simplicity.
Controller For Admin
app/Http/Controllers/AdminAuth/AuthController app/Http/Controllers/AdminAuth/PasswordController (note: I just copied these files from app/Http/Controllers/Auth/AuthController here)
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\AuthController@showLoginForm'); Route::post('/admin/login','AdminAuth\AuthController@login'); Route::get('/admin/logout','AdminAuth\AuthController@logout'); // Registration Routes... Route::get('admin/register', 'AdminAuth\AuthController@showRegistrationForm'); Route::post('admin/register', 'AdminAuth\AuthController@register'); Route::get('/admin', 'AdminController@index'); }); AdminAuth/AuthController.php
Add two methods and specify $redirectTo and $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'); } it will help you to open another login form for admin
creating a middleware for 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); } } register middleware in kernel.php
protected $routeMiddleware = [ 'admin' => \App\Http\Middleware\RedirectIfNotAdmin::class, ]; use this middleware in AdminController e.g.,
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'); } } That's all needed to make it working and also to get json of authenticated admin use
Auth::guard('admin')->user() We can access authenticated user directly using
Auth::user() but if you have two authentication table then you have to use
Auth::guard('guard_name')->user() for logout
Auth::guard('guard_name')->user()->logout() for authenticated user json
Auth::guard('guard_name')->user() Hope this helps.
Answers 4
I just done this in my project for two tables namely users and admin but you can do the same for more than two table.
Let's have a look
How to create our own AuthServiceProvider for authenticating users from multiple tables
I have two table admin and users
first of create basic login/register route, view and controller for user table by using Laravel 5.2 artisan command.
php artisan make:auth
Lets make a admin table as users table.
Controller For Admin Part
app/Http/Controllers/AdminAuth/AuthController
app/Http/Controllers/AdminAuth/PasswordController
(Just copied these files from app/Http/Controllers/Auth/AuthController here)
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\AuthController@loginPage'); Route::post('/admin/login','AdminAuth\AuthController@login'); Route::get('/admin/logout','AdminAuth\AuthController@logout'); // Registration Routes... Route::get('admin/register', 'AdminAuth\AuthController@registrationPage'); Route::post('admin/register', 'AdminAuth\AuthController@register'); Route::get('/admin', 'AdminController@index'); }); AdminAuth/AuthController.php
Add two methods and specify $redirectTo and $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'); } it will help you to open another login form for admin
creating a middleware for 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); } }
register middleware in kernel.php
protected $routeMiddleware = [ 'admin' => \App\Http\Middleware\RedirectIfNotAdmin::class, ]; use this middleware in AdminController e.g.,
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'); } } Authentication
We can access authenticated user directly using
Auth::user() but if you have two authentication table then you have to use
Auth::guard('guard_name')->user() Like
Auth::guard('admin')->user()
And also for reference check this https://laracasts.com/discuss/channels/laravel/52-auth-multiple-tables?page=1
Answers 5
First create Admin Authenticatable in 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; } Then create Admin Model by extending 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', ]; } After that you need to modify config/auth.php like below Add in providers array
'admins' => [ 'driver' => 'eloquent', 'model' => App\Admin::class, ], and Add in guards array.
'user' => [ 'driver' => 'session', 'provider' => 'users', ], 'admin' => [ 'driver' => 'session', 'provider' => 'admins', ], Now to authenticate from user table
if (Auth::guard('user')->attempt(['email' => $email, 'password' => $password])) { $details = Auth::guard('user')->user(); $user = $details['original']; return $user; } else { return 'auth fail'; } Uthenticate from Admin table
if (Auth::guard('admin')->attempt(['email' => $email, 'password' => $password])) { $details = Auth::guard('admin')->user(); $user = $details['original']; return $user; } else { return 'auth fail'; } Answers 6
Create a model for managers table and admins table. This model should extend Illuminate\Foundation\Auth\User
In config/auth.php,
Add to the providers array:
'managers' => [ 'driver' => 'eloquent', 'model' => App\Manager::class, ], Add to the guards array:
'web_manager' => [ 'driver' => 'session', 'provider' => 'managers', ], Then. in LoginController (create one for manager using php artisan make:auth) use the trait Illuminate\Foundation\Auth\AuthenticatesUsers and override guard and redirect properties.
protected $redirectTo = 'redirect_path_after_manager_login'; protected function guard() { return Auth::guard('web_manager'); } The manager model is authenticated and you can get the auuthenticated manager's object Auth::guard('web_manager')->user();
0 comments:
Post a Comment