php 如何在 Laravel 5.2 中使用多重身份验证

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/34490600/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-26 00:02:33  来源:igfitidea点击:

How to use multi Auth in laravel 5.2

phplaravel-5

提问by Toàn Tam

Does anyone know how to use multi authenticate in laravel 5.2 !
I want to use It but I don't know how ?
does anyone has a tutorial or project setting up multi authentication?

有谁知道如何在 Laravel 5.2 中使用多重身份验证!
想用但是不知道怎么用?
有没有人有设置多重身份验证的教程或项目?

回答by Shoaib Rehan

You need two tables usersand adminsRun command following command to create built in auth

您需要两个表usersadmins运行命令以下命令来创建内置身份验证

php artisan make:auth

Two models Users(Already exist) and Admin

两种模型用户(已存在)和管理员

<?php

namespace App;

use Illuminate\Foundation\Auth\User as Authenticatable;

class Admin extends Authenticatable
{
 
}

Now open config/auth.php and make the following changes

现在打开 config/auth.php 并进行以下更改

'guards' => [
        'web' => [
            'driver' => 'session',
            'provider' => 'users',
        ],

        'admin' => [
            'driver' => 'session',
            'provider' => 'admins',
        ],
    ],

'providers' => [
        'users' => [
            'driver' => 'eloquent',
            'model' => App\User::class,
        ],

         'admins' => [
             'driver' => 'eloquent',
             'model' => App\Admin::class,
         ],
    ],

'passwords' => [
        'users' => [
            'provider' => 'users',
            'email' => 'auth.emails.password',
            'table' => 'password_resets',
            'expire' => 60,
        ],
  'admins' => [
            'provider' => 'admins',
            'email' => 'auth.emails.password',
            'table' => 'password_resets',
            'expire' => 60,
        ],
    ],

Create a new Middleware RedirectIfNotAdmin

创建一个新的中间件 RedirectIfNotAdmin

<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Support\Facades\Auth;

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('/admin/login');
  }
 
  return $next($request);
 }
}

Changes in Kernel.php

Kernel.php 中的变化

protected $middleware = [
        \Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,
  \Illuminate\Session\Middleware\StartSession::class,
        \Illuminate\View\Middleware\ShareErrorsFromSession::class,
 ];


protected $middlewareGroups = [
        'web' => [
            \App\Http\Middleware\EncryptCookies::class,
            \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
            //\Illuminate\Session\Middleware\StartSession::class,
            //\Illuminate\View\Middleware\ShareErrorsFromSession::class,
            \App\Http\Middleware\VerifyCsrfToken::class,
        ],
  
        'api' => [
            'throttle:60,1',
        ],
    ];


protected $routeMiddleware = [
        'auth' => \App\Http\Middleware\Authenticate::class,
        'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
        'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
        'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
  'admin' => \App\Http\Middleware\RedirectIfNotAdmin::class,
    ];

Create a new folder Http/Controller/Adminauth and copy the files from Http/Controller/Auth folder

创建一个新文件夹 Http/Controller/Adminauth 并从 Http/Controller/Auth 文件夹中复制文件

Open the file Http/Controller/Adminauth/AuthController.php and make the following changes

打开文件 Http/Controller/Adminauth/AuthController.php 并进行以下更改

<?php

namespace App\Http\Controllers\Adminauth;

use App\Admin;
use Validator;
use App\Http\Controllers\Controller;
use Illuminate\Foundation\Auth\ThrottlesLogins;
use Illuminate\Foundation\Auth\AuthenticatesAndRegistersUsers;
use Auth;

class AuthController extends Controller
{
    use AuthenticatesAndRegistersUsers, ThrottlesLogins;

    protected $redirectTo = '/admin';
 protected $guard = 'admin';
 
 public function showLoginForm()
 {
  if (Auth::guard('admin')->check())
  {
   return redirect('/admin');
  }
  
  return view('admin.auth.login');
 }
 
 public function showRegistrationForm()
 {
  return view('admin.auth.register');
 }
 
 public function resetPassword()
 {
  return view('admin.auth.passwords.email');
 }
 
 public function logout(){
  Auth::guard('admin')->logout();
  return redirect('/admin/login');
 }
}

Create new folder Http/Controller/admin, copy Controller.php file in the folder from Http/Controller/

新建文件夹Http/Controller/admin,从Http/Controller/复制文件夹中的Controller.php文件

create new file Http/Controller/admin/employee.php

创建新文件 Http/Controller/admin/employee.php

<?php

namespace App\Http\Controllers\admin;


use Illuminate\Http\Request;
use Illuminate\Routing\Controller;

use Auth;
use App\Admin;

class Employee extends Controller
{
 public function __construct(){
        $this->middleware('admin');
   }
 
 public function index(){
  return view('admin.home');
    }
}

move to resources/views create new folder resources/views/admin copy

移动到资源/视图创建新文件夹资源/视图/管理副本

