J'utilise le package Laravel Auth et Socialite pour la connexion sociale. J'ai également différents rôles d'utilisateur et je les redirige sur des pages séparées en fonction des rôles.

Gestion de la redirection pour l'utilisateur Auth connecté à partir de la méthode LoginController > authenticated().

LoginController

public function authenticated(Request $request, $user)
{
    if (auth()->check()) {
        if (in_array($user->role, $this->getAdminRoles())) {
            return redirect(route('admin.dashboard'));
        }
    }
}

Il fonctionne correctement et redirige l'utilisateur en fonction de son rôle. Cependant, cela ne fonctionne que s'ils se connectent de manière traditionnelle.

Si l'utilisateur se connecte à l'aide d'un canal social, la redirection ne fonctionne pas. Je me rends compte que la redirection de connexion sociale Handel à partir de sa méthode de gestionnaire. Pour cela, j'ai un trait comme ci-dessous. Je peux donc l'utiliser sur RegisterController pour éviter la duplication de code.

SocialAuthHandler Trait

namespace App\Traits;

use App\SocialProvider;
use App\User;
use DateTime;
use Exception;
use Illuminate\Support\Facades\Auth;
use Laravel\Socialite\Facades\Socialite;

use function is_null;
use function preg_replace;
use function redirect;
use function strtolower;

trait SocialAuthHandler
{
    /**
     * Redirect the user to the GitHub authentication page.
     *
     * @param $provider
     *
     * @return \Illuminate\Http\Response|\Symfony\Component\HttpFoundation\RedirectResponse
     */
    public function redirectToProvider($provider)
    {
        return Socialite::driver($provider)->redirect();
    }

    /**
     * Obtain the user information from GitHub.
     *
     * @param $provider
     *
     * @return \Illuminate\Http\RedirectResponse|\Illuminate\Http\Response|\Illuminate\Routing\Redirector
     * @throws \Exception
     */
    public function handleProviderCallback($provider)
    {
        try {
            $socialUser = Socialite::driver($provider)->user();
        } catch (Exception $e) {
            return redirect('/');
        }

        //
        $socialProvider = SocialProvider::where('provider_id', $socialUser->getId())->first();

        if (!$socialProvider) {
            $username = $socialUser->getNickname();
            $name     = $socialUser->getName();

            if (!isset($userNickname) || is_null($userNickname)) {
                if (isset($name) && !is_null($name)) {
                    $username = strtolower(preg_replace('/\s+/', '', $name));
                } else {
                    $timeStamp = new DateTime('now');
                    $username  = $timeStamp->format('U');
                }
            }

            //create user
            $user = User::firstOrCreate(
                ['email' => $socialUser->getEmail()],
                ['username' => $username]
            );

            // mark email is verified
            // for social logged in users
            $user->markEmailAsVerified();

            $user->socialProviders()->create(
                [
                    'provider_id' => $socialUser->getId(),
                    'provider'    => $provider,
                ]
            );
        } else {
            $user = $socialProvider->user;
        }

        // log in user
        Auth::login($user, TRUE);

        return redirect($this->redirectTo);
    }
}

Question : : comment puis-je gérer la redirection sur le gestionnaire social afin que l'utilisateur redirige en fonction de son rôle. Si le admin alors admin/dashboard ou si le user alors à la maison ?

Eh bien, il est fort probable que cela ne se produise pas lors de la première connexion de l'utilisateur, car le rôle par défaut sera user, mais plus tard, chaque fois qu'il se connectera après avoir attribué un rôle différent.

5
Code Lover 17 févr. 2020 à 17:24

1 réponse

Meilleure réponse

Dans votre trait SocialAuthHandler, vous redirigez simplement vers la propriété redirectTo sans vérifier le rôle de l'utilisateur. Vous pouvez obtenir le même comportement en appelant la méthode authenticated.

Remplacer:

return redirect($this->redirectTo);

Par:

return $this->authenticated(request(), $user) ?: redirect($this->redirectTo);
1
Chin Leung 17 févr. 2020 à 15:12