【问题标题】:Dynamically permissions based on routes path in laravel via entrust通过委托基于 laravel 中的路由路径动态权限
【发布时间】:2018-05-11 13:03:35
【问题描述】:

要创建基于角色/权限的 laravel 应用程序,我正在使用 Zizaco/entrust 包。

现在我想使用一种方法,不需要将定义的权限分配给路由作为web.php 中的不同中间件,即:

首先获取所有定义的路由(通过 Route::getRoutes()->getRoutes() )并将它们中的每一个存储在 permissions 表中。

我们可以通过这段代码获取所有路由:

$routes = collect(Route::getRoutes()->getRoutes())->reduce(function ($carry = [], $route) {

            $carry[] = $route->uri();
            return $carry;
        });

另一方面,我们可以定义具有这些权限的角色,并以正常方式将其附加到用户。

现在当用户想要访问一个页面时,首先我们获取路由路径名,然后通过委托中定义的can 方法检查用户是否可以访问该路由。这可以通过一个名为checkAccess 的简单中间件来完成,例如,它作为一个路由组添加到所有路由中。像这样:

class checkAccess
{
    public function handle($request, Closure $next)
    {
        if (Auth::check()) {

           $currentName    =   Route::getCurrentRoute()->getPath();
            if (Auth::user()->can($currentName)) {
                return $next($request);
            }else{
                return response()->view('errors.403', ['prevPage'=> URL::previous()]);
            }*/

            return $next($request);
        }
        return Redirect::to('/admin/login');
    }
}

Route::middleware(['checkAccess'])->group(function () {
     //Other routes 
});

但是一个问题是一些资源路由有相同的路由路径但不同的方法访问。喜欢:

+-----------+-----------------+---------+----------------+
|  METHOD   |       URL       | Action  |   Route Name   |
+-----------+-----------------+---------+----------------+
| GET       | /photos/{photo} | show    | photos.show    |
| PUT/PATCH | /photos/{photo} | update  | photos.update  |
| DELETE    | /photos/{photo} | destroy | photos.destroy |
+-----------+-----------------+---------+----------------+

这会导致重复的权限名称,尽管它们在操作上确实不同。

我想知道是否有任何相对的方式来创建动态权限。或者在这种情况下我该怎么做才能解决这个问题?

【问题讨论】:

    标签: php laravel laravel-5.5


    【解决方案1】:

    我不确定这是否是您需要的东西,但也许它会对您有所帮助。我有模块化的应用程序结构,每个模块都有一个 route.php 文件。在该文件中,我的路线取决于许可:

    Route::get('/edit/{param?}', [
                'as' => 'get.users.edit',
                'uses' => 'UsersController@getEdit',
                'middleware' => ['permission:admin']
            ]);
    

    【讨论】:

      猜你喜欢
      • 2016-10-02
      • 2015-07-25
      • 1970-01-01
      • 2017-09-12
      • 1970-01-01
      • 2017-10-28
      • 1970-01-01
      • 2020-08-30
      • 2017-11-22
      相关资源
      最近更新 更多