Arhn - архитектура программирования

Модели доступны только для аутентифицированного пользователя, КОТОРЫЙ СОЗДАЛ ИХ (Laravel)

Я пишу программу, чтобы у людей был свой личный архив кулинарных рецептов.

Конструктор RecipeController содержит:

$this->middleware('auth') 

потому что только зарегистрированные пользователи могут использовать рецепты, но мне нужно также защитить доступ к моделям.

Дело в том, что пользователи могут просматривать и изменять только свои собственные рецепты.

Пример: пользователь TortelliEngineer может создать рецепт «Секретный рецепт Tortelli», используя модель Recipe; он может просматривать, обновлять и удалять свои рецепты, но никто другой не может видеть его драгоценный «Секретный рецепт Тортелли».

Итак, какой самый чистый способ?

  • Я добавил атрибут user_id в модель Recipe.
  • Я должен использовать этот параметр каждый раз, когда запрашиваю у базы данных рецепт (прощай, "findOrFail" по идентификатору).
  • Это означает, что каждый раз, когда я делаю запрос, я должен получить доступ к объекту запроса, который содержит пользователя, который содержит User_id
  • используя Auth::id() КАЖДЫЙ РАЗ, когда мне нужен один (или n) рецепт

Как это:

class RecipeRepository{


public function all(){
    return Recipe::where('user_id', Auth::id())
                ->orderBy('created_at', 'asc')
                ->get();
}

public function find($recipe_id){
    return Recipe::where('user_id', Auth::id())
                ->where('id', $recipe_id)
                ->firstOrFail();
}

Это правильно? Ты ненавидишь меня за это? Знаете ли вы лучшие или более правильные способы сделать это?


Ответы:


1

Большую часть времени я создаю метод внутри модели, чтобы проверить, авторизован ли кто-то, владелец и т. д. чего-либо.

Примером может быть:

// User model

public function owns_recipe($recipe)
{

    return ($recipe->user_id == $this->id);

}

Вы можете вызвать это в самом начале методов вашего контроллера:

// Controller

public function index (Request $request)
{

    $recipe = Recipe::find($request->id); // Get recipe

    $user = ... // Get user somehow

    if (!$recipe) App::abort(404); // Show 404 not found, or something

    if (!$user->owns_recipe($recipe)) App::abort(403); // Show 403 permission denied, or something


    ... // Do whatever you want :)

}
09.09.2016
  • Красиво и понятно! 09.09.2016

  • 2

    Хотя есть много способов приблизиться к этому, Laravel предоставляет некоторые встроенные методы для обработки общей аутентификации действий. Во-первых, я бы сделал что-то вроде того, что вы намеревались (иметь метод getRecipesByOwner в RecipeRepository), и вы можете передать ему пользователя из введенного объекта Request:

    // RecipeController
    
    public function index(Request $request)
    {
        $recipes = $this->recipeRepo->findRecipesByOwner($request->user());
    }
    

    Кроме того, я бы рекомендовал создавать политики для управления тем, может ли пользователь обновлять/удалять/просматривать отдельные рецепты. Затем вы можете авторизовать их действия в файле controllers/blade templates/etc. с помощью встроенных методов, таких как:

    // Controller
    
    public function update(Request $request, Recipe $recipe)
    {
        $this->authorize('update', $recipe);
    }
    
    // Blade template
    
    @can('update', $recipe)
    
    @endcan
    

    Документация доступна по адресу: https://laravel.com/docs/5.3/authorization#creating-policies

    09.09.2016
  • В функции index() я бы предпочел управлять авторизацией внутри кода функции репозиторий->findRecipes(), поэтому мне не нужно утруждать себя внедрением Request в index() для использования $request->user в качестве параметра для репозитория. функция. 09.09.2016
  • В любом случае ваш пример очень похож на промежуточный учебник по документации Laravel, так что вы должны быть правы 09.09.2016
  • публичная функция findRecipes(){ return Auth::user()-›recipes()-›get(); } 09.09.2016
  • Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..