Laravel 5.3 密码代理自定义

Posted

技术标签:

【中文标题】Laravel 5.3 密码代理自定义【英文标题】:Laravel 5.3 Password Broker Customization 【发布时间】:2017-03-24 18:11:57 【问题描述】:

有谁知道如何覆盖 laravel 的密码代理中使用的功能?我知道文档:

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

提供有关如何处理诸如视图和一些表面级别的事情的信息,但实际上根本不清楚,或者我可能没有阅读足够多的时间。

我已经知道如何覆盖 ResetsPasswords.php 特征,但覆盖 Password::broker() 的功能是为了下一层。

如果需要更多信息,我可以提供一些。

提前谢谢你。

【问题讨论】:

【参考方案1】:

我不得不面对同样的问题,需要重写一些 PasswordBroker 函数。经过对网络的大量调查和许多失败的尝试,我最终实现了以下实现:

    在 App\Providers 中创建了一个 CustomPasswordResetServiceProvider,我在其中注册了一个 CustomPasswordBrokerManager 实例。

    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'];
        
    
    

    config/app.php 中注释掉了一行://Illuminate\Auth\Passwords\PasswordResetServiceProvider::class, 并添加:App\Providers\CustomPasswordResetServiceProvider::class,

    在 App\Services 文件夹中创建了一个 CustomPasswordBrokerManager 并复制了位于以下位置的默认 PasswordBrokerManager 的上下文: Illuminate\Auth\Passwords\PasswordBrokerManager.php 然后修改函数 resolve 以返回我的 CustomPasswordProvider 类的实例。

    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'])
    );
    
    

    最后,在 App\Services 文件夹中,我创建了一个 CustomPasswordBroker 类,该类扩展了位于以下位置的默认 PasswordBroker: Illuminate\Auth\Passwords\PasswordBroker 并覆盖了我需要的函数。

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

不确定这是否是最好的实现,但它对我有用。

【讨论】:

这是我最终做的一个非常相似的实现。很好地解释了对目录和所有内容的识别。 +1 并标记为正确! 只需更改密码重置所需的密码长度。 6 个字符的最小长度在 laravel 代码中埋得很深,所以我只能在这里用你的答案来改变它。非常感谢! 谢谢你。我被这个 Password Broker 和 Password Broker Manager 搞得一团糟。说真的,我无法理解他们如何以如此糟糕的方式复杂化过去很简单的事情。此外,对于在 Laravel 5.4 上执行此操作的人,服务提供者的 register 方法与此处显示的方法略有不同。本质上,registerPasswordBroker 方法应该在 Illuminate\Auth\Passwords\PasswordResetServiceProvider 上按原样复制,除了您使用自己的自定义 CustomPasswordBrokerManager 实例的部分。 非常感谢,对我帮助很大!【参考方案2】:

答案https://***.com/a/42855948/2311074中的步骤1和3缺少一些东西

第 1 步

可能最安全的方法是将类从Illuminate\Auth\Passwords\PassswordResetServiceProvider.php复制到App\Provider\CustomPasswordResetServiceProvider并更改:

    命名空间到namespace App\Providers; 类名改为CustomPasswordResetServiceProvider 在顶部添加use App\Services\CustomPasswordBrokerManager; 函数内部registerPasswordBrokerPasswordBrokerManager重命名为CustomPasswordBrokerManager

第 2 步。

除了更改解析方法之外,还可以执行以下操作:

    将命名空间更改为namespace App\Services; 在顶部添加use Illuminate\Auth\Passwords\DatabaseTokenRepository; 类名改为CustomPasswordBrokerManager

【讨论】:

以上是关于Laravel 5.3 密码代理自定义的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 5.3,自定义 Css/Js 不工作

laravel 4 自定义命名密码列

在 Laravel 5.4 中自定义忘记密码的电子邮件

Laravel自定义验证确认密码[重复]

Laravel - 如何在忘记密码中添加自定义字段

向 Laravel 忘记密码表单添加额外问题并自定义其错误消息