42 votes

Laravel 5.5 : modification de l'url de redirection de la connexion non authentifiée

En Laravel < 5.5 Je pourrais modifier ce fichier app/Exceptions/Handler pour changer l'url de redirection de l'utilisateur non authentifié :

protected function unauthenticated($request, AuthenticationException $exception)
{
    if ($request->expectsJson()) {
        return response()->json(['error' => 'Unauthenticated.'], 401);
    }

    return redirect()->guest(route('login'));
}

Mais en Laravel 5.5 ce sujet a été déplacé à cet endroit vendor/laravel/framework/src/Illuminate/Foundation/Exceptions/Handler.php alors comment puis-je le changer maintenant ? Je ne veux pas changer les choses dans le répertoire des fournisseurs au cas où elles seraient remplacées par les mises à jour du compositeur.

protected function unauthenticated($request, AuthenticationException $exception)
{
    return $request->expectsJson()
                ? response()->json(['message' => 'Unauthenticated.'], 401)
                : redirect()->guest(route('login'));
}

0 votes

0 votes

Ainsi, vous pouvez attraper l'erreur d'authentification et ensuite rediriger avant qu'elle ne soit attrapée par laravels. Merci beaucoup.

0 votes

@robertmylne ça marche ? car cette solution est juste pour faire un rapport ! !!

70voto

Seb. Kra. Points 576

Mais dans Laravel 5.5, il a été déplacé à cet emplacement vendor/laravel/framework/src/Illuminate/Foundation/Exceptions/Handler.php, alors comment puis-je le changer maintenant ? Je ne veux pas changer les choses dans le répertoire vendor au cas où elles seraient écrasées par les mises à jour du compositeur.

C'est juste que la fonction n'est plus présente par défaut.

Vous pouvez simplement le remplacer comme vous l'avez fait en 5.4. Assurez-vous simplement d'inclure

use Exception;
use Request;
use Illuminate\Auth\AuthenticationException;
use Response;

dans le fichier Handler.

Par exemple, mon app/Exceptions/Handler.php ressemble un peu à ça :

<?php
    namespace App\Exceptions;
    use Exception;
    use Request;
    use Illuminate\Auth\AuthenticationException;
    use Response;
    use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler;
    class Handler extends ExceptionHandler
    {
        (...) // The dfault file content
        /**
         * Convert an authentication exception into a response.
         *
         * @param  \Illuminate\Http\Request  $request
         * @param  \Illuminate\Auth\AuthenticationException  $exception
         * @return \Illuminate\Http\Response
         */
         protected function unauthenticated($request, AuthenticationException $exception)
         {
            return $request->expectsJson()
                    ? response()->json(['message' => 'Unauthenticated.'], 401)
                    : redirect()->guest(route('authentication.index'));
    }
}

1 votes

La meilleure réponse que j'ai trouvée, merci ! Juste une chose : existe-t-il un moyen, au lieu d'utiliser expectsJson(), de vérifier si la requête a été effectuée via la route api ?

0 votes

Vous êtes des hommes géniaux, je pensais désactiver le middleware web mais cette solution est la meilleure.

4 votes

if (in_array('api', \Route::getCurrentRoute()->computedMiddleware)) { return response()->json(['error' => 'Unauthenticated.'], 401); }

21voto

Milomir Points 169

Voici comment je l'ai résolu. Dans la fonction de rendu, j'ai attrapé la classe d'exception. Et dans le cas où il s'agit d'une classe d'exception d'authentification, j'ai écrit mon code pour la redirection (le code que j'aurais écrit dans la fonction non-authentifiée dans la version précédente).

public function render($request, Exception $exception)
{
    $class = get_class($exception);

    switch($class) {
        case 'Illuminate\Auth\AuthenticationException':
            $guard = array_get($exception->guards(), 0);
            switch ($guard) {
                case 'admin':
                    $login = 'admin.login';
                    break;
                default:
                    $login = 'login';
                    break;
            }

            return redirect()->route($login);
    }

    return parent::render($request, $exception);
}

2 votes

Merci, cela a fonctionné pour moi. J'ai utilisé le tutoriel MultiAuth de DevMarketer dans youtube mais il semble qu'il ne fonctionne pas dans Laravel 5.5. Cela résout mon problème.

0 votes

Ça a marché avec moi 2, et je poursuis devMarketer...le monde est trop petit

0 votes

Je travaille sur ce même problème. Lorsque vous avez réussi à le faire fonctionner, avez-vous utilisé la fonction standard de Laravel 5.5 pour les éléments suivants unauthenticated ? Ou avez-vous également inclus la version du unauthenticated à partir de 5.4 ?

7voto

LetsCMS Points 314

Mais dans Laravel 5.5, il a été déplacé à cet endroit vendor/laravel/framework/src/Illuminate/Foundation/Exceptions/Handler.php alors comment puis-je le modifier maintenant ? Je ne veux pas changer les choses dans le répertoire vendor au cas où il serait écrasé par les mises à jour du compositeur.

Il nous suffit d'inclure l'élément utiliser Illuminate \Auth\AuthenticationException ;

et ensuite cela fonctionne comme dans laravel 5.4

0 votes

Merci, cette solution fonctionne pour moi dans Laravel 5.5 :)

2voto

pscs Points 522

Le gestionnaire d'exception standard utilise une route nommée.

Donc, vous définissez simplement votre route pour utiliser ce nom.

Donc, dans votre routes/web.php il suffit d'ajouter la ligne :

Route::get('mylogin', 'MyLoginController@showLoginForm')->name('login');

El name('login') donne un nom à cette route, afin que l'exception non authentifiée utilise cette route.

Vous n'avez pas besoin de vous embêter à créer votre propre gestionnaire d'exceptions ou à modifier le gestionnaire d'exceptions standard.

Les routes nommées utilisées par le code passe-partout "auth" peuvent être trouvées dans le fichier vendor/laravel/framework/src/Illuminate/Routing/Router.php dans le fichier auth() fonction. (login, logout, register, password.request, password.email et password.reset). Ces routes sont ajoutées lorsque vous utilisez la fonction Route::auth(); dans le fichier de route.

0 votes

Merci pour cette solution simple au problème, je ne sais pas pourquoi personne d'autre n'a upvoted ceci, ceci a résolu le problème pour moi, et les réponses complexes n'ont même pas fonctionné du tout.

0 votes

Cela m'a beaucoup aidé

0voto

zardox Points 26

Ajoutez simplement une route pour la connexion dans le fichier routes :

Route::get('/login', [
   'uses' => 'UserController@getSignin',
   'as' => 'login'
]);

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