[英]Yii2 AccessControl giving Forbidden 403 when using HTTPBearerAuth in Rest API
[英]Override response of Rest authentication(HttpBearerAuth) in yii2
我有基於令牌的授權,為此我做了以下更改。
在用戶model 中,重寫findIdentityByAccessToken()
方法,如下所示。
public static function findIdentityByAccessToken($token, $type = null)
{
$userlogin = Userdevices::find()->where(['access_token' => $token])->one();
if ($userlogin == array()) {
return null;
} else {
$User = Users::findOne(['id' => $userlogin->user_id]);
if (!count($User))
{
return null;
}
else {
$dbUser = [
'id' => $User->id,
];
return new static($dbUser);
}
}
}
在 Controller 中,我添加了如下behaviors()
。
public function behaviors()
{
$behaviors[] = [
'class' => \yii\filters\ContentNegotiator::className(),
'formats' => [
'application/json' => \yii\web\Response::FORMAT_JSON,
],
];
$behaviors['authenticator'] = [
'class' => HttpBearerAuth::className(),
];
return $behaviors;
}
當 API 未獲得令牌或令牌無效時,它會給出以下響應
{
"name": "Unauthorized",
"message": "You are requesting with an invalid credential.",
"code": 0,
"status": 401,
"type": "yii\\web\\UnauthorizedHttpException"
}
我想根據我的要求更改響應,如下所示。
{
"code": 401,
"name": "Unauthorized",
"is_logout": "Y",
"status": "error",
"message": "logout"
}
您可以使用yii\web\Response
的beforeSend
事件更改響應格式。
例如,在您的 api controller 中添加以下方法:
public function init()
{
parent::init();
\Yii::$app->response->on(
\yii\web\Response::EVENT_BEFORE_SEND,
[$this, 'beforeResponseSend']
);
}
public function beforeResponseSend(\yii\base\Event $event)
{
/**
* @var \yii\web\Response $response
*/
$response = $event->sender;
if ($response->data['status'] == 401) {
$response->data = [
'code' => 401,
'name' => 'Unauthorized',
'is_logout' => 'Y',
'status' => 'error',
'message' => 'logout',
];
}
}
controller的init
方法注冊了beforeSend
事件。 beforeResponseSend
方法處理事件並更改響應格式。
如果您想在多個 controller 中格式化響應,最好將事件處理程序放入自己的 class 例如
namespace app\components;
class ErrorResponseHelper
{
public static function beforeResponseSend(Event $event)
{
// ... formating code ...
}
}
並在config/web.php
中注冊事件
return [
// ...
'components' => [
'response' => [
'class' => 'yii\web\Response',
'on beforeSend' => [
\app\components\ErrorResponseHelper::class,
'beforeResponseSend',
],
],
],
];
但是要小心這個解決方案,因為這樣\app\components\ErrorResponseHelper::beforeResponseSend
將在每個請求期間被調用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.