【发布时间】:2020-11-27 20:39:45
【问题描述】:
尝试使用 Lumen 实现简单的访问授权。它在执行更新 (PUT) 操作时起作用。 但我也想处理访问例如所有文章。
我也尝试了viewAny 或view 策略方法但没有成功。
路由器
$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 的文档。这就是我在这里发帖的原因。
-
我将您链接到您必须如何在策略中定义该方法以及如何实际调用它的确切部分......它就在那里