Laravel 5.3 Password Broker Customization
Asked Answered
B

2

14

Does anyone know how to override the functions used within laravel's password broker? I know the docs:

https://laravel.com/docs/5.3/passwords#resetting-views

Give information on what to do for things like views and a few surface level things but it's not clear at all really or maybe I'm not reading it enough times.

I already know how to override the ResetsPasswords.php Trait but overriding the functionality of the Password::broker() is for the next layer in.

If there is more information needed I can kindly provide some.

Thank you in advance.

Bills answered 10/11, 2016 at 16:19 Comment(0)
C
33

I had to face the same issue, needed to override some of the PasswordBroker functions. After a lot of investigation on the web and many failed attempts to do so, I ended up to the following implementation:

  1. Created a CustomPasswordResetServiceProvider inside App\Providers where I registered a CustomPasswordBrokerManager instance.

    namespace App\Providers;
    use Illuminate\Support\ServiceProvider;
    use App\Services\CustomPasswordBrokerManager; 
    class CustomPasswordResetServiceProvider extends ServiceProvider{
        protected $defer = true;
    
        public function register()
        {
            $this->registerPasswordBrokerManager();
        }
    
        protected function registerPasswordBrokerManager()
        {
            $this->app->singleton('auth.password', function ($app) {
                return new CustomPasswordBrokerManager($app);
            });
        }
    
        public function provides()
        {
            return ['auth.password'];
        }
    }
    
  2. In config/app.php commented out line:
    //Illuminate\Auth\Passwords\PasswordResetServiceProvider::class,
    and added:
    App\Providers\CustomPasswordResetServiceProvider::class,

  3. Inside App\Services folder created a CustomPasswordBrokerManager and copied the context of the default PasswordBrokerManager located at:
    Illuminate\Auth\Passwords\PasswordBrokerManager.php
    Then modified the function resolve to return an instance of my CustomPasswordProvider class.

    protected function resolve($name)
    {
        $config = $this->getConfig($name);
        if (is_null($config)) {
            throw new InvalidArgumentException("Password resetter [{$name}] is not defined.");
        }
    
        return new CustomPasswordBroker(
            $this->createTokenRepository($config),
            $this->app['auth']->createUserProvider($config['provider'])
    );
    }
    
  4. Finally inside App\Services folder I created a CustomPasswordBroker class which extends default PasswordBroker located at:
    Illuminate\Auth\Passwords\PasswordBroker and overridden the functions that I needed.

    use Illuminate\Auth\Passwords\PasswordBroker as BasePasswordBroker;    
    
    class CustomPasswordBroker extends BasePasswordBroker    
    {    
    // override the functions that you need here    
    }      
    

Not sure if this is the best implementation but it worked for me.

Caramel answered 17/3, 2017 at 11:9 Comment(4)
This is a very similar implementation that I ended up doing. Very well explained with identification to the directories and all. +1 and marked Correct!Bills
Just had to change the required password length for password resets. The min length of 6 characters is burried quite deep in the laravel code so that I could only change it with your answer here. Thank you so much!Lamphere
Thank you for this. I was getting stuck on with this Password Broker and Password Broker Manager mess. Seriously, I can't comprehend how they complicated something that used to be simple in such a bad way. Also, for people doing this on Laravel 5.4 there's a slight difference for the register method of the service provider than what's shown here. Essentially, the registerPasswordBroker method should be copied as is on Illuminate\Auth\Passwords\PasswordResetServiceProvider except the part where you use your own custom CustomPasswordBrokerManager instance.Appleby
Thank you very much, it has helped me a lot!Bristle
G
6

There are some missing things for step 1 & 3 in the answer https://mcmap.net/q/794513/-laravel-5-3-password-broker-customization

Step 1

Probably the safest way is to simply copy the class from Illuminate\Auth\Passwords\PassswordResetServiceProvider.php to App\Provider\CustomPasswordResetServiceProviderand change:

  1. Namespace to namespace App\Providers;
  2. Class name to CustomPasswordResetServiceProvider
  3. Add use App\Services\CustomPasswordBrokerManager; to the top
  4. Inside the function registerPasswordBroker rename PasswordBrokerManager to CustomPasswordBrokerManager

Step 2.

Besides changing the resolve method also do the following:

  1. Change namespace to namespace App\Services;
  2. Add use Illuminate\Auth\Passwords\DatabaseTokenRepository; to the top
  3. Change class name to CustomPasswordBrokerManager
Gros answered 20/6, 2018 at 12:2 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.