2 votes

Laravel ne modifie pas le modèle utilisateur en cours de route

Je utilise Laravel 4 pour mon application. Dans cette application, j'ai deux modèles d'authentification : Buyers et Users. Je ne veux pas utiliser le champ User->type, car ces modèles ont une logique absolument différente.

Voici mon contrôleur de connexion :

public function postIndex()
{

    if (Auth::attempt(array_only(Input::get(), array('email', 'password')), array_only(Input::get(), array('save')))) {
        Login::create(array('user_id' => Auth::user()->id, 'session_id' => session_id())); //session_id.
        return Redirect::to('/');
    }

    return $this->userauth();
}

public function userauth() {

    Config::set('auth.model', 'User');
    Config::set('auth.table', 'users');
    $test = Config::get('auth.model');

    if (Auth::attempt(array_only(Input::get(), array('email', 'password')), array_only(Input::get(), array('save')))) {
        Login::create(array('user_id' => Auth::user()->id, 'session_id' => session_id())); //session_id.
        return Redirect::to('/');
    }

    Session::flash('error', 'Authentification non acceptée. '. implode(' ', array_only(Input::get(), array('email', 'password'))));

    return Redirect::to('logins')->withInput(Input::except('password'));

}

J'ai déjà changé les paramètres dans auth.php pour fonctionner avec les acheteurs. Lorsque je saisis le login et le mot de passe pour l'acheteur, tout fonctionne bien. Il semble qu'après Auth::attempted(), les paramètres ne changent pas. Il semble que je doive recharger l'objet Auth. Quelqu'un peut-il m'aider ?

Par ailleurs, si j'écris comme ceci :

public function postIndex()
{

    Config::set('auth.model', 'User');
    Config::set('auth.table', 'users');
    $test = Config::get('auth.model');

    if (Auth::attempt(array_only(Input::get(), array('email', 'password')), array_only(Input::get(), array('save')))) {
        Login::create(array('user_id' => Auth::user()->id, 'session_id' => session_id())); //session_id.
        return Redirect::to('/');
    }

    Session::flash('error', 'Authentification non acceptée. '. implode(' ', array_only(Input::get(), array('email', 'password'))));

    return Redirect::to('logins')->withInput(Input::except('password'));
}

tout fonctionne aussi bien.

4voto

jchamberlain Points 699

Short Answer: Vous avez raison. Après le premier appel à Auth::attempt(), les changements dans la configuration n'ont aucun effet. Pendant l'exécution, vous devez utiliser Auth::setProvider() pour définir le modèle qui sera utilisé.

Long Answer: Je ne sais pas dans quelle mesure cela fonctionnera dans votre configuration particulière, mais j'ai trouvé votre question en essayant de faire quelque chose de similaire, donc je vais vous montrer comment j'ai fini par le faire.

Dans mon cas, l'exigence n'était pas simplement d'avoir deux types d'utilisateurs différents. Je gère deux sites Web sur des domaines séparés à partir du même code source, l'un pour les étudiants et l'autre pour les familles d'accueil. J'ai une classe Student qui remplacera User sur un site et Host à des fins similaires sur l'autre. Les deux implémentent UserInterface et RemindableInterface, donc tout va bien de ce côté.

Dans app/filters.php, je crée deux filtres spéciaux:

Route::filter('prep.student', function() {
  Auth::setProvider(new Illuminate\Auth\EloquentUserProvider(App::make('hash'), 'Student'));
});

Route::filter('prep.host', function() {
  Auth::setProvider(new Illuminate\Auth\EloquentUserProvider(App::make('hash'), 'Host'));
});

Ici, "Host" et "Student" sont les noms de classe que vous voulez que le pilote d'authentification Eloquent utilise.

Dans app/routes.php, j'ai mis mes routes dans deux groupes, et pour chaque groupe j'ai utilisé le filtre approprié ci-dessus:

/**
 * Routes for Students
 */
Route::group(array('domain' => '[domain de l'étudiant]', 'before' => 'prep.student'), function() {

  Route::get('test', function() {
    return View::make('student/test');
  });
  ...
});

/**
 * Routes for Hosts
 */
Route::group(array('domain' => '[domain de l'hôte'], 'before' => 'prep.host'), function() {

  Route::get('test', function() {
    return View::make('host/test');
  });
  ...
});

Le résultat est que le fournisseur d'utilisateurs est défini avec le modèle approprié pour chaque groupe de routes. Vous pourriez probablement également définir le fournisseur dans app/start/global.php, mais j'ai décidé de le garder avec le routage pour que ce soit très clair que les deux groupes de routes sont pour deux domaines différents et ont deux modèles d'authentification différents.

Je ferais cela un peu différemment si je le construisais à neuf, mais les deux sites Web sont le frontend d'une grande base de code héritée pour laquelle je ne peux pas modifier significativement la base de données, donc j'admets librement que c'est un peu une astuce. Si vous n'êtes pas dans une telle situation, une meilleure solution pourrait être d'avoir une classe User pour l'authentification, et ensuite de l'attacher aux deux autres modèles dont vous avez besoin.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X