我已在用户模型中创建了一个anonimus全局范围,如下所示,以便只获取前端的公共用户:
protected static function boot()
{
parent::boot();
static::addGlobalScope('is_public', function(Builder $builder) {
$builder->where('is_public', '=', 1);
});
}
但是......当我需要在后端执行登录时,我当然需要检查非公共用户,所以我需要排除全局范围。
这是否可以使用laravel的默认AuthController?
非常感谢!!
答案 0 :(得分:4)
您只需要创建两个模型 - 一个没有全局范围(即AuthUser),另一个具有扩展第一个模型的全局范围(即用户)。
然后您可以在其他地方使用AuthUser进行身份验证和用户。
答案 1 :(得分:0)
您可以使用以下方法动态删除任何全局范围:
User::withoutGlobalScope('is_public')->get();
答案 2 :(得分:0)
我通过创建新软件包来解决它。
mpyw/scoped-auth: Apply specific scope for user authentication.
运行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);
}
}
就这些。
答案 3 :(得分:0)
要么创建两个单独的模型,要么将条件放在全局范围内,因为如果要从两个模型访问关系方法,则需要在两个模型中都包含这些方法,或者必须将一个模型扩展到另一个模型。我认为这不是一个好的解决方案。
为全局范围创建新文件:
<?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进行更正。