为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

PHP
POPMUISE 2022-10-09 19:57:47
我有多个具有多种权限的用户。一个用户可以属于唯一的单个角色,但该角色可以具有多个权限,例如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);                }            }        }    }}
查看完整描述

2 回答

?
智慧大石

TA贡献1946条经验 获得超3个赞

以干净的方式做到这一点的最佳方法是在目标实体上创建策略。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');



查看完整回答
反对 回复 2022-10-09
?
撒科打诨

TA贡献1934条经验 获得超2个赞

我刚刚学习并实施了 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;


    }

}


查看完整回答
反对 回复 2022-10-09
  • 2 回答
  • 0 关注
  • 102 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号