laravel - 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');
});
}
}
解决方案
感谢 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;
}
}
推荐阅读
- php - php文件夹文件创建编码问题
- node.js - webkitRelativePath 在 expressjs 文件上传中不可用
- c# - 查询存储在字符串 Linq 中的 OrderBy 日期
- python - 找出数组中最大的元素是否至少是数组中其他数字的两倍?
- javascript - 使用 Next.js 反应 onClick 事件处理程序不起作用
- javascript - 如何将嵌套的 JSON 对象转换为 URL 查询字符串以通过 AJAX 传递?
- algorithm - 二维圆矩形碰撞和反射不起作用
- string - 字符串上的汇编函数
- php - 根据过滤值显示内容
- python - 获取python3中特定字符串部分的数据类型