Maison  >  Article  >  développement back-end  >  Explication détaillée de la vérification de l'autorisation de yii2 resetful

Explication détaillée de la vérification de l'autorisation de yii2 resetful

php中世界最好的语言
php中世界最好的语言original
2018-04-11 11:09:481701parcourir

Cette fois, je vais vous apporter une explication détaillée de la vérification de l'autorisation de yii2 resetful. Quelles sont les précautions pour la vérification de l'autorisation de yii2 resetful. Ce qui suit est un cas pratique, jetons un coup d'oeil.

Qu'est-ce qu'une API de style reposant ? Nous avons déjà écrit un grand article pour présenter ses concepts et ses opérations de base.

Maintenant que je l’ai écrit, que veux-tu dire aujourd’hui ?

Cet article est principalement écrit pour le déploiement d'API dans des scénarios réels.

Aujourd'hui, nous allons parler des problèmes de vérification d'autorisation rencontrés par les API dans ces années-là ! Ouvrage exclusif, si vous bénéficiez de sa lecture, n'oubliez pas de me donner un like.

Analyse commerciale

Comprenons d'abord toute la logique

1 L'utilisateur remplit le formulaire de connexion sur le client
2. demandes du clientInterface de connexionconnexion
3 Le serveur vérifie le compte et le mot de passe de l'utilisateur et renvoie un jeton valide au client
4 Le client obtient le jeton de l'utilisateur et le stocke sur le client. , par exemple Dans le cookie
5. Le client porte le token pour accéder à l'interface qui doit être vérifiée, comme l'interface pour obtenir les informations personnelles de l'utilisateur
6. Le serveur vérifie la validité du token, et la vérification réussit. Quoi qu'il en soit, les informations requises par le client sont renvoyées et la vérification Si la vérification échoue, l'utilisateur doit se reconnecter

Dans cet article, nous utilisons Connexion utilisateur pour obtenir les informations personnelles de l'utilisateur à titre d'exemple pour donner une explication détaillée et complète.

Ce qui précède est au centre de cet article. Ne soyez pas encore excité ou nerveux. Après l'avoir analysé, nous procéderons étape par étape avec les détails.

Travail de préparation

1. Vous devriez avoir une application API
2. Pour le client, nous allons utiliser postman pour la simulation. navigateur Le serveur n'a pas installé postman, veuillez d'abord le télécharger vous-même
3. La table utilisateur à tester doit avoir un champ api_token. Sinon, veuillez d'abord l'ajouter vous-même et assurez-vous que le champ est suffisamment long 4. L'application API a activé le routage Beautify, et configurez d'abord l'opération de connexion de type post et l'opération de test d'inscription de type get
5 Fermez la session de session du composant utilisateur

Concernant le 4ème et. 5ème points des préparations ci-dessus, nous collons le code pour une compréhension facile

'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',
    ]
   ],
  ]
 ],
 // ......
],
opération d'inscription-test Nous ajouterons un utilisateur test plus tard pour faciliter l'opération de connexion. D'autres types d'opérations devront être ajoutés ultérieurement.

Sélection de la classe d'authentification

La classe de modèle que nous avons définie dans apimodulesv1controllersUserController pointe vers la classe commonmodelsUser Afin d'illustrer les points clés, nous ne la réécrirons pas séparément ici. Cela dépend de vos besoins. . Si nécessaire, copiez ensuite une classe User séparément dans apimodels.

Pour vérifier les autorisations des utilisateurs, nous prenons yiifiltersauthQueryParamAuth comme exemple

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中文网其它相关文章!

推荐阅读:



Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn