Как аутентифицировать указанный c маршрут к пользователю с указанной c ролью в laravel Milldeware - PullRequest
2 голосов
/ 25 февраля 2020

У меня есть несколько пользователей с несколькими разрешениями. Пользователь может принадлежать только к одной роли, но эта роль может иметь несколько разрешений, таких как create, read, update, delete. И у меня есть RoleMiddleware. Я аутентифицирую пользователя в roleMiddleware. Но как я могу защитить routes в RoleMiddleware от определенного пользователя c?

Например, у меня есть маршрут create-case, доступ к которому возможен только с помощью operator или Admin иначе все перенаправляют на 404 error как я могу справиться с этим в RoleMiddleware.

Я написал базовый c код для аутентификации, где каждый пользователь со своими ролями проходит аутентификацию, но я получаю, как я могу код в промежуточном программном обеспечении, поэтому любой маршрут, когда пользователь нажимает его, может go к 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);
                }
            }
        }
    }
}

Контроллер корпуса:

<?php

namespace App\Http\Controllers\Cases;

use App\Http\Controllers\Controller;
use App\Http\Requests\CaseStoreRequest;
use Illuminate\Support\Facades\Auth;
use Session;

class CaseController extends Controller
{
    use DropzoneFileUploadTraits;

    public function __construct()
    {
        $this->middleware('role');

    }

    public function index()
    {
        $data['portal'] = Portal::all();
        $data['operators'] = Operator::all();

        return view('case', $data);
    }

    public function caseList()
    {
        $user = new User();
        $isAdmin = $user->isAdmin();

        $loggedIn = Auth::id();

        $cases = Cases::with('patients', 'portal')
            ->when(!$isAdmin, function ($query) use ($loggedIn) {
                return $query->where('user_id', $loggedIn);
            })->orderBy('created_at', 'desc')->get();

        $data['cases'] = $cases;

        return view('case_list', $data);
    }
}

Маршрут:

Route::get('create-case', 'Cases\CaseController@index')->name('create-case');
Route::post('case-submit', 'Cases\CaseController@caseSubmit')->name('case-submit');
Route::post('edit-patient-case-submit', 'Cases\CaseController@editPatientCaseSubmit')->name('edit-patient-case-submit');
Route::get('case-list', 'Cases\CaseController@caseList')->name('case-list');

Ответы [ 2 ]

1 голос
/ 25 февраля 2020

Лучший способ сделать это аккуратно - создать политики для целевых объектов. Laravel политики позволяют:

  • Привязать логи авторизации маршрута c к действию политики

  • Легко вызвать результат действия политики из любого места в проекте (представления, контроллеры и т. д.).

Тема хорошо описана в Laravel документации, поэтому я предлагаю вам go и посмотрите. Не забудьте зарегистрировать политику и связать ее с вашей моделью.

Кроме того, это должно сработать.

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');
0 голосов
/ 25 февраля 2020

Я только что изучил и внедрил 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;

    }
}
...