Routes 取决于用户角色的Laravel路由

Routes 取决于用户角色的Laravel路由,routes,laravel-5.3,roles,middleware,laravel-middleware,Routes,Laravel 5.3,Roles,Middleware,Laravel Middleware,我正在使用中间件为用户获取角色 问题是,我想如何使用路线。我希望每个用户都能够转到/dashboard,它知道他们的角色,并将他们发送到正确的路径 调试后,我可以看到第一个路由被忽略,而最后一个路由被忽略,因此如果用户不是管理员,他们会收到一条错误消息,说权限不足 是否有一种方法可以调整我的中间件或路由,以便任何用户都可以转到/dashboard,并获得与其角色相关的路由 Routes.php Auth::routes(); Route::group([ 'prefix' => 'das

我正在使用中间件为用户获取角色

问题是,我想如何使用路线。我希望每个用户都能够转到
/dashboard
,它知道他们的角色,并将他们发送到正确的路径

调试后,我可以看到第一个路由被忽略,而最后一个路由被忽略,因此如果用户不是管理员,他们会收到一条错误消息,说权限不足

是否有一种方法可以调整我的中间件或路由,以便任何用户都可以转到
/dashboard
,并获得与其角色相关的路由

Routes.php

Auth::routes();

Route::group([ 'prefix' => 'dashboard'], function () {
    // User Dashboard
    Route::get('/', ['as' => 'dashboard-user', 'middleware' => 'roles', 'roles' => ['user'], 'uses' => 'DashboardController@user']);
    // Admin Dashboard
    Route::get('/', ['as' => 'dashboard-admin', 'middleware' => 'roles', 'roles' => ['admin'], 'uses' => 'DashboardController@admin']);
});
CheckRole.php

namespace App\Http\Middleware;
use Closure;

class CheckRole
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        if ($request->user() === null) {
            return response("Insufficient permissions", 401);
        }

        $actions = $request->route()->getAction();
        $roles = isset($actions['roles']) ? $actions['roles'] : null;

        if ($request->user()->hasAnyRole($roles) || !$roles) {
            return $next($request);
        }

        return response("Insufficient permissions", 401);
    }
}
User.php

namespace App;

use Illuminate\Notifications\Notifiable;
use Illuminate\Foundation\Auth\User as Authenticatable;

class User extends Authenticatable
{
    use Notifiable;

    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = [
        'name', 'email', 'password',
    ];

    /**
     * The attributes that should be hidden for arrays.
     *
     * @var array
     */
    protected $hidden = [
        'password', 'remember_token',
    ];

    public function roles()
    {
        return $this->belongsToMany('App\Role', 'user_role', 'user_id', 'role_id');
    }

    public function hasAnyRole($roles)
    {
        if (is_array($roles)) {
            foreach ($roles as $role) {
                if ($this->hasRole($role)) {
                    return true;
                }
            }
        } else {
            if ($this->hasRole($roles)) {
                return true;
            }
        }
        return false;
    }

    public function hasRole($role)
    {
        if ($this->roles()->where('name', $role)->first()) {
            return true;
        }
        return false;
    }
}
Kernel.php

namespace App\Http;

use App\Http\Middleware\CheckRole;
use Illuminate\Foundation\Http\Kernel as HttpKernel;

class Kernel extends HttpKernel
{
    ...
    ...
    ...

    /**
     * The application's route middleware.
     *
     * These middleware may be assigned to groups or used individually.
     *
     * @var array
     */
    protected $routeMiddleware = [
        'auth' => \Illuminate\Auth\Middleware\Authenticate::class,
        ...
        ...
        'roles' => \App\Http\Middleware\CheckRole::class
    ];
}

如果你想做类似的事情,你能找到解决方案吗?我试图在我的路由文件中使用Auth::user(),然后需要一组管理路由或用户路由,但Auth::user()未设置,即使我登录有点晚,但我使用了Laratrust