【发布时间】:2017-01-18 12:55:12
【问题描述】:
我一直在关注 Laravel 授权文档,试图通过使用策略来构建“用户是否允许这样做”功能,但我无法让它工作。我不断收到This action is unauthorized,我也尝试过使用路由中间件。
PagePolicy.php:
namespace App\Policies;
use App\Models\User;
use App\Models\Page;
use Illuminate\Auth\Access\HandlesAuthorization;
class PagePolicy
{
use HandlesAuthorization;
/**
* Determine whether the user can view the page.
*
* @param App\Models\User $user
* @param App\Models\Page $page
* @return mixed
*/
public function view(User $user, Page $page)
{
return $user->id === $page->user_id;
}
/**
* Determine whether the user can create pages.
*
* @param App\Models\User $user
* @return mixed
*/
public function create(User $user)
{
}
/**
* Determine whether the user can update the page.
*
* @param App\Models\User $user
* @param App\Models\Page $page
* @return mixed
*/
public function update(User $user, Page $page)
{
//
}
/**
* Determine whether the user can delete the page.
*
* @param App\Models\User $user
* @param App\Models\Page $page
* @return mixed
*/
public function delete(User $user, Page $page)
{
//
}
}
PageController.php:
namespace App\Http\Controllers;
use Auth;
use Carbon\Carbon;
use App\Models\Page;
use App\Http\Requests\PageRequest;
class PageController extends ApiController
{
public function createNewPage(PageRequest $request)
{
$this->authorize('create', Page::class);
$request->merge([
'user_id' => Auth::id(),
'published_at' => Carbon::now(),
]);
if (Page::create($request->all())) {
return response()->json('success', 201);
}
return response()->json('error', 500);
}
}
AuthServiceProvidor.php:
namespace App\Providers;
use App\Models\Page;
use App\Policies\PagePolicy;
use Illuminate\Support\Facades\Gate;
use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider;
class AuthServiceProvider extends ServiceProvider
{
/**
* The policy mappings for the application.
*
* @var array
*/
protected $policies = [
Page::class => PagePolicy::class,
];
/**
* Register any authentication / authorization services.
*
* @return void
*/
public function boot()
{
$this->registerPolicies();
//
}
}
【问题讨论】:
-
您确定这些 ID 匹配吗?
-
是的。我以 auth->id = 1 和 page->user_id = 1 身份登录
-
策略方法中的 dd() 怎么样?所以你可以看看它是否真的被调用了(并且对象是你期望的对象)
-
@alvaric 的回答应该是正确的。您需要将策略中的“视图”方法的代码放入您在控制器中实际调用的“创建”方法
-
感谢您的回复。我添加了代码 view() 以查看是否可以使其正常工作,但这不是(未授权),而且对我来说,在 create 中添加相同的代码是没有意义的,因为没有 user_id 直到页面已创建。文档显示 create() 方法为空laravel.com/docs/5.3/authorization#writing-policies,所以我也这样做了。这就是我感到困惑的地方。此外,我在控制器和策略中尝试添加 dd() 并在触发之前获取未经授权的错误的最佳位置在哪里。
标签: php laravel laravel-5 authorization policy