laravel 我可以在一个型号中使用两个防护装置吗?

jv4diomz  于 2023-03-13  发布在  其他
关注(0)|答案(2)|浏览(142)

我需要使用一个模型以两种不同的方式对用户进行身份验证。是否可以定义两个防护并选择更好的一个,例如在控制器级别?
另外,也许有一个更好的方法来实现这一点使用laravel?将感谢任何想法。

6tr1vspr

6tr1vspr1#

是的,这是可能的。2你应该创建两个不同的LoginControllers和指定的路由,创建两个不同的Auth中间件,可能还要稍微修改一下RedirectIfAuthenticated中间件。
在这两个LoginController中,您应该像这样定义您的保护:

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

如果您希望为您的防护设备分离路由,而不是在RedirectIfAuthenticated Middleware中,您应该为两个防护设备定义重定向

public function handle($request, Closure $next, $guard = null)
{
    if (Auth::guard($guard)->check()) {

        if($guard == 'admin') return redirect('/admin');
        return redirect('/');
    }

    return $next($request);
}
gr8qqesn

gr8qqesn2#

在Laravel的一个型号中使用两个防护装置

首先,您需要在config/auth.php文件中定义保护。例如,假设您要定义两个保护:customeradmin。可以按如下方式定义它们:

'guards' => [
    'customer' => [
        'driver' => 'session',
        'provider' => 'customers',
    ],

    'admin' => [
        'driver' => 'session',
        'provider' => 'admins',
    ],
],

接下来,需要为每个guard定义providers
提供程序负责从数据库中检索用户。
可以在同一个config/auth.php文件中定义它们,如下所示:

'providers' => [
    'customers' => [
        'driver' => 'eloquent',
        'model' => App\Models\User::class,
        'table' => 'users',
        'where' => [
            ['role', '=', 'customer'],
        ],
    ],

    'admins' => [
        'driver' => 'eloquent',
        'model' => App\Models\User::class,
        'table' => 'users',
        'where' => [
            ['role', '=', 'admin'],
        ],
    ],
],

请注意,我们对两个guard使用相同的User modelusers table,但我们根据用户的role column筛选用户。
最后,您需要更新您的User模型以使用Authenticatable trait,并为每个模型示例指定guard。下面是一个用户模型的示例:

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
use Illuminate\Support\Facades\Auth;

class User extends Authenticatable
{
    use HasFactory, Notifiable;

    protected $guarded = [];

    protected $hidden = [
        'password',
        'remember_token',
    ];

    protected $casts = [
        'email_verified_at' => 'datetime',
    ];

    public function isAdmin()
    {
        return Auth::guard('admin')->check();
    }

    public function isCustomer()
    {
        return Auth::guard('customer')->check();
    }

    public function guard()
    {
        if ($this->isAdmin()) {
            return 'admin';
        }

        return 'customer';
    }
}

在本例中,我们添加了两个方法来检查用户是否属于某个特定的守卫(isAdmin()isCustomer()),以及一个guard()方法来为每个模型示例指定守卫。
现在可以使用auth()->guard('customer')->attempt($credentials)auth()->guard('admin')->attempt($credentials)方法验证用户,使用auth()->guard('customer')->user()auth()->guard('admin')->user()方法检索已验证的用户。

相关问题