如何检查经过身份验证的用户是否为REST resourece的处理程序

时间:2017-04-19 03:46:36

标签: rest authentication yii2 access

我在Yii2和Angular 2客户端上开发了一个REST服务。使用Bearer JWT身份验证。 例如,有一个uri:http://127.0.0.1/v1/accounts/123456/meters,它应该按帐户返回所有用户的计费表。

应用路由器规则:

'authenticator' => [
    'class' => HttpBearerAuth::className(),
    'except' => ['options']
],
'access' => [
    'class' => AccessControl::className(),
    'rules' => [
        [
            'allow' => true,
            'actions' => ['meters'],
            'roles' => ['@'],
        ]
    ]
]

控制器具有以下行为:

public function actionMeters($accountId)
{
    // Call MS SQL procedure
    $meters = Yii::$app->db->createCommand("EXEC [getMetersByAccountId] :accountId")->bindValue(':accountId', $accountId)->queryAll()
    return $meters;
}

Action AccountController :: actionMeters看起来:

<HTML><head><script>function SF(){document.getElementById('paypal_form').submit();}</script></head><body onload="SF();"><form action="https://www.paypal.com/cgi-bin/webscr" method="post" target="_top" id="paypal_form"> <input type="hidden" name="cmd" value="_s-xclick"> <input type="hidden" name="hosted_button_id" id="order_button_id" value="123123abc"> <input type="hidden" name="quantity" id="order_quantity"> <input type="hidden" name="on0" value="Name"> <input type="hidden" name="os0" value="" id="post_name"> <input type="hidden" name="on1" value="Email"> <input type="hidden" name="os1" value="" id="post_email"> <input type="hidden" name="on2" value="Phone"> <input type="hidden" name="os2" value="" id="post_tel"> <input type="submit" value="Please click here if you are not redirected." border="0" style="position:relative; top:20px; left:20px;"> <img alt="" border="0" src="https://www.paypalobjects.com/en_GB/i/scr/pixel.gif" width="1" height="1"> </form></body></HTML>

但是通过这种方式,经过身份验证的用户可以获得(如果修改GET accountId参数)米,这属于另一个用户。

我在数据库中有一个user_account表,用于链接用户和帐户,但我不知道应该在哪个应用程序位置正确执行检查。

如何检查经过身份验证的用户是否可以通过指定的accountId参数访问此资源? 谢谢。

1 个答案:

答案 0 :(得分:0)

我找到了确定访问规则中matchCallback的解决方案。现在看:

[
    'allow' => true,
    'actions' => ['meters'],
    'roles' => ['@'],
    'matchCallback' => function() {
        return Yii::$app->user->identity->user->hasAccount(Yii::$app->request->get('accountId'));
    }
],

在用户模型中定义hasAccount方法:

public function hasAccount($accountId) {
    return $this->hasOne(UserAccount::className(), ['user_id' => 'id'])->where(['account_id' => $accountId])->exists();
}

它的工作正确。这是一个合适的解决方案吗?