Maison  >  Article  >  développement back-end  >  Vérification de l'autorisation de yii2 resetful

Vérification de l'autorisation de yii2 resetful

不言
不言original
2018-04-19 14:13:171557parcourir

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. le client demande la connexion à l'interface de connexion
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 dans le client tel qu'un cookie<.>5 .Le client transporte le token pour accéder aux interfaces qui doivent être vérifiées, comme l'interface permettant d'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, il renvoie. les informations dont le client a besoin. Si la vérification échoue, l'utilisateur doit réessayer de se connecter

Dans cet article, nous prenons la connexion de l'utilisateur et obtenons 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. Si votre navigateur Google n'a pas installé postman, veuillez le faire. téléchargez-vous d'abord
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 permet l'embellissement de l'itinéraire et configure. postez d'abord le type de connexion. Opération et obtenez l'opération d'inscription-test de type
5. Fermez la session du composant utilisateur

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

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

Dans l'opération d'inscription-test, nous ajouterons un utilisateur test ultérieurement 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 de l'utilisateur, nous prenons yiifiltersauthQueryParamAuth comme exemple

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

Dans ce cas, toutes les opérations qui accèdent à l'utilisateur ne nécessiteraient-elles pas une authentification ? Cela ne fonctionne pas. D'où vient le jeton lorsque le client accède pour la première fois à l'opération de connexion ? YiifiltersauthQueryParamAuth fournit un attribut externe pour filtrer les actions qui ne nécessitent pas de vérification. Nous modifions légèrement la méthode des comportements de UserController

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

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

添加测试用户

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

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

usecommon\models\User;
/**
 * 添加测试用户
 */
publicfunctionactionSignupTest ()
{
 $user=newUser();
 $user->generateAuthKey();
 $user->setPassword(&#39;123456&#39;);
 $user->username =&#39;111&#39;;
 $user->email =&#39;111@111.com&#39;;
 $user->save(false);
  
 return[
  &#39;code&#39;=> 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;],
  ];

相关推荐:

Yii2.0 PHP使用Sphinx

Yii2 的控制台命令

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