首页 > 解决方案 > 使用 Lumen 进行简单的访问授权

问题描述

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

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

路由器

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

标签: phplaravellumen

解决方案


根据关于授权的 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

无需解释。


推荐阅读