Laravel 基于角色的重定向 - spatie/laravel-permission

Laravel redirect based on role - spatie/laravel-permission

我正在使用这个包 spatie/laravel-permission 我想做的是:

super-admin, admin, members 有相同的登录,登录后重定向到不同的路由。 超级管理员和管理员具有相同的重定向。所以我把这段代码。

//app\Http\Controllers\Auth\LoginController.php
protected function authenticated(Request $request, $user)
{
    if ( $user->hasAnyRole(['super-admin', 'admin']) ) {// do your margic here
        return redirect()->route('admin.dashboard');
    }

     return redirect('/home');
}

然后这是我的路线 //routes/web.php

Auth::routes();
Route::group(['middleware' => ['role:member']], function () {
    Route::get('/', 'HomeController@index')->name('home');
});
Route::group(['middleware' => ['role:super-admin|admin'], 'prefix' => 'admin'], function () {
    Route::get('/', 'Admin\HomeController@dashboard')->name('admin.dashboard');
});

登录后,我想做的是当super-admin/admin访问site.com/*时应该重定向到 site.com/admin/ 因为他没有授权 因为他不是 成员 并且当 成员 访问 site.com/admin/* ,他重定向到 site.com/ 因为他不是 admin/super-admin,其余的将在未通过身份验证时转到登录页面。

显示是这样的,

它应该根据他们的角色主页重定向而不是显示 403 错误。

嗯,based on the package's middleware,不涉及重定向逻辑。它只是检查它是否具有正确的权限,如果用户没有,则抛出未经授权的异常。

您需要编写自己的自定义中间件,您将在其中检查用户是否具有适当的角色并重定向到适当的 url。一个非常简单的例子是这样的(在管理员的情况下)。

<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Support\Facades\Auth;

class CheckIfAdmin
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @param  string|null  $guard
     * @return mixed
     */
    public function handle($request, Closure $next, $guard = null)
    {
        if ( $user->hasAnyRole(['super-admin', 'admin']) ) {
            return $next($request);
        }

        return redirect('/');
    }
}

然后您将附加此中间件而不是另一个。