Laravel ограничивает область действия моделей автоматически на основе API пользователя - PullRequest
0 голосов
/ 01 марта 2019

У меня есть API, который использует токены носителя для аутентификации.Токены на предъявителя хранятся против пользователей.Существует некоторое промежуточное программное обеспечение, которое проверяет, есть ли в запросе действительный токен-носитель, а 401 - если нет.

Учитывая, что я могу вывести пользователя из токена, я хочу ограничить область поиска всех моделейв этом контроллере API, чтобы показывать только результаты с идентификатором компании пользователя.

Есть ли у Laravel какой-то изящный магический способ сделать это? Или я собираюсь снова искать пользователя вконструктор контроллера и добавление предложений where в каждое отдельное действие?


По сути, я хочу избежать этого:

public function __construct()
{
    # 401 if there isn't a valid bearer token in the request
    $this->middleware('apitokencheck');

    # Boo to this
    $user = UsersModel::where("api_token", $request->api_token)->first();
    $this->companyContext = CompaniesModel::find($user->company_id);
}

...

public function get(Request $request)
{
    # Boo to this also
    $where = [ 
        "company_id" => $this->companyContext->id
    ];

    # Filters
    return InspectionsModel::where($where)->get();
}

1 Ответ

0 голосов
/ 01 марта 2019

В качестве идеи вы могли бы создать промежуточное ПО для связи контекста компании с входящим запросом.Давайте назовем его «AddCompanyContextMiddleware», который будет выглядеть примерно так:

<?php

namespace App\Http\Middleware;

use Closure;

class AddCompanyContextMiddleware
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        $user = UsersModel::where("api_token", $request->api_token)->first();
        $request['companyContext'] = CompaniesModel::find($user->company_id);
        return $next($request);
    }
}

Теперь вы можете зарегистрировать промежуточное программное обеспечение через ядро ​​и связать его с любым количеством маршрутов, так что когда элемент управления попадет в COntroller,Ваша переменная $request уже будет содержать companyContext, а затем в контроллере вы можете использовать информацию, как вам нравится:

public function get(Request $request)
{
    $companyContext = $request->input('companyContext');
    # Boo to this also
    $where = [ 
        "company_id" => $companyContext->id
    ];

    # Filters
    return InspectionsModel::where($where)->get();
}

Имеет смысл?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...