🔑Autenticación

Cómo autenticar a tus usuarios mediante sus credenciales de SIIAU.

El paquete provee una funcionalidad de autenticación para los usuarios. Esta se integra con el sistema de autenticación de laravel.

Configurar

En el archivo de config/auth.php agregaremos un nuevo provider. Puede ser nombrado de cualquiere manera. El paquete recomienda el nombre de siiau_users.

config/auth.php
return [

    /** ... Otras configuraciones */

    'providers' => [
    
        /** ... Otros proveedores */

        'siiau_users' => [
            'driver' => 'siiau',
            'decorate' => 'users',
        ],
    ],
    
    /** ... */

];

Y en el mismo archivo agregaremos un nuevo guard que use el nuevo proveedor. De nuevo, el guard puede tener el nombre que queramos. En este caso le pusimos siiau.

config/auth.php
return [

    /** ... Otras configuraciones */

    'guards' => [
    
        /** ... Otros guards */
        
        'siiau' => [
            'driver' => 'session',
            'provider' => 'siiau_users',
        ],
    ],
    
    /** ... */

];

Por ultimo, para que funcione, sera necesario agregar la interfaz SiiauAuthenticable a tu modelo de User. Lo que necesita esta interfaz es una manera de obtener el código de usuario de SIIAU desde el módelo. Si tu modelo tiene una columa con esta propiedad puedes usar la implementación por defecto con el trait HasCodigoSiiau.

app/Models/User.php
namespace App\Models;

use Illuminate\Foundation\Auth\User as Authenticatable;
use Siiau\ApiClient\Concerns\HasCodigoSiiau;
use Siiau\ApiClient\Contracts\SiiauAuthenticable;

final class User extends Authenticatable implements SiiauAuthenticable
{
    use HasCodigoSiiau;
    
}

En caso de que tu modelo no tenga esa columa, tendras que implementar el método getCodigoSiiau y devolver el código de donde sea que proveea. El siguiente es un ejemplo en caso de que el código se encuentre en una relación.

app/Models/User.php
namespace App\Models;

use Illuminate\Database\Eloquent\Relations\HasOne;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Siiau\ApiClient\Contracts\SiiauAuthenticable;

final class User extends Authenticatable implements SiiauAuthenticable
{    
    public function siiauAccount(): HasOne
    {
        return $this->hasOne(SiiauAccount::class);
    }
    
    public function getCodigoSiiau(): ?string
    {
        return $this->siiauAccount?->codigo;
    }
}

Autenticar

Una vez configurado, para autenticar a tus usuarios, en tu controlador podrias usar el nuevo guard de la siguiente manera:

app/Http/Controllers/LoginController.php
namespace App\Http\Controllers;
 
use Illuminate\Http\Request;
use Illuminate\Http\RedirectResponse;
 
final class LoginController extends Controller
{
    public function authenticate(Request $request): RedirectResponse
    {
        $credentials = $request->validate([
            'codigo' => ['required'],
            'password' => ['required'],
        ]);
        
        if (auth('siiau')->attempt($credentials)) {
            // Authentication was successful...
            auth()->login(auth('siiau')->user());
            
            $request->session()->regenerate();
 
            return redirect()->intended('dashboard');
        }
 
        return back()->withErrors([
            'codigo' => 'The provided credentials do not match our records.',
        ])->onlyInput('email');
    }
}

En caso de que el código no se guarde en la misma tabla del modelo SiiauAuthenticable , deberas pasar una scope que filtre adecuadamente el modelo.

A continuación se muestra el ejemplo de como seria si se encuentra en una relación:

use Illuminate\Database\Eloquent\Builder;
 
if (auth('siiau')->attempt([
    'password' => $password,
    static function (Builder $query) use ($codigo): void {
        $query->whereRelation('siiauAccount', 'codigo', $codigo);
    },
])) {
    // Authentication was successful...
}

Última actualización