php - 使用 Lumen 进行简单的访问授权
问题描述
尝试用 Lumen 实现简单的访问授权。它在执行更新 (PUT) 操作时起作用。但我也想处理访问例如所有文章。
我也尝试了viewAny
orview
策略方法,但没有成功。
路由器
$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']);
});
身份验证服务提供者
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);
}
}
解决方案
根据关于授权的 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 文档 - 授权 - 使用策略授权操作 - 通过控制器助手 authorize
无需解释。
推荐阅读
- node.js - Promise 不会在 express 中间件的异步函数中解析
- c# - .NET Core 项目之间的应用链接
- c - 读取文件中的输出和排序整数留下了我找不到的空白
- android - 当我尝试编辑 EditText 视图时应用程序崩溃
- excel - 如何使用 Google Apps 脚本处理 Excel 电子表格中的数据
- python - 获取由字典组成的列表的索引名称
- metaprogramming - 使用`FALLBACK`时如何知道是否返回左值?
- python - 在烧瓶中保持模型初始化
- android - 我想在android中创建一个隐藏视图
- node.js - 无法创建数据库侦听器,同时也能够更新它。(使用 References.on 和 References.put)