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);
}
}
Вот и все.