ホームページ  >  記事  >  バックエンド開発  >  yii2resetfulの認可検証の詳細説明

yii2resetfulの認可検証の詳細説明

php中世界最好的语言
php中世界最好的语言オリジナル
2018-04-11 11:09:481685ブラウズ

今回は yii2 リセットフルの認証検証について詳しく説明します。 yii2 リセットフル認証検証の 注意事項 は何ですか? ここで実際のケースを見てみましょう。

Restful スタイル API とは何ですか?以前にその概念と基本操作を紹介する大きな記事を書きました。

さて、書きましたが、今日は何を言いますか?

この記事は主に実際のシナリオでの API のデプロイを目的として書かれています。

今日は、当時 API が遭遇した認可検証の問題についてお話します。独占的な作品です。読んで有益であれば、ぜひ「いいね!」をお願いします。

ビジネス分析

まず全体のロジックを理解しましょう

1. ユーザーがクライアントでログインフォームに入力します

2. ユーザーがフォームを送信し、クライアントが
ログインインターフェースログインをリクエストします3.ユーザーのアカウントとパスワードを取得し、有効なトークンをクライアントに返します
4. クライアントはユーザーのトークンを取得し、それを Cookie などのクライアントに保存します
5。ユーザーの個人情報を取得するインターフェースなどの検証
6. サーバーはトークンの有効性を検証します。検証に合格した場合は、クライアントが必要とする情報を返します。検証が失敗した場合でも、ユーザーはログを記録する必要があります。もう一度

この記事では、詳細の例として

ユーザーログインを使用してユーザーの個人情報を取得します。

上記がこの記事の焦点です。まだ興奮したり緊張したりしないでください。分析後は、段階的に詳細を説明していきます。

準備

1. API アプリケーションが必要です。
2. クライアントの場合、Postman をインストールしていない場合は、まず自分でダウンロードしてください。テスト用のユーザー テーブルには api_token フィールドが必要です。そうでない場合は、まず自分でフィールドを追加し、フィールドが十分な長さであることを確認してください。4. API アプリケーションでルーティングの整形が有効になっており、最初に post タイプのログイン操作と get タイプが設定されています。 Signup-test 操作
5. ユーザーコンポーネントのセッションセッションがクローズされます

上記準備の 4 番目と 5 番目の点について、わかりやすいようにコードを載せておきます

'components'=> [
 'user'=> [ 
  'identityClass'=>'common\models\User',
  'enableAutoLogin'=> true,
  'enableSession'=> false,
 ],
 'urlManager'=> [
  'enablePrettyUrl'=> true,
  'showScriptName'=> false,
  'enableStrictParsing'=> true,
  'rules'=> [
   [
    'class'=>'yii\rest\UrlRule',
    'controller'=> ['v1/user'],
    'extraPatterns'=> [
     'POST login'=>'login',
     'GET signup-test'=>'signup-test',
    ]
   ],
  ]
 ],
 // ......
],

signup-test 操作 後でテストユーザーを追加しますログイン操作を容易にするため。他の種類の操作は後で追加する必要があります。

認証クラスの選択

apimodulesv1controllersUserController で設定したモデル クラスは commonmodelsUser クラスを指します。重要な点を説明するため、ここでは個別に書き直しません。必要に応じて、User クラスを個別にコピーします。アピモデルへ ダウン。

ユーザー権限を確認するために、例として yiifiltersauthQueryParamAuth を取り上げます

useyii\filters\auth\QueryParamAuth;
publicfunctionbehaviors() 
{
 returnArrayHelper::merge (parent::behaviors(), [ 
   'authenticator'=> [ 
    'class'=> QueryParamAuth::className() 
   ] 
 ] );
}

如此一来,那岂不是所有访问user的操作都需要认证了?那不行,客户端第一个访问login操作的时候哪来的token,yii\filters\auth\QueryParamAuth对外提供一个属性,用于过滤不需要验证的action。我们将UserController的behaviors方法稍作修改

publicfunctionbehaviors() 
{
 returnArrayHelper::merge (parent::behaviors(), [ 
   'authenticator'=> [ 
    'class'=> QueryParamAuth::className(),
    'optional'=> [
     'login',
     'signup-test'
    ],
   ] 
 ] );
}

这样login操作就无需权限验证即可访问了。

添加测试用户

为了避免让客户端登录失败,我们先写一个简单的方法,往user表里面插入两条数据,便于接下来的校验。 

UserController增加signupTest操作,注意此方法不属于讲解范围之内,我们仅用于方便测试。

usecommon\models\User;
/**
 * 添加测试用户
 */
publicfunctionactionSignupTest ()
{
 $user=newUser();
 $user->generateAuthKey();
 $user->setPassword('123456');
 $user->username ='111';
 $user->email ='111@111.com';
 $user->save(false);
 return[
  'code'=> 0
 ];
}

如上,我们添加了一个username是111,密码是123456的用户

登录操作

假设用户在客户端输入用户名和密码进行登录,服务端login操作其实很简单,大部分的业务逻辑处理都在api\models\loginForm上,来先看看login的实现

useapi\models\LoginForm;
/**
 * 登录
 */
publicfunctionactionLogin ()
{
 $model=newLoginForm;
 $model->setAttributes(Yii::$app->request->post());
 if($user=$model->login()) {
  if($userinstanceofIdentityInterface) {
   return$user->api_token;
  }else{
   return$user->errors;
  }
 }else{
  return$model->errors;
 }
}

登录成功后这里给客户端返回了用户的token,再来看看登录的具体逻辑的实现

新建api\models\LoginForm.PHP

<?php
namespaceapi\models;
useYii;
useyii\base\Model;
usecommon\models\User;
/**
 * Login form
 */
classLoginFormextendsModel
{
 public$username;
 public$password;
 private$_user;
 constGET_API_TOKEN =&#39;generate_api_token&#39;;
 publicfunctioninit ()
 {
  parent::init();
  $this->on(self::GET_API_TOKEN, [$this,&#39;onGenerateApiToken&#39;]);
 }
 /**
  * @inheritdoc
  * 对客户端表单数据进行验证的rule
  */
 publicfunctionrules()
 {
  return[
   [[&#39;username&#39;,&#39;password&#39;],&#39;required&#39;],
   [&#39;password&#39;,&#39;validatePassword&#39;],
     ];

相信看了本文案例你已经掌握了方法,更多精彩请关注php中文网其它相关文章!

推荐阅读:



以上がyii2resetfulの認可検証の詳細説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。