【问题标题】:multi authentication system in laravellaravel 中的多重认证系统
【发布时间】:2020-02-08 11:19:47
【问题描述】:

我在 laravel 中创建多重身份验证系统,我为每个实体创建了两个单独的表,一切正常,但注册后我只面临一个问题,使用 web Guard 的用户可以自动登录并重定向到用户仪表板很完美,但是如果其他用户使用不同的后卫,当他们完成注册过程时,他们无法自动登录系统。

所以我的问题是如何在其他用户类型完成注册步骤后启用自动登录过程?下面是我在项目中使用的代码

路由文件

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

Auth::routes();

Auth::routes(['verify' => true]);

Route::get('/home', 'HomeController@index')->name('home')->middleware('verified');

Route::get('/seller/dashboard', 'SellerHomeController@index')->name('seller.dashboard');
Route::get('/seller/login','Auth\Seller\SellerLoginController@showLoginForm')->name('seller.login');
Route::post('/seller/login','Auth\Seller\SellerLoginController@login');
Route::post('/seller/logout','Auth\Seller\SellerLoginController@logout')->name('seller.logout');
Route::post('/seller/password/email','Auth\Seller\SellerForgotPasswordController@sendResetLinkEmail')->name('seller.password.email');
Route::get('/seller/password/reset', 'Auth\Seller\SellerForgotPasswordController@showLinkRequestForm')->name('seller.password.request');
Route::post('/seller/password/reset','Auth\Seller\SellerResetPasswordController@reset')->name('seller.password.update');
Route::get('/seller/password/reset/{token}', 'Auth\Seller\SellerResetPasswordController@showResetForm')->name('seller.password.reset');
Route::get('/seller/register','Auth\Seller\SellerRegisterController@showRegistrationForm')->name('seller.register');
Route::post('/seller/register','Auth\Seller\SellerRegisterController@register');

SellerLoginController

namespace App\Http\Controllers\Auth\Seller;

use App\Http\Controllers\Controller;
use Illuminate\Foundation\Auth\AuthenticatesUsers;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;

class SellerLoginController extends Controller
{
    /*
    |--------------------------------------------------------------------------
    | Login Controller
    |--------------------------------------------------------------------------
    |
    | This controller handles authenticating users for the application and
    | redirecting them to your home screen. The controller uses a trait
    | to conveniently provide its functionality to your applications.
    |
    */

    use AuthenticatesUsers;

    /**
     * Where to redirect users after login.
     *
     * @var string
     */
    protected $redirectTo = '/seller/dashboard';

    /**
     * Create a new controller instance.
     *
     * @return void
     */
    public function __construct()
    {
        $this->middleware('guest:seller')->except('logout');
    }

    public function showLoginForm()
    {

        return view('auth.seller.login');
    }

    protected function attemptLogin(Request $request)
    {
        return $this->guard('seller')->attempt(
            $this->credentials($request), $request->filled('remember')
        );
    }

    protected function guard()
    {
        return Auth::guard('seller');
    }
}

SellerRegisterController

namespace App\Http\Controllers\Auth\Seller;

use App\Seller;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Validator;
use Illuminate\Foundation\Auth\RegistersUsers;
use Illuminate\Auth\Events\Registered;

class SellerRegisterController extends Controller
{
    /*
    |--------------------------------------------------------------------------
    | Register Controller
    |--------------------------------------------------------------------------
    |
    | This controller handles the registration of new users as well as their
    | validation and creation. By default this controller uses a trait to
    | provide this functionality without requiring any additional code.
    |
    */

    use RegistersUsers;

    /**
     * Where to redirect users after registration.
     *
     * @var string
     */
    protected $redirectTo = '/seller/dashboard';

    /**
     * Create a new controller instance.
     *
     * @return void
     */
    public function __construct()
    {
        $this->middleware('guest:seller');
    }

    public function showRegistrationForm()
    {
        return view('auth.seller.register');
    }

    /**
     * Get a validator for an incoming registration request.
     *
     * @param  array  $data
     * @return \Illuminate\Contracts\Validation\Validator
     */
    protected function validator(array $data)
    {
        return Validator::make($data, [
            'firstname' => ['required', 'string', 'max:255'],
            'lastname' => ['required', 'string', 'max:255'],
            'email' => ['required', 'string', 'email', 'max:255', 'unique:sellers'],
            'business_name' => ['required', 'string', 'max:255'],
            'business_description' => ['required', 'string', 'max:255'],
            'business_location' => ['required', 'string', 'max:255'],
            'business_website' => ['required', 'string', 'max:255'],
            'password' => ['required', 'string', 'min:6', 'confirmed'],

        ]);
    }

