我正在尝试实施一项策略来阻止资源的编辑功能。
我的路线:
int main()
{
using namespace detail;
ReadStore store;
PrintConvType func = ConvWrapper<double, &Foo>;
Value result = func(3.14159, store);
std::cout << std::get<std::string>(result) << '\n';
}
我的ImageRequestPolicy
Route::resource('imagerequests', 'ImageRequestController');
但是我仍然可以访问“ imagerequests / {id} / edit”路线
class ImageRequestPolicy
{
use HandlesAuthorization;
const STATUS_EXECUTING = "executing";
public function edit(ImageRequest $imageRequest)
{
return $imageRequest->status !== self::STATUS_EXECUTING;
}
}
ImageRequest模型
/**
* The policy mappings for the application.
*
* @var array
*/
protected $policies = [
ImageRequest::class => ImageRequestPolicy::class,
];
/**
* Register any authentication / authorization services.
*
* @return void
*/
public function boot()
{
$this->registerPolicies();
//
}
编辑ImageRequestController方法
class ImageRequest extends Model
答案 0 :(得分:4)
您的编辑方法有误,它的第一个参数必须是用户:
public function edit(User $user, ImageRequest $imageRequest)
{
return $imageRequest->status !== self::STATUS_EXECUTING;
}
添加到ImageRequestController中,编辑方法:
public function edit(ImageRequest $imageRequest) {
$this->authorize('edit',$imageRequest);
...
}
$ user参数由laravel自动添加。
此外,您还需要在AuthServiceProvider中注册策略。
protected $policies = [
ImageRequest::class => ImageRequestPolicy::class,
];
并且ImageRequest必须扩展Model类。是模型还是照明\ http \ request?
您的控制器有问题。您的路线是:
/ imagerequests / 26 / edit
在您的控制器中,您正在注入一个新的空白ImageRequest,这也许就是它通过授权测试的原因。试试这个:
public function edit($id, ImageRequest $imageRequest)
{
$imageRequest = ImageRequest::findOrFail($id);
$this->authorize('edit', $imageRequest);
$requestTypes = RequestType::all();
$attachments = $this->imageRequestRepository->getAttachmentsListOfImageRequestById($id);
return view('imagerequest.edit', compact('imageRequest', 'requestTypes', 'attachments'));
}
答案 1 :(得分:0)
使用中间件保护路由。
use App\Post;
Route::put('/post/{post}', function (Post $post) {
// The current user may update the post...
})->middleware('can:update,post');
希望这会有所帮助。
答案 2 :(得分:0)
关卡和政策之间的差异从文档中很难理解。门用于授权控制器方法,而资源则负责授权有关模型的操作,即实际的数据库记录。
因此,在您的情况下,您应该使用门而非策略。您仍然可以使用现有的策略类,但是您必须以其他方式进行注册。而不是使用
/**
* The policy mappings for the application.
*
* @var array
*/
protected $policies = [
ImageRequest::class => ImageRequestPolicy::class,
];
/**
* Register any authentication / authorization services.
*
* @return void
*/
public function boot()
{
$this->registerPolicies();
}
您应该使用
/**
* Register any authentication / authorization services.
*
* @return void
*/
public function boot()
{
$this->registerPolicies();
Gate::resource('imageRequests', App\Policies\ImageRequestPolicy::class);
}
要进一步参考,请查看documentation on gates。