我正在使用 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'));
}
}
}
Run Code Online (Sandbox Code Playgroud)
它工作正常并根据用户的角色重定向用户。但是,这仅在他们以传统方式登录时才有效。
如果用户使用任何社交渠道登录,重定向将不起作用。我意识到社交登录重定向 Handel 从其处理程序方法。为此,我有一个特征如下。所以我可以在 RegisterController 上使用它来避免代码重复。
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);
}
}
Run Code Online (Sandbox Code Playgroud)
问题:我如何处理社交处理程序上的重定向,以便用户根据他们的角色进行重定向。如果
admin
当时admin/dashboard
还是如果user
当时回家?好吧,这很可能不会发生在用户第一次登录时,因为默认角色将是,
user
但后来每当他们在分配不同角色后登录时
在您的SocialAuthHandler
特征中,您只是重定向到该redirectTo
属性,而不检查用户的角色。您可以通过调用该方法来实现相同的行为authenticated
。
代替:
return redirect($this->redirectTo);
Run Code Online (Sandbox Code Playgroud)
经过:
return $this->authenticated(request(), $user) ?: redirect($this->redirectTo);
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
186 次 |
最近记录: |