Простая авторизация доступа с помощью Lumen - PullRequest
0 голосов
/ 07 августа

Попытка реализовать простую авторизацию доступа с помощью Lumen. Он работает при выполнении действия обновления (PUT). Но я также хотел бы обрабатывать доступ, например, ко всем статьям.

Я также пробовал метод политики viewAny или view, но безуспешно.

Router

$router->group(['prefix' => 'api/v1'], function () use ($router) {
    $router->get('articles',  ['uses' => 'ArticleController@showAllArticles']);
    $router->get('articles/{id}', ['uses' => 'ArticleController@showOneArticle']);
    $router->post('articles', ['uses' => 'ArticleController@create']);
    $router->delete('articles/{id}', ['uses' => 'ArticleController@delete']);
    $router->put('articles/{id}', ['uses' => 'ArticleController@update']);
});

AuthServiceProvider

class AuthServiceProvider extends ServiceProvider
{
    public function boot()
    {
        Gate::policy('App\Article', 'App\Policies\ArticlePolicy');

        $this->app['auth']->viaRequest('api', function ($request) {
            return app('auth')->setRequest($request)->user();
        });
    }
}

Политики

namespace App\Policies;

use App\User;
use App\Article;

class ArticlePolicy
{
    public function showAllArticles(User $user, Article $post)
    {
        // not working
        return true;
    }

    public function update(User $user, Article $post)
    {
        // this works
        return true;
    }
}

Контроллер

namespace App\Http\Controllers;

use App\Article;
use Illuminate\Http\Request;

class ArticleController extends Controller
{
    public function __construct()
    {
        $this->middleware('auth:api');
    }

    public function showAllArticles()
    {
        $this->authorize('showAllArticles');
        return response()->json(Article::all());
    }

    public function showOneArticle($id)
    {
        return response()->json(Article::find($id));
    }


    public function update($id, Request $request)
    {
        $article = Article::findOrFail($id);
        $this->authorize('update', $article);
        $article->update($request->all());

        return response()->json($article, 200);
    }
}

1 Ответ

0 голосов
/ 07 августа

Согласно документации Laravel по авторизации:

"При определении методов политики, которые не будут получать экземпляр модели, например, метод create, он не получит экземпляр модели. . Вместо этого вы должны определить метод как только , ожидая аутентифицированного пользователя: "

public function create(User $user)

Итак:

public function showAllArticles(User $user)

" Как Ранее обсуждалось, что некоторые действия, такие как create, могут не требовать экземпляра модели. В таких ситуациях вы должны передать имя класса методу authorize. Имя класса будет использоваться для определения того, какую политику использовать при авторизации действия: "

$this->authorize('create', Post::class);

Итак:

$this->authorize('showAllArticles', Article::class);

Laravel 7.x Документы - Авторизация - Написание политик - Методы без моделей

Laravel 7.x Документы - Авторизация - Авторизация действий с использованием политик - через Controller Helper authorize

Никаких объяснений не требуется.

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