首页 > 解决方案 > 403 用户没有正确的角色。使用facebook登录时

问题描述

我创建了 Facebook 登录,它工作正常。通过 Facebook 登录的客户将获得用户角色。

但是当该客户进入中间件角色用户的页面时,它显示 403 USER DOES NOT HAVE THE RIGHT ROLES。(普通用户可以通过)如何解决?

下面是我的代码。

网页.php

    Route::group(['middleware' => ['role:user']], function () {
        Route::get('/colors', function () {     return view('dashboard.colors'); });
    });
    Auth::routes();
    Route::get('login/facebook', 'Auth\LoginController@redirectToProvider')->name('facebook.login');
    Route::get('login/facebook/callback', 'Auth\LoginController@handleProviderCallback');

内核.php

    protected $routeMiddleware = [
        'auth' => \App\Http\Middleware\Authenticate::class,
        'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
        'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
        'admin' => \App\Http\Middleware\Admin::class,
        'role' => \Spatie\Permission\Middlewares\RoleMiddleware::class,
    ];

登录控制器.php

<?php

namespace App\Http\Controllers\Auth;

use App\Http\Controllers\Controller;
use Illuminate\Foundation\Auth\AuthenticatesUsers;
use Laravel\Socialite\Facades\Socialite;
use App\Models\User;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Auth;

class LoginController extends Controller
{

    use AuthenticatesUsers;

    /**
     * Where to redirect users after login.
     *
     * @var string
     */
    protected $redirectTo = '/notes';

    /**
     * Create a new controller instance.
     *
     * @return void
     */
    public function __construct()
    {
        $this->middleware('guest')->except('logout');
    }

    /**
     * Redirect the user to the GitHub authentication page.
     *
     * @return \Illuminate\Http\Response
     */
    public function redirectToProvider()
    {
        return Socialite::driver('facebook')->stateless()->redirect();
    }

    /**
     * Obtain the user information from GitHub.
     *
     * @return \Illuminate\Http\Response
     */
    public function handleProviderCallback()
    {
        try {
            $user = Socialite::driver('facebook')->stateless()->user();

            // All providers...     
            $saveUser = User::updateOrCreate([
                'facebook_id' => $user->getId()
            ],[
                'name' => $user->getName(),
                'email' => $user->getEmail(),
                'password' => Hash::make($user->getName().'@'.$user->getId()),
                'remember_token' => $user->token
            ]);
     
            Auth::loginUsingId($saveUser->id);
     
            return redirect()->route('dashboard.homepage');
            } catch (\Throwable $th) {
               throw $th;
            }
    }
    
}

登录.blade.php

                      <a href="{{ route('facebook.login') }}" class="btn btn-facebook btn-user btn-block">
                          <i class="fab fa-facebook-f fa-fw"></i>
                          Login with Facebook
                      </a>

移民

<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class AddFacebookIdInUsersTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::table('users', function (Blueprint $table) {
            $table->string('facebook_id')->nullable();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
    Schema::table('users', function (Blueprint $table) {
        $table->dropColumn('facebook_id');
    });
    }
}

标签: laravelfacebook

解决方案


感谢 Nuttapong Makong(https://www.facebook.com/groups/371993079543385/user/100000205153497/)回答这个问题。我必须在控制器文件中添加以下代码。

    use App\Http\Controllers\Controller;
    use Illuminate\Foundation\Auth\AuthenticatesUsers;
    use Laravel\Socialite\Facades\Socialite;
    use App\Models\User;
    use Illuminate\Support\Facades\Hash;
    use Illuminate\Support\Facades\Auth;
    use Spatie\Permission\Models\Role;
    use Spatie\Permission\Models\Permission;

并在 handleProviderCallback 函数中

    public function handleProviderCallback()
    {
        try {
            $user = Socialite::driver('facebook')->stateless()->user();

            // All providers...     
            $saveUser = User::updateOrCreate([
                'facebook_id' => $user->getId()
            ],[
                'name' => $user->getName(),
                'email' => $user->getEmail(),
                'password' => Hash::make($user->getName().'@'.$user->getId()),
                'remember_token' => $user->token
            ]);
     
            if(!($saveUser ->hasRole('user'))){
                $role = Role::where('name','user')->first();
                $saveUser ->assignRole([$role->id]);
            }

            Auth::loginUsingId($saveUser->id);
     
            return redirect()->route('dashboard.homepage');
            } catch (\Throwable $th) {
               throw $th;
            }
    }

推荐阅读