master

laravel/framework

Last updated at: 29/12/2023 09:20

AuthServiceProvider.php

TLDR

This file is the AuthServiceProvider class in the Illuminate\Auth namespace. It extends the ServiceProvider class and provides methods for registering authentication-related services.

Methods

register

This method is responsible for registering the service provider. It calls several other methods to register various authenticator services and handlers.

registerAuthenticator

This method registers the authenticator services. It defines singletons for the auth and auth.driver services.

registerUserResolver

This method registers a resolver for the authenticated user. It binds the AuthenticatableContract interface to a closure that calls the user resolver function.

registerAccessGate

This method registers the access gate service. It defines a singleton for the GateContract interface and initializes it with the application instance and a closure that calls the user resolver function.

registerRequirePassword

This method registers a resolver for the authenticated user. It binds the RequirePassword middleware class to a closure that creates a new instance of the class with the necessary dependencies.

registerRequestRebindHandler

This method handles the re-binding of the request binding. It defines a rebind callback that sets a new user resolver for the request.

registerEventRebindHandler

This method handles the re-binding of the event dispatcher binding. It defines a rebind callback that sets the dispatcher for the authentication guard if it supports the setDispatcher method.

Classes

No additional classes are defined in this file.

<?php

namespace Illuminate\Auth;

use Illuminate\Auth\Access\Gate;
use Illuminate\Auth\Middleware\RequirePassword;
use Illuminate\Contracts\Auth\Access\Gate as GateContract;
use Illuminate\Contracts\Auth\Authenticatable as AuthenticatableContract;
use Illuminate\Contracts\Routing\ResponseFactory;
use Illuminate\Contracts\Routing\UrlGenerator;
use Illuminate\Support\ServiceProvider;

class AuthServiceProvider extends ServiceProvider
{
    /**
     * Register the service provider.
     *
     * @return void
     */
    public function register()
    {
        $this->registerAuthenticator();
        $this->registerUserResolver();
        $this->registerAccessGate();
        $this->registerRequirePassword();
        $this->registerRequestRebindHandler();
        $this->registerEventRebindHandler();
    }

    /**
     * Register the authenticator services.
     *
     * @return void
     */
    protected function registerAuthenticator()
    {
        $this->app->singleton('auth', fn ($app) => new AuthManager($app));

        $this->app->singleton('auth.driver', fn ($app) => $app['auth']->guard());
    }

    /**
     * Register a resolver for the authenticated user.
     *
     * @return void
     */
    protected function registerUserResolver()
    {
        $this->app->bind(AuthenticatableContract::class, fn ($app) => call_user_func($app['auth']->userResolver()));
    }

    /**
     * Register the access gate service.
     *
     * @return void
     */
    protected function registerAccessGate()
    {
        $this->app->singleton(GateContract::class, function ($app) {
            return new Gate($app, fn () => call_user_func($app['auth']->userResolver()));
        });
    }

    /**
     * Register a resolver for the authenticated user.
     *
     * @return void
     */
    protected function registerRequirePassword()
    {
        $this->app->bind(RequirePassword::class, function ($app) {
            return new RequirePassword(
                $app[ResponseFactory::class],
                $app[UrlGenerator::class],
                $app['config']->get('auth.password_timeout')
            );
        });
    }

    /**
     * Handle the re-binding of the request binding.
     *
     * @return void
     */
    protected function registerRequestRebindHandler()
    {
        $this->app->rebinding('request', function ($app, $request) {
            $request->setUserResolver(function ($guard = null) use ($app) {
                return call_user_func($app['auth']->userResolver(), $guard);
            });
        });
    }

    /**
     * Handle the re-binding of the event dispatcher binding.
     *
     * @return void
     */
    protected function registerEventRebindHandler()
    {
        $this->app->rebinding('events', function ($app, $dispatcher) {
            if (! $app->resolved('auth') ||
                $app['auth']->hasResolvedGuards() === false) {
                return;
            }

            if (method_exists($guard = $app['auth']->guard(), 'setDispatcher')) {
                $guard->setDispatcher($dispatcher);
            }
        });
    }
}