es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Restablecimiento de contraseña de Laravel utilizando el nombre de usuario en lugar del correo electrónico.

Me gustaría restablecer la contraseña en mi proyecto utilizando el campo Username en lugar del campo Email.

Ya configuré el inicio de sesión con el campo de nombre de usuario y funciona bien, pero no ocurre lo mismo con el restablecimiento de contraseña.

Sobreescribí algunos métodos en ResetPasswordController siguiendo algunas instrucciones encontradas en línea, pero no logro resolver mi problema.

Aquí está mi código:

class ResetPasswordController extends Controller
{
    /*
    |--------------------------------------------------------------------------
    | Controlador de restablecimiento de contraseña
    |--------------------------------------------------------------------------
    |
    | Este controlador es responsable de manejar las solicitudes de restablecimiento
    | de contraseña y utiliza una trait simple para incluir este comportamiento. Eres libre de
    | explorar esta trait y sobrescribir los métodos que desees modificar.
    |
    */

    use ResetsPasswords;

    /**
     * A dónde redirigir a los usuarios después de restablecer su contraseña.
     *
     * @var string
     */
    protected $redirectTo = RouteServiceProvider::HOME;

    protected function credentials(Request $request)
    {
        return $request->only(
            'username', 'password', 'password_confirmation', 'token'
        );
    }

    protected function rules()
    {
        return [
            'token' => 'required',
            'username' => 'required',
            'password' => 'required|confirmed|min:8',
        ];
    }
}

También cambié resources/views/auth/passwords/reset.blade.php y resources/views/auth/passwords/email.blade.php, sobrescribiendo username en todos los campos de entrada email.

Versión de Laravel: 7.x

¿Alguna sugerencia?

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para restablecer la contraseña en tu proyecto utilizando el campo “Username” en lugar del campo “Email”, es necesario hacer algunos cambios en tu controlador y vistas. A continuación se detallan los pasos que debes seguir:

    1. En tu controlador ResetPasswordController, sobrescribe la función broker para que devuelva un administrador de contraseñas personalizado que utilice el campo username en lugar del campo email. Aquí tienes un ejemplo:
    use Illuminate\Support\Facades\Password;
    
    class ResetPasswordController extends Controller
    {
        // ...
    
        // sobrescribe la función broker
        public function broker()
        {
            return Password::broker('users'); // puedes utilizar cualquier nombre que desees
        }
    
        // ...
    }
    
    1. Crea un nuevo administrador de contraseñas en tu archivo config/auth.php dentro del array passwords, utilizando el campo username como columna de nombre de usuario. Aquí tienes un ejemplo:
    'passwords' => [
        'users' => [
            'provider' => 'users',
            'table' => 'password_resets',
            'expire' => 60,
            'throttle' => 60,
            'username' => 'username', // especifica aquí el nombre de la columna de username
        ],
    ],
    
    1. Modifica tu archivo resources/views/auth/passwords/email.blade.php reemplazando todas las apariciones de email por username, de manera que el formulario acepte el campo de nombre de usuario en lugar del campo de email. Aquí tienes un ejemplo:
    <!-- Cambia este código -->
    <div class="form-group row">
        <label for="email" class="col-md-4 col-form-label text-md-right">{{ __('Dirección de correo electrónico') }}</label>
    
        <div class="col-md-6">
            <input id="email" type="email" class="form-control @error('email') is-invalid @enderror" name="email" value="{{ old('email') }}" required="" autocomplete="email" autofocus="">
    
            @error('email')
                <span class="invalid-feedback" role="alert">
                    <strong>{{ $message }}</strong>
                </span>
            @enderror
        </div>
    </div>
    
    <!-- Reemplaza con este código -->
    <div class="form-group row">
        <label for="username" class="col-md-4 col-form-label text-md-right">{{ __('Nombre de usuario') }}</label>
    
        <div class="col-md-6">
            <input id="username" type="username" class="form-control @error('username') is-invalid @enderror" name="username" value="{{ old('username') }}" required="" autocomplete="username" autofocus="">
    
            @error('username')
                <span class="invalid-feedback" role="alert">
                    <strong>{{ $message }}</strong>
                </span>
            @enderror
        </div>
    </div>
    
    1. Modifica tu archivo resources/views/auth/passwords/reset.blade.php reemplazando todas las apariciones de email por username, de manera que el formulario acepte el campo de nombre de usuario en lugar del campo de email. Aquí tienes un ejemplo:
    <!-- Cambia este código -->
    <div class="form-group row">
        <label for="email" class="col-md-4 col-form-label text-md-right">{{ __('Dirección de correo electrónico') }}</label>
    
        <div class="col-md-6">
            <input id="email" type="email" class="form-control @error('email') is-invalid @enderror" name="email" value="{{ old('email') }}" required="" autocomplete="email" autofocus="">
    
            @error('email')
                <span class="invalid-feedback" role="alert">
                    <strong>{{ $message }}</strong>
                </span>
            @enderror
        </div>
    </div>
    
    <!-- Reemplaza con este código -->
    <div class="form-group row">
        <label for="username" class="col-md-4 col-form-label text-md-right">{{ __('Nombre de usuario') }}</label>
    
        <div class="col-md-6">
            <input id="username" type="username" class="form-control @error('username') is-invalid @enderror" name="username" value="{{ $username ?? old('username') }}" required="" autocomplete="username" autofocus="">
    
            @error('username')
                <span class="invalid-feedback" role="alert">
                    <strong>{{ $message }}</strong>
                </span>
            @enderror
        </div>
    </div>
    
    1. Por último, modifica tu controlador ResetPasswordController para utilizar el campo username en lugar del campo email, sobrescribiendo las funciones credentials y rules. Aquí tienes un ejemplo:
    class ResetPasswordController extends Controller
    {
        use ResetsPasswords;
    
        protected $redirectTo = RouteServiceProvider::HOME;
    
        // sobrescribe la función credentials para utilizar el campo username en lugar del campo email
        protected function credentials(Request $request)
        {
            return [
                'username' => $request->username,
                'password' => $request->password,
                'password_confirmation' => $request->password_confirmation,
                'token' => $request->token,
            ];
        }
    
        // sobrescribe la función rules para utilizar el campo username en lugar del campo email
        protected function rules()
        {
            return [
                'username' => 'required|exists:users',
                'token' => 'required',
                'password' => 'required|confirmed|min:8',
            ];
        }
    }
    

    ¡Listo! Ahora deberías poder restablecer contraseñas utilizando el campo username en lugar del campo email en tu proyecto Laravel.

Comments are closed.