Промежуточное ПО Laravel для контроля доступа пользователей к данным - PullRequest
0 голосов
/ 10 февраля 2019

Я использую эту структуру пользовательских уровней:

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

Мне нужно контролировать пользователей для доступа к данным в базе данных.Сотрудник может получить доступ только к тем данным, которые он хранит.Менеджер подразделения также может получить доступ к своим данным и данным своего сотрудника.Менеджер группы может получить доступ ко всем данным группы.И владелец компании может получить доступ ко всему.

У меня есть несколько таких контроллеров:

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

Какова лучшая практика в Laravel для контроля доступа к данным (не к контроллеру) в некоторыхконтроллеры, но не везде?Здесь хорошая реализация для этой проблемы?

Ответы [ 4 ]

0 голосов
/ 11 февраля 2019

Может быть, вопрос не совсем ясен, но я нашел решение:

<?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);
    }
}

Вот функция allEmployeeFaletten() User модели:

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-запросам каждый раз, когда я использую область.

0 голосов
/ 10 февраля 2019

в пути.Одно хорошее место для всего промежуточного программного обеспечения.

Route::get('/', function () {  ...  })->middleware('web');
0 голосов
/ 10 февраля 2019
Промежуточное ПО

- правильное место для контроля доступа.Для группового промежуточного программного обеспечения вы можете использовать этот формат

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

0 голосов
/ 10 февраля 2019

Вы можете создать промежуточное программное обеспечение для каждой роли, а затем в своем файле web.php использовать группы маршрутов для назначения доступа к маршрутам, к которым могут обращаться пользователи.Таким образом, для маршрута, к которому могут получить доступ как сотрудник, так и менеджер подразделения, вы передаете два промежуточных программного обеспечения, а для тех, к которым может получить доступ только менеджер группы, вы просто передаете менеджер группы.

Route::group(['middleware' => ['auth', 'group-manager','unit-manager']], 
function() {
  Route::get('client','ClientController@index'); 
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...