【发布时间】:2023-03-09 02:35:02
【问题描述】:
我正在使用 Laravel Auth 和 Socialite 包进行社交登录。我也有不同的用户角色,并根据角色将它们重定向到不同的页面。
处理来自 LoginController > authenticated() 方法的 Auth 登录用户的重定向。
登录控制器
public function authenticated(Request $request, $user)
{
if (auth()->check()) {
if (in_array($user->role, $this->getAdminRoles())) {
return redirect(route('admin.dashboard'));
}
}
}
它工作正常并根据用户的角色重定向用户。但是,这只有在他们以传统方式登录时才有效。
如果用户使用任何社交渠道登录,则重定向不起作用。我从其处理程序方法中意识到社交登录重定向 Handel。为此,我有以下特点。所以我可以在RegisterController上使用它来避免代码重复。
SocialAuthHandler 特性
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,但后来他们在分配不同角色后登录时
【问题讨论】:
-
Laravel 的具体版本是什么?
-
@felipsmartins 我正在使用最新(当前)版本 6。*