配置
'components' => [
'user' => [
'identityClass' => 'app\models\User',
'enableSession'=>false, #禁用session保存登录信息
'loginUrl'=>null #显示一个HTTP 403 错误而不是跳转到登录界面
],
]
User model 实现方法
public static function findIdentityByAccessToken($token, $type = null)
{
//这个可以做个缓存
return static::findOne(['access_token' => $token,'status' => self::STATUS_ACTIVE]);
}
RESTful api控制器
public function behaviors() {
return ArrayHelper::merge (parent::behaviors(), [
'authenticator' => [
'class' => HttpBearerAuth::className()
]
] );
}


如果控制器里面有些方法不需要进行认证呢
我网上找了很多资料都没找到解决方案,好像只要在behaviors开启了认证之后,控制器里面的所有方法都必须认证才能访问的,但是如果有些特殊要求,某个方法不需要认证就可以获取数据,这样的话,我想到的是重写beforeAction来实现
class DefaultController extends ActiveController
{
public $authMenu = ["yan"]; //需要认证的方法名
#注释
// public function behaviors() {
// return ArrayHelper::merge (parent::behaviors(), [
// 'authenticator' => [
// 'class' => HttpBearerAuth::className() ,
// ],
// ] );
// }
//在beforeAction处理认证
public function beforeAction($action)
{
if(in_array($action->id,$this->authMenu))
{
//需要验证才能通过的方法
$user = Yii::$app->user;
$auth = new HttpBearerAuth();
$request = Yii::$app->request;
$response = Yii::$app->response;
if(!$auth->authenticate($user,$request, $response))
{
$auth->handleFailure($response);
return false;
}
}
return parent::beforeAction($action);
}
public function actionTest()
{
echo "test1,不需要验证";
}
public function actionYan()
{
echo "yan,需要验证";
}
}
网友评论