Laravel 基于角色处理 trait 中的用户重定向

Cod*_*ver 5 php laravel

我正在使用 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 上使用它来避免代码重复。

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

问题:我如何处理社交处理程序上的重定向,以便用户根据他们的角色进行重定向。如果admin当时admin/dashboard还是如果user当时回家?

好吧,这很可能不会发生在用户第一次登录时,因为默认角色将是,user但后来每当他们在分配不同角色后登录时

Chi*_*ung 1

在您的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)