Personalizar el Auth, para autenticarse con el username, en Laravel

logo laravel

Personalizar el auth, para autenticarse con el username en Laravel, puede sernos oportuno, si necesitamos un comportamiento mas estricto del modo de acceso a nuestra aplicación.

Los cambios necesarios, incluyen  modificar todo lo relacionado con el Login, o sea  la Migración, el Modelo, el Controlador y la Vista.

El controlador encargado del login es Login Controller( App\Http\Controllers\Auth\LoginController).

Es el encargado de implementar  el trait AuthenticatesUsers  encargado de la validación del  que se ejecuta al loguearse.

Como el método validateLogin() valida el campo email por defecto, partiendo del  del método username() que retorna automáticamente el campo email, hay que cambiar algunos cosas para modificar este proceso y que nos devuelva el campo username.

Lo primero es en  la migración de la tabla users (2014_10_12_000000_create_users_table.php) agregar el campo username, con el tipo unique.

Schema::create('users', function (Blueprint $table) {
    $table->increments('id');
    $table->string('username')->unique();
    $table->string('name');
    $table->string('email')->unique();
    $table->string('password');
    $table->rememberToken();
    $table->timestamps();
});

Lo segundo es declarar lógicamente este campo como un campo fillable, agregándolo en el modelo(App/User)

protected $fillable = [
    'username', 'name', 'email', 'password',
];

Igualmente como tercer paso, necesitamos agregar el metodo username() en el controlador App\Http\Controllers\Auth\LoginController, para que nos retorne el valor username que necesitamos.

public function username()
{
    return 'username';
}

Por último en la vista, debemos hacer los cambios para modificar el formulario del login.

Aquí es preciso sustituir el campo de tipo email, por un campo de tipo text, y cambiarle valor de la etiqueta name.

<div class="form-group row">
    <label for="username" class="col-sm-4 col-form-label text-md-right">{{ __('Username') }}</label>

    <div class="col-md-6">
        <input id="email" type="text" class="form-control{{ $errors->has('username') ? ' is-invalid' : '' }}" name="username" value="{{ old('username') }}" required autofocus>

        @if ($errors->has('username'))
            <span class="invalid-feedback">
                <strong>{{ $errors->first('username') }}</strong>
            </span>
        @endif
    </div>
</div>

Y esto es todo

Espero sinceramente, que esto sirviera de ayuda a alguien

El elefante no necesita decirle a nadie cuan grande es, le basta con caminar.

NS

Diferencias entre default, null y blank en Django

En este articulo explico las diferencias entre default, null y blank en Django.

Los tipos de campo que emplea Django puedes revisarlos en la explicación de los campos en los modelos en su pagina oficial.

Nul

El campo nulo (Null) cuando posee valor TRUE, permitirá  guardar  valores vacíos como NULL en la base de datos. Su valor por defecto  es False.

Dicho esto, las cadenas vacías siempre se guardarán como cadenas vacías, no como NULL.

Por tanto, lo adecuado es usarlo   para campos que no sean cadenas (fechas, enteros, o booleanos.

Blank

El campo blank cuando es TRUE,  puede dejarse en blanco y por  defecto su valor es False.

Blank se diferencia de Null, porque Blank se emplea en validaciones, mientras Null se emplea en la base de datos.

Si un campo blank es True, la validación en el sitio de Django  permitirá que se añada un campo vacío, sino es asi por el contrario, y  blank=False, el campo será requerido.

Por tanto, considerando lo explicado anteriormente al hablar de Null,  si tenemos datos del tipo booleano, date o entero,  y lo hemos declarado null, es entonces  obligatorio también definirlos como  blank=True .

Ya que esto permitirá si valores vacíos en los formularios

logo django
django

Default

El valor por defecto (default) de un campo, ha de ser llamable  y por tanto si es llamable, se llamará cada vez que un objeto nuevo sea creado.

Resumiendo el concepto del uso de estos seria:

  • Usa «default» para definir el valor que se dará a un campo si tu código no lo define.
  • Usa «blank» para validaciones de formulario. blank=True permite que el campo se deje en blanco.
  • Usa «null» si quieres guardar valores vacíos como NULL en la base de datos.

Espero humildemente, que esto sirva de ayuda a alguien.

«El elefante no necesita decir cuan alto es, le basta con caminar»

NS