【问题标题】:Simple access authorization with Lumen使用 Lumen 进行简单的访问授权
【发布时间】:2020-11-27 20:39:45
【问题描述】:

尝试使用 Lumen 实现简单的访问授权。它在执行更新 (PUT) 操作时起作用。 但我也想处理访问例如所有文章。

我也尝试了viewAnyview 策略方法但没有成功。

路由器

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

【问题讨论】:

  • 它应该如何知道showAllArticles 与什么有关?它需要知道模型,以便它可以将其与策略匹配......而且实际方法不会在其定义中采用模型的实例,因为您没有传递一个
  • 不太清楚。 showAllArticles 用于传递数据。授权不起作用。我应该在哪里传递模型才能让它工作?
  • 在策略的授权文档中,您将在许多地方(用于调用门/策略)看到文本“不需要模型的操作”来定义它们以这种方式使用:@987654321 @
  • 阅读 Lumen 和 Laravel 的文档。这就是我在这里发帖的原因。
  • 我将您链接到您必须如何在策略中定义该方法以及如何实际调用它的确切部分......它就在那里

标签: php laravel lumen


【解决方案1】:

根据关于授权的 Laravel 文档:

“当定义不接收模型实例的策略方法时,例如 create 方法,它不会接收模型实例。相反,您应该将方法定义为 only认证用户:"

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 Docs - Authorization - Writing Policies - Methods without Models

Laravel 7.x Docs - Authorization - Authorizing Actions Using Policies - via Controller Helperauthorize

无需解释。

【讨论】:

  • 真的需要将 User 和 Atricle 注入 showAllArticles 方法吗?什么都没有做。因此,所需要的只是将 Article Class 名称附加到 authorize 方法以确定正确的策略。简单易懂的解释。
  • 这些不是注入的,它们在被门调用时被传递......是的,文档对如何处理这些事情有一个非常简单的解释,因为我只需要参考 2 段跨度>
  • 最有可能的误解是人们没有将他们可能没有将实例传递给 authorize 的事实或一般意义上的“没有模型的方法”的意思联系起来
猜你喜欢
  • 2018-04-12
  • 2017-04-16
  • 2016-09-05
  • 1970-01-01
  • 2020-04-25
  • 1970-01-01
  • 2014-05-09
  • 2020-02-29
  • 2021-03-03
相关资源
最近更新 更多