【问题标题】:How to use authentication on custom model in Laravel如何在 Laravel 中的自定义模型上使用身份验证
【发布时间】:2017-04-20 23:03:57
【问题描述】:

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

我在register 视图中选择选项,用于选择注册哪种类型的用户以便更好地控制控制器。

<select id="user_type" name="user_type">
  <option value="user">User</option>
  <option value="merchant">Merchant</option>
</select>

这是我为两种类型的用户修改的默认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'],
        ]);
       }

    }

}

提到register 函数默认不在register controller 中,所以我放了那个函数,因为我已经查看了该解决方案How to register more than one type of users and how to make multi auth in laravel 5.3 但我不知道如何修改它。

但现在的问题是我提交注册表后的身份验证。如果我注册新的user,它工作正常,但如果我注册merchant,它会将用户保存在数据库中,然后如果在users 中不存在任何user,它就不会登录商家桌子。但是,如果在我注册merchant 后,users 中已经存在任何user,它会登录在users 表中创建的最后一个user

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

谢谢!

更新:

注册函数

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());


    }

【问题讨论】:

  • 我更新了关于那个函数的问题

标签: laravel laravel-5


【解决方案1】:
  1. 转到/config/auth.php
  2. 查找数组的guards元素

    'guards' => [
        'web' => [
            'driver' => 'session',
            'provider' => 'users',
        ],
    
        'api' => [
            'driver' => 'passport',
            'provider' => 'users',
        ],
    ],
    
  3. merchant 添加到此数组中,provider 值为 merchants

    'guards' => [
        'web' => [
            'driver' => 'session',
            'provider' => 'users',
        ],
    
        'api' => [
            'driver' => 'passport',
            'provider' => 'users',
        ],
    
        'merchant' => [
            'driver' => 'session',
            'provider' => 'merchants',
        ],
    ],
    
  4. 现在找到此配置的providers 元素

    'providers' => [
        'users' => [
            'driver' => 'eloquent',
            'model' => App\User::class,
        ],
    ],
    
  5. 使用您的Merchant 模型的model 值添加merchants 提供程序

    'providers' => [
        'users' => [
            'driver' => 'eloquent',
            'model' => App\User::class,
        ],
    
        'merchants' => [
            'driver' => 'eloquent',
            'model' => App\Merchant::class,
        ],
    ],
    
  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());
}

你也可以使用包...

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

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

【讨论】:

  • 我几乎做到了,但现在我在注册功能中获得保护、对该功能的任何帮助或您是否还可以编辑该功能......谢谢您
  • @epowah 你应该尝试做这样的事情:
  • 我该怎么办?
  • $guard = $request-&gt;user_type == 'user' ? 'user' : 'merchant'; auth()-&gt;guard($guard)-&gt;login($user);
  • 我的意思是$guard = $request-&gt;user_type == 'user' ? 'web' : 'merchant';
【解决方案2】:

首先您需要在auth.php 处设置新的guard。并且当使用merchant 登录时更改保护方法,以便 Laravel 将查看商家而不是用户。

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

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

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

https://laravel.com/docs/5.3/authentication

【讨论】:

  • 我是只需要为商家添加guard,还是必须在auth.php中添加guardproviderpassword以及该功能在哪里?
  • 您需要在auth.php中设置provider、guards、重置密码(如果商家可以重置的话)
  • 是的,我明白了,但是你能用这段代码修改注册函数吗?我是 laravel 的新手
  • 请看我更新的注册功能,因为它不再工作了
  • $this-&gt;create 不会生效,因为它基本上是创建新的并且您调用另一个函数。对于auth()-&gt;login($user) 更改为$auth()-&gt;login($user)。如果你想自定义注册方法,我的偏好是,你为什么不从头开始创建它更容易。
猜你喜欢
  • 1970-01-01
  • 2019-09-05
  • 2019-07-01
  • 2015-02-23
  • 2020-11-10
  • 2020-04-24
  • 2021-01-09
  • 2014-03-30
相关资源
最近更新 更多