如何在 laravel 5.2 中使用多重身份验证 [关闭]

Posted

技术标签:

【中文标题】如何在 laravel 5.2 中使用多重身份验证 [关闭]【英文标题】:How to use multi Auth in laravel 5.2 [closed] 【发布时间】:2016-04-02 03:07:48 【问题描述】:

有谁知道如何在 laravel 5.2 中使用多重身份验证!我想使用它但我不知道如何? 有人有设置多重身份验证的教程或项目吗?

【问题讨论】:

Here's how to use 您是否尝试过进行更多身份验证?身份验证的基础是Auth::attempt 方法(阅读更多:laravel.com/docs/5.2/authentication#authenticating-users)。 @BasheerAhmed 我的意思是我想在 laravel 5.2 中使用 这将使您对如何开始有一个基本的了解.. @GrzegorzGajda 我是 laravel 的新手!我只知道如何使用默认用户身份验证!如果你已经完成了多重身份验证,你能给我一些示例项目吗? 【参考方案1】:

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

php artisan make:auth

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

<?php

namespace App;

use Illuminate\Foundation\Auth\User as Authenticatable;

class Admin extends Authenticatable

	

现在打开 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,
        ],
    ],

新建中间件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);
	

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,
    ];

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

打开文件 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');
	

新建文件夹Http/Controller/admin,从Http/Controller/复制文件夹中的Controller.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');
    

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

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

并发布到resources/views/admin 并打开 admin 文件夹中的每个文件并在每个路径前添加 admin,现在路径应该看起来像

@extends('admin.layouts.app')

你的 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');
	
	
);

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

享受....

【讨论】:

谢谢你,这太棒了,但我发现的一件事是“/admin/logout”路由被我在“web”中的“/”路由覆盖。这样它就直接重定向到“/”,而不是在“/admin/logout”中执行工作。这种行为有原因吗? 感谢您的精彩教程。唯一的问题是路由 Auth 默认用户是可见的,尽管此日志使用管理员。示例:我通过路由 admins/login 以管理员身份登录,但即使我可以看到 Laravel 默认用户的路径 /login ,反之亦然。因为我可以解决这个问题?来自智利的问候 我在调用 /admin/password/reset 时收到此错误“ResetsPasswords.php 第 252 行中的 ErrorException:App\Http\Controllers\Adminauth\PasswordController::resetPassword() 缺少参数 1” 【参考方案2】:

首先,我们创建两个模型:用户和管理员

然后,我们更新 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,
        ]
    ]
];

现在,修改 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',
    ],
];

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

注意:您必须为“用户”和“管理员”创建登录页面。然后,您必须将登录表单请求提交给适当的控制器函数,即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());
         
    

【讨论】:

如何在默认 AuthController 中使用多重身份验证。你能纠正我吗?我已经实现并且它对用户表工作正常,但是它从管理表验证管理员但没有为管理员创建会话。 ***.com/questions/34614753/… 我收到错误:身份验证用户提供程序 [] 未定义。 auth()-&gt;guard('admin')-&gt;user() 返回 null【参考方案3】:

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

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

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

【讨论】:

以上是关于如何在 laravel 5.2 中使用多重身份验证 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

我正在尝试为 user 和 admin 实现 laravel 5.2 多重身份验证。但是未定义身份验证用户提供程序 [] 错误给出

Laravel 5.2:如何在中间件中使用身份验证

laravel 4.2 如何检查是不是有用户登录多重身份验证

Laravel 5.2 需要一个实现默认身份验证驱动程序/“Multi-Auth”的示例。现在需要很多工作,因为[重复]

使用一张表 Laravel 5.4 进行多重身份验证

在AuthController中覆盖laravel的5.2身份验证方法