【问题标题】:How to perform multi auth in laravel?如何在 laravel 中执行多重身份验证?
【发布时间】:2017-06-01 04:11:00
【问题描述】:

我正在尝试在我的 Laravel 项目中执行多重身份验证。最初我把它给用户,然后生成令牌并且它工作正常。当我也添加员工时,不会为员工生成令牌。当我为用户删除时,现在员工正在工作,但两者都不起作用。

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

    'api' => [
        'driver' => 'token',
        'provider' => 'users',
        //'provider' => 'employees'
    ],
    'employees' => [
        'driver' => 'session',
        'provider' => 'employees',
    ],
],

谁能帮帮我。谢谢。

【问题讨论】:

    标签: php mysql authentication laravel-5 laravel-5.3


    【解决方案1】:

    在您的 auth.php 文件中,在 providers 数组中为定义的守卫添加提供者。

        'guards' => [
            'web' => [
                'driver' => 'session',
                'provider' => 'users',
                //'provider' => 'employees'
            ],
    
            'api' => [
                'driver' => 'token',
                'provider' => 'users',
                //'provider' => 'employees'
            ],
            'employees' => [
                'driver' => 'session',
                'provider' => 'employees',
            ],
        ],
    
    'providers' => [
        'users' => [
            'driver' => 'eloquent',
            'model' => App\User::class,
        ],
    
        'employees' => [
            'driver' => 'eloquent',
            'model' => App\Employees::class,
        ],
    
    ],
    

    如果您使用 2 种不同的模型进行身份验证,请执行上述操作。如果您使用相同的模型基于用户角色进行身份验证,请为员工和用户提供相同的模型。

    为员工登录创建路由。

    Route::get('/employee/login','Auth\EmployeeLoginController@showLoginForm')->name('employee.login');
    Route::post('/employee/login','Auth\EmployeeLoginController@login')->name('employee.login.submit');
    

    创建员工登录控制器

    <?php
    
    namespace App\Http\Controllers\Auth;
    
    use Illuminate\Http\Request;
    use App\Http\Controllers\Controller;
    use Auth;
    
        class EmployeeLoginController extends Controller
        {
            public function __construct()
            {
                $this->middleware('guest:employee');
            }
    
            public function showLoginForm()
            {
                return view('auth.employee-login');
            }
    
            public function login(Request $request)
            {
                // Validate the form data
                $this->validate($request, [
                    'email'   => 'required|email',
                    'password' => 'required|min:6'
                ]);
    
                // Attempt to log the user in
                if (Auth::guard('employee')->attempt(['email' => $request->email, 'password' => $request->password], $request->remember)) {
                    // if successful, then redirect to their intended location
                    return redirect()->intended(route('employee.Product.list'));
                }
    
                // if unsuccessful, then redirect back to the login with the form data
                return redirect()->back()->withInput($request->only('email'));
            }
        }
    

    如果您使用 2 种不同的型号,请执行上述操作。如果您使用相同的模型基于角色进行身份验证,只需在尝试方法中添加以下按角色检查

    attempt(['email' => $request->email, 'password' => $request->password, 'role' => 'employee'], $request->remember))
    

    然后在您的 app\Exception 文件夹中添加修改 handler.php 文件中未经身份验证的方法

    未认证的受保护函数($request, AuthenticationException $exception)

     {
            if ($request->expectsJson()) {
                return response()->json(['error' => 'Unauthenticated.'], 401);
            }
            $guard = array_get($exception->guards(),0);
    
            switch ($guard) {
                case 'admin':
                    $login = 'admin.login';
                    break;
                case 'employee':
                    $login = 'employee.login';
                    break;
                default:
                    $login = 'login';
                    break;
            }
            return redirect()->guest(route($login));
        }
    

    如果用户未通过身份验证,实际上你是 $login 变量被用来重定向到你想要的 url。

    最后在您的 app\middleware\RedirectIfAuthenticated.php 文件中删除句柄方法并添加以下内容。

     public function handle($request, Closure $next, $guard = null)
        {
            switch ($guard) {
                case 'admin':
                    if (Auth::guard($guard)->check()) {
                        return redirect()->route('admin.index');
                    }
                    break;
    
                case 'employee':
                    if (Auth::guard($guard)->check()) {
                        return redirect()->route('employee.dashboard');
                    }
                    break;
    
                default:
                    if (Auth::guard($guard)->check()) {
                        return redirect('/');
                    }
                    break;
            }
    
            return $next($request);
        }
    

    如果用户已通过身份验证,您将在此处重定向用户。

    为了更好地理解,请查看此视频。这适用于 5.3 和 5.4 它将帮助您了解所有这些工作原理。

    Youtube link

    【讨论】:

      猜你喜欢
      • 2021-02-08
      • 2020-04-24
      • 2018-07-21
      • 2018-10-17
      • 1970-01-01
      • 2021-11-27
      • 2016-12-19
      • 1970-01-01
      • 2019-05-14
      相关资源
      最近更新 更多