Search by

bbs-lab / laravel-force-two-factor

Kezhomikaelpopowicz

Admin-panel-agnostic core for forcing two-factor authentication in any Laravel app: a shared bypass registry (compose several "skip 2FA" reasons) that the nova-force-two-factor and filament-force-two-factor adapters enforce.

Package info

github.com/BBS-Lab/laravel-force-two-factor

pkg:composer/bbs-lab/laravel-force-two-factor

Statistics

Installs: 60

Dependents: 4

Suggesters: 0

Stars: 0

Open Issues: 0

v1.0.0 2026-09-24 10:04 UTC

This package is auto-updated.

Last update: 2026-09-24 12:55:46 UTC


README

Tests PHPStan

Admin-panel-agnostic core for forcing two-factor authentication in any Laravel app. It ships the shared bypass registry that lets several independent reasons to skip forced 2FA compose cleanly, and that the adapters enforce:

You usually install an adapter, which pulls this package in automatically. Install it directly only when you build your own enforcement middleware.

composer require bbs-lab/laravel-force-two-factor

Why a shared registry?

A panel can only wire one "force 2FA" gate, but several packages have a legitimate reason to let a user skip it — e.g. SSO users (their MFA is handled by the identity provider) and users who still owe a forced password rotation (they must change their password first). Each reason registers a callback here; the gate bypasses as soon as any returns true. Nova and Filament read the same registry, so a reason registered once applies to whichever panel enforces 2FA.

Registering a bypass

Callbacks live in code (never in the config file — a Closure cannot be config:cached), so register them in a service provider's boot():

use BBSLab\LaravelForceTwoFactor\Facades\ForceTwoFactor;
use Illuminate\Contracts\Auth\Authenticatable;
use Illuminate\Http\Request;

ForceTwoFactor::bypass(function (Request $request, Authenticatable $user): bool {
    return $request->hasSession()
        && $request->session()->get('okta_authenticated') === true;
});

The sibling packages register their own bypass automatically when this package is present:

  • bbs-lab/laravel-okta — skips forced 2FA for users authenticated via Okta (okta_authenticated).
  • bbs-lab/laravel-password-rotation — skips forced 2FA while a user still owes a forced password rotation, so the rotation happens first.

Configuration

// config/laravel-force-two-factor.php
return [
    'enabled' => (bool) env('FORCE_TWO_FACTOR_ENABLED', true),
];

enabled is the master switch shared by every adapter. Publish it with:

php artisan vendor:publish --tag=laravel-force-two-factor-config

Testing

composer test

License

MIT. See LICENSE.md.