Laravel Global Scope Auth

Я создал анонимную глобальную область в модели пользователей, как показано ниже, чтобы получить только общедоступных пользователей во внешнем интерфейсе:

protected static function boot()
{
    parent::boot();

    static::addGlobalScope('is_public', function(Builder $builder) {
        $builder->where('is_public', '=', 1);
    });
}

Но... когда мне нужно выполнить вход в бэкэнд, мне, конечно, нужно проверить не публичных пользователей, поэтому мне нужно исключить глобальную область видимости.

Это возможно с помощью AuthController по умолчанию laravel?

Большое спасибо!!

2 ответа

Вам просто нужно создать две модели - одну без глобальной области видимости (т.е. AuthUser), а другую с глобальной областью действия, которая расширяет первую (т. Е. Пользователя).

Тогда вы можете использовать AuthUser для аутентификации и пользователя везде.

Вы можете удалить любую глобальную область на лету с помощью следующего метода:

User::withoutGlobalScope('is_public')->get();

Либо создавая две отдельные модели, я бы предпочел поставить условие на глобальную область видимости, потому что если вы хотите получить доступ к методам отношений из обеих моделей, вам необходимо включить эти методы в обе модели, либо вам нужно расширить одну модель на другую. Я считаю, что это не лучшее решение.

создать новый файл для глобальной области:

<?php

namespace App\Scopes;

use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Scope;
use Illuminate\Support\Facades\Auth;

class IsPublicScope implements Scope
{
    public function apply(Builder $builder, Model $model)
    {
        if (Auth::hasUser()) {
            $builder->where('is_public', '=', 1);
        }
    }
    }
?>

и добавьте этот метод в свою модель пользователя:

protected static function boot()
{
    parent::boot();
    static::addGlobalScope(new IsPublicScope());
}

Спасибо @mpyw за исправление.

Я решил это, создав новый пакет.

mpyw / scoped-auth: применить определенную область для аутентификации пользователя.

Бегать composer require mpyw/scoped-auth и измените свою модель пользователя следующим образом:

<?php

namespace App;

use Illuminate\Auth\Authenticatable;
use Illuminate\Contracts\Auth\Authenticatable as UserContract;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Model;
use Mpyw\ScopedAuth\AuthScopable;

class User extends Model implements UserContract, AuthScopable
{
    use Authenticatable;

    public function scopeForAuthentication(Builder $query): Builder
    {
        return $query->where('is_public', '=', 1);
    }
}

Вот и все.

Другие вопросы по тегам