Я использую пакет 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
, но позже, когда он будет входить в систему после назначения другой роли