Actuellement, la logique derrière la réinitialisation du mot de passe est que l'utilisateur doit fournir un e-mail valide / enregistré pour recevoir un e-mail de récupération de mot de passe.
Dans mon cas, je ne veux pas valider si l'e-mail est enregistré ou non en raison de problèmes de sécurité et je veux simplement faire la vérification dans le back-end et dire à l'utilisateur que "S'il a fourni un e-mail enregistré, il devrait recevoir un e-mail de récupération sous peu".
Ce que je ' a été fait pour y parvenir est édité dans la méthode vendor \ laravel \ framework \ src \ Illuminate \ Auth \ Passwords \ PasswordBroker.php
sendResetLink ()
à partir de ceci:
/** * Send a password reset link to a user. * * @param array $credentials * @return string */ public function sendResetLink(array $credentials) { // First we will check to see if we found a user at the given credentials and // if we did not we will redirect back to this current URI with a piece of // "flash" data in the session to indicate to the developers the errors. $user = $this->getUser($credentials); // if (is_null($user)) { // return static::INVALID_USER; // } // Once we have the reset token, we are ready to send the message out to this // user with a link to reset their password. We will then redirect back to // the current URI having nothing set in the session to indicate errors. if(!is_null($user)) { $user->sendPasswordResetNotification( $this->tokens->create($user) ); } return static::RESET_LINK_SENT; }
à ceci:
/** * Send a password reset link to a user. * * @param array $credentials * @return string */ public function sendResetLink(array $credentials) { // First we will check to see if we found a user at the given credentials and // if we did not we will redirect back to this current URI with a piece of // "flash" data in the session to indicate to the developers the errors. $user = $this->getUser($credentials); if (is_null($user)) { return static::INVALID_USER; } // Once we have the reset token, we are ready to send the message out to this // user with a link to reset their password. We will then redirect back to // the current URI having nothing set in the session to indicate errors. $user->sendPasswordResetNotification( $this->tokens->create($user) ); return static::RESET_LINK_SENT; }
Cette option codée en dur n'est pas la meilleure solution car elle disparaîtra après la mise à jour .. donc Je voudrais savoir comment puis-je étendre ou mettre en œuvre ce changement dans le cadre du projet dans le dossier App
pour conserver ce changement à tout moment?
PS J'ai essayé la solution mentionnée ici: Personnalisation de Laravel 5.3 Password Broker mais cela n'a pas été le cas 't work .. aussi l'arborescence des répertoires diffère et je ne pouvais pas comprendre où mettre le nouveau fichier PasswordBroker.php
.
Merci d'avance!
3 Réponses :
Voici les étapes à suivre.
Créez un nouveau PasswordResetsServiceProvider
personnalisé. J'ai un dossier (espace de noms) appelé Extensions
où je placerai ce fichier:
'providers' => [ ... // Illuminate\Auth\Passwords\PasswordResetServiceProvider::class, App\Extensions\Passwords\PasswordResetServiceProvider::class, ... ]
Comme vous pouvez le voir, ce fournisseur étend la réinitialisation du mot de passe de base fournisseur. La seule chose qui change est que nous renvoyons un PasswordBrokerManager
personnalisé à partir de la méthode registerPasswordBroker
. Créons un gestionnaire de courtier personnalisé dans le même espace de noms:
<?php namespace App\Extensions\Passwords; use Illuminate\Auth\Passwords\PasswordBroker as BasePasswordBroker; class PasswordBroker extends BasePasswordBroker { /** * Send a password reset link to a user. * * @param array $credentials * @return string */ public function sendResetLink(array $credentials) { // First we will check to see if we found a user at the given credentials and // if we did not we will redirect back to this current URI with a piece of // "flash" data in the session to indicate to the developers the errors. $user = $this->getUser($credentials); // if (is_null($user)) { // return static::INVALID_USER; // } // Once we have the reset token, we are ready to send the message out to this // user with a link to reset their password. We will then redirect back to // the current URI having nothing set in the session to indicate errors. if(!is_null($user)) { $user->sendPasswordResetNotification( $this->tokens->create($user) ); } return static::RESET_LINK_SENT; } }
Encore une fois, ce PasswordBrokerManager étend le gestionnaire de base de laravel. La seule différence ici est la nouvelle méthode de résolution qui renvoie un nouveau PasswordBroker
personnalisé à partir du même espace de noms. Donc, le dernier fichier, nous allons créer un PasswordBroker
personnalisé dans le même espace de noms:
<?php namespace App\Extensions\Passwords; use Illuminate\Auth\Passwords\PasswordBrokerManager as BasePasswordBrokerManager; class PasswordBrokerManager extends BasePasswordBrokerManager { /** * Resolve the given broker. * * @param string $name * @return \Illuminate\Contracts\Auth\PasswordBroker * * @throws \InvalidArgumentException */ protected function resolve($name) { $config = $this->getConfig($name); if (is_null($config)) { throw new InvalidArgumentException( "Password resetter [{$name}] is not defined." ); } // The password broker uses a token repository to validate tokens and send user // password e-mails, as well as validating that password reset process as an // aggregate service of sorts providing a convenient interface for resets. return new PasswordBroker( $this->createTokenRepository($config), $this->app['auth']->createUserProvider($config['provider'] ?? null) ); } }
Comme vous pouvez le voir, nous étendons la classe PasswordBroker par défaut de Laravel et ne remplace que la méthode que nous devons remplacer.
La dernière étape consiste simplement à remplacer le courtier Laravel Default PasswordReset par le nôtre. Dans le fichier config / app.php
, modifiez la ligne qui enregistre le fournisseur en tant que tel:
<?php namespace App\Extensions\Passwords; use Illuminate\Auth\Passwords\PasswordResetServiceProvider as BasePasswordResetServiceProvider; class PasswordResetServiceProvider extends BasePasswordResetServiceProvider { /** * Indicates if loading of the provider is deferred. * * @var bool */ protected $defer = true; /** * Register the service provider. * * @return void */ public function register() { $this->registerPasswordBroker(); } /** * Register the password broker instance. * * @return void */ protected function registerPasswordBroker() { $this->app->singleton('auth.password', function ($app) { return new PasswordBrokerManager($app); }); $this->app->bind('auth.password.broker', function ($app) { return $app->make('auth.password')->broker(); }); } }
C'est tout ce dont vous avez besoin pour enregistrer un mot de passe personnalisé courtier. J'espère que cela vous aidera.
C'est comme la solution ci-dessus, mais cela fonctionne. C'est encore trop compliqué mais c'est mieux que le mien. Je vous remercie. Je continuerai à rechercher une solution plus simpliste.
Merci! Vous avez rédigé une description claire et concise mais entièrement codée de la façon de procéder. J'ai wow un courtier personnalisé qui réinitialise les mots de passe par rapport à une API. Fonctionne bien dans Laravel 5.6.
La solution la plus simple ici serait de placer votre code personnalisé dans app \ Http \ Controllers \ Auth \ ForgotPasswordController
- c'est le contrôleur qui extrait le trait SendsPasswordResetEmails
.
Votre méthode remplace celle fournie par ce trait, elle sera donc appelée à la place de celle du trait. Vous pouvez remplacer toute la méthode sendResetLinkEmail
avec votre code pour toujours renvoyer la même réponse indépendamment du succès.
public function sendResetLinkEmail(Request $request) { $this->validateEmail($request); // We will send the password reset link to this user. Once we have attempted // to send the link, we will examine the response then see the message we // need to show to the user. Finally, we'll send out a proper response. $response = $this->broker()->sendResetLink( $request->only('email') ); return back()->with('status', "If you've provided registered e-mail, you should get recovery e-mail shortly."); }
C'est exactement ce que je cherchais. Merci @Dwight
Vous pouvez simplement remplacer la méthode sendResetLinkFailedResponse
dans votre classe ForgetPasswordController
.
protected function sendResetLinkFailedResponse(Request $request, $response) { return $this->sendResetLinkResponse($request, Password::RESET_LINK_SENT); }
Nous enverrons simplement la réponse positive même si la validation a échoué.