Laravel中间件控制用户访问DATAS

问题描述 投票:0回答:4

我使用的用户级别的这种结构:

Company Owner
- Group Manager
-- Unit Manager
---Employee

我需要控制用户访问数据库中的DATAS。员工只能访问数据单项存放着什么。该部门经理可以访问自己的DATAS和他emplyee的DATAS了。集团经理可以访问到整个集团的DATAS。而且公司所有者可以存取要求的一切。

我有一些控制器是这样的:

class ClientController extends Controller
{
        public function index()
        {
            return Client::all();
        }
        // ...
}

什么是Laravel的最佳实践,以控制某些控制器访问DATAS(不是控制器),而不是到处?在这里针对此问题的很好的执行?

laravel laravel-5 data-access-layer laravel-middleware
4个回答
2
投票

中间件是访问控制正确的地方。对于组中间件你可以使用这种格式

Route::group(['middleware' => ['role:Company Owner']], function() {
    Route::get('/', 'AdminController@welcome');
    Route::get('/manage', ['middleware' => ['permission:manage-admins'], 'uses' => 'AdminController@manageAdmins']);
});
Route::group(['middleware' => ['role:Employee']], function() {
    Route::get('/', 'AdminController@welcome');
    Route::get('/manage', ['middleware' => ['permission:manage-admins'], 'uses' => 'AdminController@manageAdmins']);
});

对于单路

Route::put('post/{id}', function ($id) {
    //
})->middleware('role:Employee');

您可以使用一个包基于用户角色的访问控制

https://github.com/Zizaco/entrust


1
投票

您可以创建一个中间件为每个角色,然后在web.php文件,使用路由组来分配访问权限,该用户可以访问的路由。所以,对于员工和部门经理可以访问的路线,你可以在两个中间件,对于那些只有群管理员才能访问,你只是通过部门经理。

Route::group(['middleware' => ['auth', 'group-manager','unit-manager']], 
function() {
  Route::get('client','ClientController@index'); 
});

0
投票

在路线。一个好地方,所有的中间件。

Route::get('/', function () {  ...  })->middleware('web');

0
投票

也许问题不是很清楚,但我找到了解决办法:

<?php

namespace App\Scopes;

use Illuminate\Database\Eloquent\Scope;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Builder;

use Auth;
use App\User;

class DataAccessScope implements Scope
{
    /**
     * Apply the scope to a given Eloquent query builder.
     *
     * @param  \Illuminate\Database\Eloquent\Builder  $builder
     * @param  \Illuminate\Database\Eloquent\Model  $model
     * @return void
     */
    public function apply(Builder $builder, Model $model)
    {
        // find the actual user
        $user_id = Auth::user()->id;
        $user = User::find( $user_id );

        // get all employees
        $employees = $user->allEmployeeFlatten();

        // get only the employee's ids
        $user_ids = $employees->pluck('id');

        // add current user's id too
        $user_ids->push( $user_id );

        // add the condition to every sql query
        $builder->whereIn('user_id', $user_ids);
    }
}

这里是User模型allEmployeeFaletten()功能:

public function allEmployeeFlatten() {
    $employees = new Collection();

    foreach ( $this->employee()->get() as $employee ) {
        $employees->push( $employee );

        // run only if the user is on a leader level
        if ( $employee->user_role_id != 5 ) {
            $employees = $employees->merge( $employee->allEmployeeFlatten() );
        }
    }

    return $employees;
}

此范围添加到所有SQL条件查询我每次使用范围的时间。

© www.soinside.com 2019 - 2024. All rights reserved.