Request class return 中的授权方法可以为 HandlesAuthorization 特征定制消息吗?
Can authorize method in Request class return customized message for HandlesAuthorization trait?
我在请求 class 中有以下代码来检查用户是否有权执行更新。
HandlesAuthorization trait
,默认给出默认消息。有什么办法可以return定制留言吗?我看到Request class
中的授权方法只能return boolean
值。
class UpdateRoleRequest extends Request
{
private $UserPermissionsSession;
public function __construct(IRole $Role) {
$this->UserPermissionsSession = new UserPermissionsSession();
}
public function authorize() {
$UserID = \Auth::user()->UserID;
return $this->UserPermissionsSession->CheckPermissionExists($UserID);
}
}
我认为您不应该查看 HandlesAuthorization
特征。您需要做的就是在您的请求 class.
中实现 failedAuthorization
方法
在FormRequest
class中是这样定义的:
/**
* Handle a failed authorization attempt.
*
* @return void
*
* @throws \Illuminate\Auth\Access\AuthorizationException
*/
protected function failedAuthorization()
{
throw new AuthorizationException('This action is unauthorized.');
}
所以您只需要在 UpdateRoleRequest
class 中覆盖此方法,例如:
protected function failedAuthorization()
{
throw new \Illuminate\Auth\Access\AuthorizationException('User has to be an admin.');
}
为回答@Pooria Honarmand 的问题的其他人提供解决方案;
如果您已经在 authorize
方法中检查过针对不同条件的更具体的消息,并且您不想在此处重复这些检查,只需引入一个或多个基于 class 的变量。
这是一个只有一个条件会导致非标准消息的示例:
private bool $hasMissingClientId = false;
public function authorize(): bool
{
// several other checks
if (empty($user->client_id)) {
$this->hasMissingClientId = true;
return false;
}
return true;
}
protected function failedAuthorization()
{
if ($this->hasMissingClientId) {
throw new AuthorizationException('User has to be assigned to specific client.');
}
parent::failedAuthorization();
}
我在请求 class 中有以下代码来检查用户是否有权执行更新。
HandlesAuthorization trait
,默认给出默认消息。有什么办法可以return定制留言吗?我看到Request class
中的授权方法只能return boolean
值。
class UpdateRoleRequest extends Request
{
private $UserPermissionsSession;
public function __construct(IRole $Role) {
$this->UserPermissionsSession = new UserPermissionsSession();
}
public function authorize() {
$UserID = \Auth::user()->UserID;
return $this->UserPermissionsSession->CheckPermissionExists($UserID);
}
}
我认为您不应该查看 HandlesAuthorization
特征。您需要做的就是在您的请求 class.
failedAuthorization
方法
在FormRequest
class中是这样定义的:
/**
* Handle a failed authorization attempt.
*
* @return void
*
* @throws \Illuminate\Auth\Access\AuthorizationException
*/
protected function failedAuthorization()
{
throw new AuthorizationException('This action is unauthorized.');
}
所以您只需要在 UpdateRoleRequest
class 中覆盖此方法,例如:
protected function failedAuthorization()
{
throw new \Illuminate\Auth\Access\AuthorizationException('User has to be an admin.');
}
为回答@Pooria Honarmand 的问题的其他人提供解决方案;
如果您已经在 authorize
方法中检查过针对不同条件的更具体的消息,并且您不想在此处重复这些检查,只需引入一个或多个基于 class 的变量。
这是一个只有一个条件会导致非标准消息的示例: private bool $hasMissingClientId = false;
public function authorize(): bool
{
// several other checks
if (empty($user->client_id)) {
$this->hasMissingClientId = true;
return false;
}
return true;
}
protected function failedAuthorization()
{
if ($this->hasMissingClientId) {
throw new AuthorizationException('User has to be assigned to specific client.');
}
parent::failedAuthorization();
}