resources/views/auth, resources/views/layouts & resources/views/home.blade.php

resources/views/auth, resources/views/layouts & resources/views/home.blade.php

and post into resources/views/adminand open the each file in admin folder and add admin before each path, Now the path should look like

并张贴resources/views/admin并打开 admin 文件夹中的每个文件,并在每个路径前添加 admin,现在路径应如下所示

@extends('admin.layouts.app')

@extends('admin.layouts.app')

and your Http/routes.php look like

和你的 Http/routes.php 看起来像

<?php
Route::get('/', function () {
    return view('welcome');
});

Route::get('/admin/login','Adminauth\AuthController@showLoginForm');
Route::post('/admin/login','Adminauth\AuthController@login');
Route::get('/admin/password/reset','Adminauth\PasswordController@resetPassword');

Route::group(['middleware' => ['admin']], function () {
    //Login Routes...
    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', 'Admin\Employee@index');
});



Route::group(['middleware' => 'web'], function () {
    Route::auth();
 Route::get('/home', 'HomeController@index');
 
 
});

Thats it open your site in browser and check and for admin yoursiteurl/admin

这就是它在浏览器中打开您的网站并检查和管理 yoursiteurl/admin

Enjoy....

享受....

回答by Hasmukh Tank

First, we create two models: user and admin

首先,我们创建两个模型:user 和 admin

Then, we update the config/auth.php file:

然后,我们更新 config/auth.php 文件:

return [
    'defaults' => [
        'guard' => 'user',
        'passwords' => 'user',
    ],

    'guards' => [
        'user' => [
            'driver' => 'session',
            'provider' => 'user',
        ],
        'admin' => [
            'driver' => 'session',
            'provider' => 'admin',
        ],
    ],
    'providers' => [
        'user' => [
            'driver' => 'eloquent',
            'model' => 'App\User',
        ],
        'admin' => [
            'driver' => 'eloquent',
            'model' => 'App\Admin',
        ],
    ],
    'passwords' => [
        'user' => [
            'provider' => 'user',
            'email' => 'auth.emails.password',
            'table' => 'password_resets',
            'expire' => 60,
        ],
        'admin' => [
            'provider' => 'admin',
            'email' => 'auth.emails.password',
            'table' => 'password_resets',
            'expire' => 60,
        ]
    ]
];

Now, modify the app/Http/kernel.php file:

现在,修改 app/Http/kernel.php 文件:

protected $middleware = [
    \Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,
    \Illuminate\Session\Middleware\StartSession::class,
    \Illuminate\View\Middleware\ShareErrorsFromSession::class
];

protected $middlewareGroups = [
    'web' => [
        \App\Http\Middleware\EncryptCookies::class,
        \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class      
    ],
    'api' => [
        'throttle:60,1',
    ],
];

Create LoginControllerand set the following code in it.

在其中创建LoginController并设置以下代码。

Note: You have to create login pages for 'user' as well as 'admin'. You then have to submit login form requests to the appropriate controller function i.e. userLogin()or adminLogin().

注意:您必须为“用户”和“管理员”创建登录页面。然后,您必须将登录表单请求提交给适当的控制器功能,即userLogin()adminLogin()

namespace App\Http\Controllers;

use Auth, Input;
use App\User;
use App\Admin;

class LoginController extends Controller
{
    public function userLogin(){
        $input = Input::all();
        if(count($input) > 0){
            $auth = auth()->guard('user');

            $credentials = [
                'email' =>  $input['email'],
                'password' =>  $input['password'],
            ];

            if ($auth->attempt($credentials)) {
                return redirect()->action('LoginController@profile');
            } else {
                echo 'Error';
            }
        } else {
            return view('user.login');
        }
    }

    public function adminLogin(){
        $input = Input::all();
        if(count($input) > 0){
            $auth = auth()->guard('admin');

            $credentials = [
                'email' =>  $input['email'],
                'password' =>  $input['password'],
            ];

            if ($auth->attempt($credentials)) {
                 return redirect()->action('LoginController@profile');                     
            } else {
                echo 'Error';
            }
        } else {
            return view('admin.login');
        }
    }

    public function profile(){
        if(auth()->guard('admin')->check()){
             pr(auth()->guard('admin')->user()->toArray());
        }         
        if(auth()->guard('user')->check()){
            pr(auth()->guard('user')->user()->toArray());
        } 
    }
}

回答by Thadeus Joseph

In most cases I just add a field to the user table called usertype and pass appropriate values like 0=admin, 1=user etc.

在大多数情况下,我只是在用户表中添加一个名为 usertype 的字段并传递适当的值,例如 0=admin、1=user 等。

This approach helps in avoiding the unnecessary headache of creating different user roles or types.

这种方法有助于避免不必要的创建不同用户角色或类型的麻烦。

Though this may not sound ideal, but helps in saving lots of time.

虽然这听起来可能并不理想,但有助于节省大量时间。