Laravel обрабатывает перенаправление пользователя в признаке на основе роли - PullRequest
5 голосов
/ 17 февраля 2020

Я использую пакет Laravel Auth and Socialite для входа в социальную сеть. У меня также есть разные роли пользователей, и я перенаправляю их на отдельные страницы в зависимости от ролей.

Обработка перенаправления для авторизованного пользователя, авторизованного по методу LoginController > authenticated().

LoginController

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

Он работает правильно и перенаправляет пользователя в зависимости от его роли. Однако это работает, только если они входят в систему традиционным способом.

Если пользователь входит в систему через любой социальный канал, перенаправление не работает. Я понимаю, что перенаправление Social Login Генделя от его метода-обработчика. Для этого у меня есть черта, как показано ниже. Так что я могу использовать его на RegisterController, чтобы избежать дублирования кода.

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);
    }
}

Вопрос: как я могу обработать перенаправление в обработчике социальных сетей поэтому пользователь будет перенаправлять на основе своей роли. Если admin, то admin/dashboard или, если user, то дома?

Что ж, скорее всего, это может не произойти при первом входе пользователя в систему, поскольку роль по умолчанию будет user, но позже, когда он будет входить в систему после назначения другой роли

1 Ответ

1 голос
/ 17 февраля 2020

В свойстве SocialAuthHandler вы просто перенаправляете на свойство redirectTo без проверки роли пользователя. Вы можете добиться того же поведения, вызвав метод authenticated.

Заменить:

return redirect($this->redirectTo);

На:

return $this->authenticated(request(), $user) ?: redirect($this->redirectTo);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...