如何在Laravel中使用自定义模型的身份验证

Dev*_*sta 2 laravel laravel-5

我正在为laravel中的用户制作新的自定义模型.我正在使用User我将拥有的一种类型用户的默认laravel模型,以及Merchant其他类型用户的新模型.

我在register视图中选择选项以选择将注册哪种类型的用户以便在控制器中实现更好的控制.

<select id="user_type" name="user_type">
  <option value="user">User</option>
  <option value="merchant">Merchant</option>
</select>
Run Code Online (Sandbox Code Playgroud)

这是我修改了RegisterController两种类型用户的默认值:

<?php

namespace App\Http\Controllers\Auth;

use App\User;
use App\Merchant;
use Validator;
use App\Http\Controllers\Controller;
use Illuminate\Foundation\Auth\RegistersUsers;

use Illuminate\Http\Request;
use App\Http\Requests;
use Auth;

class RegisterController 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 login / registration.
     *
     * @var string
     */
    protected $redirectTo = '/index';

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

    /**
     * Get a validator for an incoming registration request.
     *
     * @param  array  $data
     * @return \Illuminate\Contracts\Validation\Validator
     */
    public function register(Request $request)
    {
        $validator = $this->validator($request->all());

        if ($validator->fails()) {
            $this->throwValidationException(
                $request, $validator
            );
        }

        //Add custom code here
        $new_user = $this->create($request->all());
        //Add custom code here

        Auth::guard($this->getGuard())->login($new_user);

        return redirect($this->redirectPath());
    }

    protected function validator(array $data)
    {
        if($data['user_type']=='user'){
            return Validator::make($data, [
            'name' => 'required|max:255',
            'email' => 'required|email|max:255|unique:users',
            'password' => 'required|min:6|confirmed',
            'first_name' => 'required|max:255',
            'last_name' => 'required|max:255',
            'user_type' =>'required'
        ]);
        }else{
            return Validator::make($data, [
            'name' => 'required|max:255',
            'email' => 'required|email|max:255|unique:users',
            'password' => 'required|min:6|confirmed',
            'first_name' => 'required|max:255',
            'last_name' => 'required|max:255',
            'user_type' =>'required'
           ]);
        }
    }

    /**
     * Create a new user instance after a valid registration.
     *
     * @param  array  $data
     * @return User
     */
    protected function create(array $data)
    {
        if($data['user_type']=='user'){
            return User::create([
            'name' => $data['name'],
            'email' => $data['email'],
            'password' => bcrypt($data['password']),
            'first_name' => $data['first_name'],
            'last_name' => $data['last_name'],
        ]);
       }else{
           return Merchant::create([
            'name' => $data['name'],
            'email' => $data['email'],
            'password' => bcrypt($data['password']),
            'first_name' => $data['first_name'],
            'last_name' => $data['last_name'],
        ]);
       }

    }

}
Run Code Online (Sandbox Code Playgroud)

要提到该register功能不是默认的register controller,所以我把这个功能,因为我已经查看了该解决方案如何注册多个类型的用户以及如何在laravel 5.3中进行多个auth,但我不知道如何修改它.

但现在的问题是我提交注册表后的身份验证.如果我注册新的user它工作正常,但如果我注册merchant它将用户保存在数据库中,之后它不会登录商家,如果表中没有任何user一个users.但是如果它已经存在user,那么users在我注册之后merchant它会记录userusers表格中创建的最后一个.

所以我的问题是如何修改商家用户的身份验证.

谢谢!

更新:

注册功能

public function register(Request $request)
    {
         if($request->user_type =='user'){
                $auth = auth()->guard();
            } else{
                $auth = auth()->guard('merchant');
            }

            $user = $this->create($request->all());
            auth()->login($user);

            return redirect($this->redirectPath());


    }
Run Code Online (Sandbox Code Playgroud)

Art*_*vič 9

  1. /config/auth.php
  2. 查找guards数组的元素

    'guards' => [
        'web' => [
            'driver' => 'session',
            'provider' => 'users',
        ],
    
        'api' => [
            'driver' => 'passport',
            'provider' => 'users',
        ],
    ],
    
    Run Code Online (Sandbox Code Playgroud)
  3. merchant为此数组添加一个provider值为.的守卫merchants

    'guards' => [
        'web' => [
            'driver' => 'session',
            'provider' => 'users',
        ],
    
        'api' => [
            'driver' => 'passport',
            'provider' => 'users',
        ],
    
        'merchant' => [
            'driver' => 'session',
            'provider' => 'merchants',
        ],
    ],
    
    Run Code Online (Sandbox Code Playgroud)
  4. 现在找到providers这个配置的元素

    'providers' => [
        'users' => [
            'driver' => 'eloquent',
            'model' => App\User::class,
        ],
    ],
    
    Run Code Online (Sandbox Code Playgroud)
  5. 添加merchants具有模型model值的提供程序Merchant

    'providers' => [
        'users' => [
            'driver' => 'eloquent',
            'model' => App\User::class,
        ],
    
        'merchants' => [
            'driver' => 'eloquent',
            'model' => App\Merchant::class,
        ],
    ],
    
    Run Code Online (Sandbox Code Playgroud)
  6. 现在,您只需通过guard('web')和商家用户对普通用户进行身份验证即可guard('merchant')

并为您注册功能

public function register(Request $request)
{
    $guard = $request->user_type == 'user' ? 'web' : 'merchant';
    $user  = $this->create($request->all());

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

    return redirect($this->redirectPath());
}
Run Code Online (Sandbox Code Playgroud)

你也可以使用包...

例如,有一个很棒的软件包:https://github.com/Sarav-S/Laravel-Multiauth

它将帮助您处理所有困难的事情.