mpyw/scoped-auth is a Laravel package for apply specific scope for user authentication..
It currently has 11 GitHub stars and 81.013 downloads on Packagist (latest version v2.1.1).
Install it with composer require mpyw/scoped-auth.
Discover more Laravel packages by mpyw
or browse all Laravel packages to compare alternatives.
Last updated
Apply specific scope for user authentication.
^8.2^11.0 || ^12.0 || ^13.0 || ^14.0[!NOTE] Older versions have outdated dependency requirements. If you cannot prepare the latest environment, please refer to past releases.
Via Composer
$ composer require mpyw/scoped-auth
[!NOTE] The issue where
RedirectIfTwoFactorAuthenticatablebypassed customUserProviderimplementations has been fixed in Fortify v1.33.0 (PR #582). If you're using Fortify v1.33.0 or later, no workaround is needed.
Default Fortify's RedirectIfTwoFactorAuthenticatable implementation directly uses internal Model under UserProvider. So we need to configure Fortify like this:
CustomFortifyAuthenticator.php
<?php
namespace App\Auth;
use Illuminate\Http\Request;
use Illuminate\Contracts\Auth\Authenticatable;
use Illuminate\Contracts\Auth\StatefulGuard;
use Illuminate\Contracts\Auth\UserProvider;
use Laravel\Fortify\Fortify;
class CustomFortifyAuthenticator
{
private const PASSWORD_NAME = 'password';
private readonly UserProvider $provider;
public function __construct(StatefulGuard $guard)
{
// Assert `StatefulGuard` has `getProvider()` which is not declared in the contract
assert(method_exists($guard, 'getProvider'));
$provider = $guard->getProvider();
assert($provider instanceof UserProvider);
$this->provider = $provider;
}
public function __invoke(Request $request): ?Authenticatable
{
$user = $this->provider->retrieveByCredentials([
Fortify::username() => $request->input(Fortify::username()),
]);
return $user && $this->provider->validateCredentials($user, [
self::PASSWORD_NAME => $request->input(self::PASSWORD_NAME),
]) ? $user : null;
}
}
AuthServiceProvider.php
<?php
namespace App\Providers;
use App\Auth\CustomFortifyAuthenticator;
use Illuminate\Support\ServiceProvider;
use Laravel\Fortify\Fortify;
class AuthServiceProvider extends ServiceProvider
{
public function boot(CustomFortifyAuthenticator $authenticator): void
{
Fortify::authenticateUsing($authenticator);
}
}
Via PHPUnit
$ composer test
Implement AuthScopable contract on your Authenticatable Eloquent Model.
<?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('active', 1);
}
}
<?php
use Illuminate\Support\Facades\Auth;
$user = Auth::user(); // Only include users where "active" is 1
Note that you can reuse another existing scope.
public function scopeActive(Builder $query): Builder
{
return $query->where('active', 1);
}
public function scopeForAuthentication(Builder $query): Builder
{
return $this->scopeActive($query);
}
As a by-product, you can also run scope queries based on the standard Eloquent way.
$user = User::where('email', '[email protected]')->forAuthentication()->firstOrFail();
$user = User::where('email', '[email protected]')->scopes(['forAuthentication'])->firstOrFail();
Licensed under the MIT License. See License File for more information.