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.

Laravel sigue enviando GenericUser a las Políticas en lugar de mi Modelo de Usuario.

Estoy tratando de usar la funcionalidad relacionada con la autenticación estándar de Laravel. Tengo funcionando correctamente el inicio de sesión, registro, cierre de sesión, etc. Pero mi problema es que cuando intento utilizar funciones como Auth::user(), esto devuelve el modelo GenericUser en lugar de mi propio modelo App/Models/User.php. El problema es que el modelo User tiene algunas referencias a claves foráneas a otros datos, por lo que me gustaría trabajar exclusivamente con mi modelo User.

Por ejemplo, al intentar crear una Policy, me encuentro con un error:

El argumento 1 pasado a App\Policies\ContractPolicy::before() debe ser una instancia de App\Models\User, se proporcionó una instancia de Illuminate\Auth\GenericUser

Y el código simplemente se ve así:

<?php

namespace App\Policies;

use App\Models\Contract;
use App\Models\User;
use Illuminate\Auth\Access\HandlesAuthorization;

class ContractPolicy
{
    use HandlesAuthorization;

    public function before(User $user, $ability)
    {
        if ($user->isSuperAdmin()) {
            return true;
        }
    }

    public function viewAny(User $user)
    {
        return $user->isMember();
    }

}

El modelo GenericUser de hecho devuelve los datos de la tabla users, pero el problema es que es completamente diferente a lo que proporciona mi modelo User, y por lo tanto, no incluye las referencias a claves foráneas ni las funciones que agregué. Tenía la impresión de que podía cambiar el modelo utilizado cambiando el proveedor en config/auth.php. Lo hice y nada parece haber cambiado:

'providers' => [
    'users' => [
        'model' => App\Models\User::class,
    ],

     'users' => [
         'driver' => 'database',
         'table' => 'users',
     ],
],

¿Qué estoy haciendo mal aquí?

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Parece que el problema podría estar relacionado con la caché. Intenta ejecutar los siguientes comandos en tu terminal:

    php artisan config:cache
    php artisan cache:clear
    

    Esto eliminará cualquier configuración almacenada en caché y debería obligar a Laravel a reconocer tu modelo App/Models/User.php en lugar del modelo GenericUser.

    Si eso no funciona, intenta especificar la guardia en tu política. Actualiza tu clase ContractPolicy de la siguiente manera:

    <?php
    
    namespace App\Policies;
    
    use App\Models\Contract;
    use App\Models\User;
    use Illuminate\Auth\Access\HandlesAuthorization;
    
    class ContractPolicy
    {
        use HandlesAuthorization;
    
        protected $guard = 'web'; // especifica tu guardia aquí
    
        public function before(User $user, $ability)
        {
            if ($user->isSuperAdmin()) {
                return true;
            }
        }
    
        public function viewAny(User $user)
        {
            return $user->isMember();
        }
    }
    

    Asegúrate de reemplazar 'web' por el nombre de tu guardia. Esto garantizará que Laravel utilice tu modelo App/Models/User.php en lugar del modelo GenericUser en tu política.

    Espero que eso te ayude. Avísame si tienes alguna pregunta adicional.

Comments are closed.