【问题标题】:Laravel handle user redirection in trait based on roleLaravel 基于角色在 trait 中处理用户重定向
【发布时间】: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。*

标签: php laravel


【解决方案1】:

在您的 SocialAuthHandler 特征中,您只是重定向到 redirectTo 属性而不检查用户的角色。您可以通过调用authenticated 方法实现相同的行为。

替换:

return redirect($this->redirectTo);

作者:

return $this->authenticated(request(), $user) ?: redirect($this->redirectTo);

【讨论】:

  • 感谢您的帮助。但是,它给出了以下错误。 ErrorException Header may not contain more than a single header, new line detected
  • @CodeLover 您尝试的用户是管理员吗?你能展示更新后的控制器吗?
  • 完美。解决。只是为了学习..是什么导致了错误?
  • @CodeLover 因为您的用户很可能不是管理员,并且在您的 authenticated 方法中,没有回退。所以我为authenticated方法中没有操作的用户添加了?: redirect($this->redirectTo);
  • 我明白了。因此,如果我在authenticated() 中设置else 条件而不是SocialHandler 方法也应该有效。对吗?
猜你喜欢
  • 1970-01-01
  • 2019-05-26
  • 2020-10-23
  • 1970-01-01
  • 2016-01-17
  • 2018-04-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多