Laravel Global Scope Auth

时间:2016-01-09 16:45:15

标签: laravel authentication scopes

我已在用户模型中创建了一个anonimus全局范围,如下所示,以便只获取前端的公共用户:

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

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

但是......当我需要在后端执行登录时,我当然需要检查非公共用户,所以我需要排除全局范围。

这是否可以使用laravel的默认AuthController?

非常感谢!!

4 个答案:

答案 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进行更正。