Laravel 5.8 将参数发送到授权方法 FormRequest Class
Laravel 5.8 send parameters to authorize method FormRequest Class
我有 update
和 store
这样的方法
public function update(ContactRequest $request)
{
if (Auth::user()->can('edit_contact'))
$request->update();
else
return $this->accessDenied();
}
public function store(ContactRequest $request)
{
if (Auth::user()->can('add_contact'))
$request->store();
else
return $this->accessDenied();
}
和 authorize
在 FormRequest
class
public function authorize()
{
return \Gate::allows('test', $this->route('contact'));
}
我想像这样将权限名称传递给 authorize
方法:
public function authorize($permissionName)
{
if (Auth::user()->can($permissionName))
return \Gate::allows('test', $this->route('contact'));
}
在这样的控制器中
public function update(ContactRequest $request)
{
$request->update('edit_contact');
}
public function store(ContactRequest $request)
{
$request->store('add_contact');
}
没有直接将参数传递给表单请求的授权方法的方法,但您可以通过这种方式实现:
public function authorize()
{
$method = Request::method();
if($method == 'post') {
$permission = 'add_contact';
} elseif($method == 'put') {
$permission = 'edit_contact';
}
if (Auth::user()->can($permission))
return \Gate::allows('test', $this->route('contact'));
}
如果您使用的是 laravel 的默认值 post,请输入路由,这将帮助您解决问题。
最好为存储和更新发出两个不同的请求,无论如何你需要检查一些依赖于操作的值。
因此,您可以使用默认 laravel 的资源控制器策略方法,而不使用 Request::authorize
进行授权逻辑。
Laravel policy controller helpers
您有 3 个选项:
将您的授权方式更改为:
public function authorize()
{
return $this->user()->can(
$this->route()->getActionMethod() === 'store'
? 'add_contact'
: 'edit_contact'
)
&& \Gate::allows('test', $this->route('contact'));
}
创建您的 authorize
请求方法 return true
并通过定义另一个门来检查授权并在您的控制器上调用它:
public function authorize()
{
return true;
}
Gate::define('modify_contact', function ($user, $permissionName) {
return $user->can($permissionName)
&& $user->can('test', $request->route('contact'));
});
public function update(ContactRequest $request)
{
Gate::authorize('modify_contact', 'edit_contact');
//...
}
public function store(ContactRequest $request)
{
Gate::authorize('modify_contact', 'add_contact');
//...
}
以相同的方式定义和使用 policy,并将您的参数传递给它。
我有 update
和 store
这样的方法
public function update(ContactRequest $request)
{
if (Auth::user()->can('edit_contact'))
$request->update();
else
return $this->accessDenied();
}
public function store(ContactRequest $request)
{
if (Auth::user()->can('add_contact'))
$request->store();
else
return $this->accessDenied();
}
和 authorize
在 FormRequest
class
public function authorize()
{
return \Gate::allows('test', $this->route('contact'));
}
我想像这样将权限名称传递给 authorize
方法:
public function authorize($permissionName)
{
if (Auth::user()->can($permissionName))
return \Gate::allows('test', $this->route('contact'));
}
在这样的控制器中
public function update(ContactRequest $request)
{
$request->update('edit_contact');
}
public function store(ContactRequest $request)
{
$request->store('add_contact');
}
没有直接将参数传递给表单请求的授权方法的方法,但您可以通过这种方式实现:
public function authorize()
{
$method = Request::method();
if($method == 'post') {
$permission = 'add_contact';
} elseif($method == 'put') {
$permission = 'edit_contact';
}
if (Auth::user()->can($permission))
return \Gate::allows('test', $this->route('contact'));
}
如果您使用的是 laravel 的默认值 post,请输入路由,这将帮助您解决问题。
最好为存储和更新发出两个不同的请求,无论如何你需要检查一些依赖于操作的值。
因此,您可以使用默认 laravel 的资源控制器策略方法,而不使用 Request::authorize
进行授权逻辑。
Laravel policy controller helpers
您有 3 个选项:
将您的授权方式更改为:
public function authorize() { return $this->user()->can( $this->route()->getActionMethod() === 'store' ? 'add_contact' : 'edit_contact' ) && \Gate::allows('test', $this->route('contact')); }
创建您的
authorize
请求方法 returntrue
并通过定义另一个门来检查授权并在您的控制器上调用它:public function authorize() { return true; }
Gate::define('modify_contact', function ($user, $permissionName) { return $user->can($permissionName) && $user->can('test', $request->route('contact')); });
public function update(ContactRequest $request) { Gate::authorize('modify_contact', 'edit_contact'); //... } public function store(ContactRequest $request) { Gate::authorize('modify_contact', 'add_contact'); //... }
以相同的方式定义和使用 policy,并将您的参数传递给它。