    /**
     * Create a new user instance after a valid registration.
     *
     * @param  array  $data
     * @return \App\User
     */
    protected function create(array $data)
    {
        $seller =  Seller::create([
            'firstname' => $data['firstname'],
            'lastname' => $data['lastname'],
            'email' => $data['email'],
            'business_name' => $data['business_name'],
            'business_description' => $data['business_description'],
            'business_location' => $data['business_location'],
            'business_website' => $data['business_website'],
            'business_logo' => 'test_logo.jpg',
            'password' => Hash::make($data['password']),
            'user_type' => $data['user_type'],
        ]);
       return $seller;
    }
}// code end here

【问题讨论】:

  • 您也应该发布您的身份验证提供程序配置和中间件
  • 'guards' => [ 'web' => [ 'driver' => 'session', 'provider' => 'users', ], 'seller' => [ 'driver' = > 'session', 'provider' => 'sellers', ], ], 'providers' => [ 'users' => [ 'driver' => 'eloquent', 'model' => App\User::class , ], 'sellers' => [ 'driver' => 'eloquent', 'model' => App\Seller::class, ], ],

标签: laravel


【解决方案1】:

发生这种情况是因为您没有在SellerRegisterController 上定义guard 方法,并且默认实现检索默认驱动程序(即web)。

该保护方法为RegistersUsersregister方法中的自动登录过程提供保护:

$this->guard()->login($user);

您必须在 SellerRegisterController 类中重写 guard 方法以返回正确的驱动程序并允许 trait 在正确的 sellers 驱动程序上执行登录过程:

/**
 * Get the guard to be used during registration.
 *
 * @return \Illuminate\Contracts\Auth\StatefulGuard
 */
protected function guard()
{
    return Auth::guard('sellers');
}

【讨论】:

    【解决方案2】:

    Laravel Auth 默认以 User 表为主要数据。如果您想进行多重身份验证,您需要做的第一件事是创建一个具有 Notifiable trait 的模型

    型号

    class Admin extends Authenticatable
    {
       use Notifiable;
    }
    

    之后,你需要在config/auth.php创建守卫和提供者 像这样的例子

    <?php
    
    [...]
    'guards' => [
        [...]
        'admin' => [
            'driver' => 'session',
            'provider' => 'admins',
        ],
        'writer' => [
            'driver' => 'session',
            'provider' => 'writers',
        ],
    ],
    [...]
    

    [...]
    'providers' => [
        [...]
        'admins' => [
            'driver' => 'eloquent',
            'model' => App\Admin::class,
        ],
        'writers' => [
            'driver' => 'eloquent',
            'model' => App\Writer::class,
        ],
    ],
    [...]
    

    在登录控制器中,您需要通过执行此行来检查哪个守卫正在尝试登录

    Auth::guard('admin')->attempt(['email' => $request->email, 'password' => $request->password], $request->get('remember'))
    

    如果您需要有关它的更多详细信息,请尝试阅读此https://pusher.com/tutorials/multiple-authentication-guards-laravel

    【讨论】:

    • 是的,我使用的模式与您提到的相同,但问题是,在注册后,我面临着将作者或管理员重定向到仪表板页面。所以我想,如果有人注册为作家,那么在注册过程之后的下一步,作家应该自动登录,而不是使用作家登录页面手动登录,我不知道为什么会这样,而在默认用户表,用户完成注册后自动登录。
    【解决方案3】:
    // Adminmiddleware
     if(Auth::check() && Auth::user()->role->id == 1)
          {
            return $next($request);
          }else {
            return redirect()->route('login');
          }
    
    //  Authormiddleware
     if(Auth::check() && Auth::user()->role->id == 2 )
          {
            return $next($request);
          }else {
            return redirect()->route('login');
          }
    
    // Admin Route
    Route::group(['as'=>'admin.','prefix'=>'admin','namespace'=>'Admin','middleware'=>['auth','admin']], function (){
        Route::get('dashboard','DashboardController@index')->name('dashboard');
    
    
    });
    // Auhtor Route
    Route::group(['as'=>'user.','prefix'=>'user','namespace'=>'Author','middleware'=>['auth','user']], function (){
        Route::get('dashboard','DashboardController@index')->name('dashboard');
    });
    
    // only auht route
    Route::group(['middleware'=>['auth']], function(){
        Route::post('favorite/{post}/add','FavoriteController@add')->name('post.favorite');
        Route::post('review/{id}/add','ReviewController@review')->name('review');
        Route::get('file-download/{id}', 'PostController@downloadproject')->name('project.download');
        Route::post('file-download/{id}', 'PostController@downloadproject');
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-03-23
      • 1970-01-01
      • 2011-10-25
      • 2017-12-02
      • 2020-05-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多