我是yii2中的新用户,我希望登录用户使用rest api但无法执行此操作。我已从此博客设置基本REST API:
budiirawan.com/setup-restful-api-yii2 /
之后我创建了:
API \模块\ V1 \控制器\ SiteController.php
<?php
namespace api\modules\v1\controllers;
use Yii;
use yii\filters\AccessControl;
use yii\web\Controller;
use common\models\LoginForm;
use yii\filters\VerbFilter;
use yii\rest\ActiveController;
/**
* Site controller
*/
class SiteController extends ActiveController
{
/**
* @inheritdoc
*/
public $modelClass = 'api\modules\v1\models\user';
public function actionIndex()
{
if (!\Yii::$app->user->isGuest) {
return $this->goHome();
}
$model = new LoginForm();
if ($model->load(Yii::$app->request->post()) && $model->login()) {
return $this->goBack();
} else {
return $this->render('login', [
'model' => $model,
]);
}
}
public function actionLogout()
{
Yii::$app->user->logout();
return $this->goHome();
}
}
创建模型
RtWorkForce \ API \模块\ V1 \模型\ user.php的
<?php
namespace api\modules\v1\models;
use \yii\db\ActiveRecord;
/**
* User Model
*
*/
class User extends ActiveRecord
{
/**
* @inheritdoc
*/
public static function tableName()
{
return '{{%user}}';
}
}
这是我的main.php
<?php
$params = array_merge(
require(__DIR__ . '/../../common/config/params.php'),
require(__DIR__ . '/../../common/config/params-local.php'),
require(__DIR__ . '/params.php'),
require(__DIR__ . '/params-local.php')
);
return [
'id' => 'app-api',
'basePath' => dirname(__DIR__),
'bootstrap' => ['log'],
'modules' => [
'v1' => [
'basePath' => '@app/modules/v1',
'class' => 'api\modules\v1\Module'
]
],
'components' => [
'request' => [
'parsers' => [
'application/json' => 'yii\web\JsonParser',
]
],
'user' => [
'identityClass' => 'common\models\User',
'enableAutoLogin' => false,
],
'log' => [
'traceLevel' => YII_DEBUG ? 3 : 0,
'targets' => [
[
'class' => 'yii\log\FileTarget',
'levels' => ['error', 'warning'],
],
],
],
'urlManager' => [
'enablePrettyUrl' => true,
'enableStrictParsing' => true,
'showScriptName' => false,
'rules' => [
[
'class' => 'yii\rest\UrlRule',
'controller' => ['v1/country','v1/user','v1/site'],
'tokens' => [
'{id}' => '<id:\\w+>'
]
]
],
]
],
'params' => $params,
];
但是,我不工作,我不知道我错在哪里?
答案 0 :(得分:4)
来自Yii 2.0 REST Authentication docs:
与Web应用程序不同,RESTful API通常是无状态的 意味着不应使用会话或cookie。
关于实施 yii \ web \ IdentityInterface 的用户类的this other docs:
如果您的应用程序是纯粹的无状态RESTful应用程序,那么您会这样做 只需要实现findIdentityByAccessToken()和getId() 将所有其他方法留空。
RESTfull是关于路由的。如果遵循基于令牌的身份验证,那么,如果发送到服务器的请求持有有效的令牌,则应返回资源或集合。否则应该被拒绝。
在这种情况下,登录过程是一个请求,其中包含用户名/密码对,将由服务器与有效的令牌交换,即令牌您将包含所有下一个请求。
如果在Yii文档(参见上面的链接)中所述的enableSession
设置为false
,则在服务器端禁用会话通过REST的无状态性质,\Yii::$app->user->isGuest
不应该提供信息,因为您的服务器没有任何会话来获取它。 (除非它验证令牌有效性而不是检查会话)
在构建扩展yii\rest\ActiveController的课程时,您无法呈现如下的html页面:
return $this->render('login', [
'model' => $model,
]);
或重定向到不同的HTML页面,如:
return $this->goHome();
在构建基于HTML的网络应用而非yii\base\Controller时,这将适用于yii\rest\ActiveController。使用ActiveController,您只需返回在输出之前将序列化为 json 或 xml 的数据。
有关详细信息,请参阅Yii RESTful API framework documentations。然后,您可以在这个关于如何实现Yii2 REST身份验证的精彩教程中找到有用的信息:
http://blog.neattutorials.com/angularjs-and-yii2-part-2-authentication/