如何在 laravel Milldeware 中向具有特定角色的用户验证特定路由

我有多个具有多种权限的用户。一个用户可以属于唯一的单个角色,但该角色可以具有多个权限,例如create, read, update, delete。我有一个RoleMiddleware. 我正在对用户进行身份验证roleMiddleware。但是我怎样才能防止routes特定RoleMiddleware用户呢?


例如,我有一条create-case只能由 访问的路由operator,Admin否则每个人都重定向到404 error我如何处理它RoleMiddleware。


我已经编写了用于身份验证的基本代码,其中每个具有其角色的用户都经过身份验证,但是我正在了解如何在中间件中编码,因此当用户点击它时,路由可能会转到指向角色的RoleMiddleware中间件Authenticate路由,然后给他访问权限。


角色中间件


class RoleMiddleware

{

    public function handle($request, Closure $next, $permission = null)

    {


        if (Auth::check() === false)

        {

            return redirect('login');

        }

        elseif (Auth::check() === true)

        {

            $roles = Role::all()->pluck('slug');


            if (is_null($request->user()) )

            {

                abort(404);

            }

            if (!$request->user()->hasRole($roles))

            {

                abort(404);

            }


            if ($request->user())

            {

                if ($request->user()->hasRole($roles))

                {

                    return $next($request);

                }

            }

        }

    }

}


POPMUISE
浏览 103回答 2
2回答

智慧大石

以干净的方式做到这一点的最佳方法是在目标实体上创建策略。Laravel 策略允许你:将路由授权逻辑绑定到策略操作从项目中的任何其他位置(视图、控制器等)轻松调用策略操作结果。这个主题在 Laravel 文档中有很好的介绍,所以我建议你去那里看看。不要忘记注册策略并将其绑定到您的模型。除此之外,这应该可以解决问题。class CasePolicy{    use HandlesAuthorization;    public function create(User $user){        $roles = ['operator','Admin']        return $user->hasRole($roles);    }}然后在您的路线文件中:Route::get('create-case', 'Cases\CaseController@index')->name('create-case')->middleware('can:create,App\Case');

撒科打诨

我刚刚学习并实施了 Gate 和 Policy,希望这是正确的,因为它对我有用。伟大的概念谢谢。Route::get('create-case', 'Cases\CaseController@index')->name('create-case')->middleware('can:create-case,App\Model\Case');门:class AuthServiceProvider extends ServiceProvider{    /**     * The policy mappings for the application.     *     * @var array     */    protected $policies = [        // 'App\Model' => 'App\Policies\ModelPolicy',        User::class => CreateCase::class    ];    /**     * Register any authentication / authorization services.     *     * @return void     */    public function boot()    {        $this->registerPolicies();        Gate::define('create-case','App\Policies\CreateCase@create_case');    }}政策class CreateCase{    use HandlesAuthorization;    /**     * Create a new policy instance.     *     * @return void     */    public function __construct()    {        //    }    public function create_case(User $user){        if($user->hasRole(['admin']) ||$user->hasRole(['operator']) && $user->hasPermissionTo('create')){            return true;        }else            return false;    }}
打开App,查看更多内容
随时随地看视频慕课网APP