web-dev-qa-db-fra.com

Yii2 guide pas à pas sur la connexion depuis la table dans MySQL

Je commence à faire les premiers pas dans Yii2. Jusqu'à présent, j'ai pu écrire une application et y connecter une table d'une base de données, tout comme j'ai appris à le faire dans Yii1.

La table est contacts et le formulaire dans ma vue Créer envoie les données à la base de données sans aucun problème.

Le problème est que je ne peux me connecter qu'avec Admin/Admin ou une démonstration/démonstration dans le modèle d'utilisateur statique intégré à Yii2.

Dans Yii1.xx, je parviens à valider la connexion à partir d'une table de la base de données utilisant COMPONENTS/useridentity, comme ceci (j'ai utilisé une table nommée utilizador, avec les champs id, utilizador et password):

class UserIdentity extends CUserIdentity
{

    public function authenticate() {
       $conexao=Yii::app()->db;
       $consulta="select utilizador,password from utilizador ";
       $consulta.="where utilizador='".$this->username."' and ";
       $consulta.="password='".$this->password."'";

       $resultado=$conexao->createCommand($consulta)->query();

       $resultado->bindColumn(1,$this->username);
       $resultado->bindColumn(2,$this->password);

       while($resultado->read()!==false){
        $this->errorCode=self::ERROR_NONE;
        return !$this->errorCode;
       }
   }

}

Avec Yii2, j'ai lu beaucoup de tutoriels, dont un dans Stack Overflow, mais aucun d'eux ne m'éclaire sur la procédure permettant de connecter des utilisateurs avec un nom d'utilisateur et un mot de passe à partir d'une base de données MySQL. Yii2 n’a pas de composants/useridentity.php et je ne sais pas par où commencer ni quel est le code approprié pour que cela fonctionne en remplaçant le modèle utilisateur statique qui sort de la boîte.

J'ai également essayé une extension Yii2-user, lisez le guide PDF mais ne comprenez pas comment appeler l'itinéraire depuis le dossier du fournisseur dans mes contrôleurs. Fait plusieurs essais mais tous ont échoué.

Est-ce que quelqu'un peut m'apprendre à valider la connexion depuis la base de données dans Yii2, de préférence sans utiliser d'extension?

Modifier

J'ai lu ce tutoriel dans Stack Overflow Yii Framework 2.0 Connexion avec base de données d'utilisateurs

Et également étudié le PDF de l'extension Yii2-user , mais je ne sais pas quoi faire des parties suivantes et suivantes du fichier pdf. Il parle d’itinéraires, mais je ne sais pas comment travailler avec eux:

2.3.1 Afficher les utilisateurs Route/utilisateur/admin/index affiche une liste des utilisateurs enregistrés. Vous serez en mesure de voir beaucoup d'informations utiles telles que l'heure d'enregistrement et l'adresse IP, la confirmation et l'état du blocage, etc.

J'ai aussi lu ceci: http://www.yiiframework.com/doc-2.0/yii-web-user.html Mais je ne le fais pas 'pense pas qu'il a les étapes pour résoudre mon problème.

EDIT 2

J'ai essayé d'implémenter le modèle utilisateur et le modèle LoginForm dans le modèle de base Yii pour valider les connexions des utilisateurs. Créé une base de données et connecté à elle. La base de données en tant qu'utilisateur de la table et les champs nom d'utilisateur, mot de passe, authKey, acessToken sont renseignés avec des valeurs. Extension du modèle utilisateur à partir de ActiveRecord et implémentation\yii\web\IdentityInterface afin de permettre aux fonctions Yii2 intégrées de fonctionner correctement. Également écrit la méthode public static function tableName () {return 'user'; }

Chaque fois que j'essaie de me connecter, il renvoie -> nom d'utilisateur ou mot de passe incorrect, du mot de passe validatepassword () dans LoginForm Model.

Voici mon code: LoginForm Model:

namespace app\models;

use Yii;
use yii\base\Model;

/**
 * LoginForm is the model behind the login form.
 */
class LoginForm extends Model
{
public $username;
public $password;
public $rememberMe = true;

private $_user = false;

/**
 * @return array the validation rules.
 */
public function rules()
{
    return [
        // username and password are both required
        [['username', 'password'], 'required'],
        // rememberMe must be a boolean value
        ['rememberMe', 'boolean'],
        // password is validated by validatePassword()
        ['password', 'validatePassword'],
    ];
}

/**
 * Validates the password.
 * This method serves as the inline validation for password.
 *
 * @param string $attribute the attribute currently being validated
 * @param array $params the additional name-value pairs given in the rule
 */
public function validatePassword($attribute, $params)
{
    if (!$this->hasErrors()) {
        $user = $this->getUser();

        if (!$user || !$user->validatePassword($this->password)) {
            $this->addError($attribute, 'Incorrect username or password.');
        }
    }
}

/**
 * Logs in a user using the provided username and password.
 * @return boolean whether the user is logged in successfully
 */
public function login()
{
    if ($this->validate()) {
        return Yii::$app->user->login($this->getUser(), $this->rememberMe ? 3600*24*30 : 0);
    } else {
        return false;
    }
}

/**
 * Finds user by [[username]]
 *
 * @return User|null
 */
public function getUser()
{
    if ($this->_user === false) {
        $this->_user = User::findByUsername($this->username);
    }

    return $this->_user;
}

}

... et voici mon modèle User.php

<?php

namespace app\models;

use yii\db\ActiveRecord;

class User extends ActiveRecord implements \yii\web\IdentityInterface
{
public $id;
public $username;
public $password;
public $authKey;
public $accessToken;

public static function tableName() { return 'user'; }

   /**
 * @inheritdoc
 */
public static function findIdentity($id) {
    $user = self::find()
            ->where([
                "id" => $id
            ])
            ->one();
    if (!count($user)) {
        return null;
    }
    return new static($user);
}

/**
 * @inheritdoc
 */
public static function findIdentityByAccessToken($token, $userType = null) {

    $user = self::find()
            ->where(["accessToken" => $token])
            ->one();
    if (!count($user)) {
        return null;
    }
    return new static($user);
}

/**
 * Finds user by username
 *
 * @param  string      $username
 * @return static|null
 */
public static function findByUsername($username) {
    $user = self::find()
            ->where([
                "username" => $username
            ])
            ->one();
    if (!count($user)) {
        return null;
    }
    return new static($user);
}

/**
 * @inheritdoc
 */
public function getId() {
    return $this->id;
}

/**
 * @inheritdoc
 */
public function getAuthKey() {
    return $this->authKey;
}

/**
 * @inheritdoc
 */
public function validateAuthKey($authKey) {
    return $this->authKey === $authKey;
}

/**
 * Validates password
 *
 * @param  string  $password password to validate
 * @return boolean if password provided is valid for current user
 */
public function validatePassword($password) {
    return $this->password === $password;
}

}

Des idées? -> Merci ...

Je ne sais pas quoi d'autre dois-je faire, peut-être qu'il y a un problème de validation du mot de passe ou de recherche du nom d'utilisateur; dans le débogage Yii2, il indique que la connexion est correcte avec la base de données mysql.

Ne pas toucher au siteController actionLogin () car il est égal au modèle avancé et je pense qu'il est préférable de le rester.

EDIT 3 -> 4 HEURES de jouer avec le code des modèles, en mettant en pratique chaque solution lue et jette toujours "Nom d'utilisateur ou mot de passe incorrect." de:

public function validatePassword($attribute, $params)
{
    if (!$this->hasErrors()) {
        $user = $this->getUser();

        if (!$user || !$user->validatePassword($this->password)) {
            $this->addError($attribute, 'Incorrect username or password.');
        }
    }
}

Je ne veux pas abandonner, mais j'envisage de revenir à l'ancien Yii1.xx. Là, je pourrais facilement interroger la base de données et faire en sorte qu'un bon système de connexion fonctionne.

5
André Castro

L'application avancée Yii2 est fournie par défaut avec un exemple de travail de la partie connexion de la base de données (je vois que les bases utilisent un nom d'utilisateur statique et un mot de passe). Vous n'avez rien à installer, il suffit de regarder le code. Installez l'application avancée et jetez un coup d'œil à l'interface.

En bref, SiteController utilise LoginModel pour la validation, puis utilise le login () du LoginModel pour connecter le modèle User au composant User.

Si vous ne souhaitez pas utiliser le modèle utilisateur, créez simplement votre propre modèle et utilisez-le. Vous ne voulez pas utiliser le composant utilisateur par défaut, créez simplement le vôtre. C'est assez facile à faire.

Éditez: Mate, supprimez les déclarations publiques de variables ci-dessous.

class User extends ActiveRecord implements \yii\web\IdentityInterface
{
public $id;
public $username;
public $password;
public $authKey;
public $accessToken;

Vous dites à Yii d'ignorer ce qui se trouve dans la base de données.

6
Mihai P.

Créez votre propre modèle et utilisez-le. Je vais poster le code ci-dessous.

1) Créez d’abord une table de base de données avec vos propres besoins.

 CREATE TABLE `q_user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `email` varchar(255) NOT NULL,
  `auth_key` varchar(32) NOT NULL,
  `password_hash` varchar(20) NOT NULL,
  `access_token` varchar(100) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8; 
  • Allez maintenant dans le générateur de modèle et créez un modèle en utilisant la table q_user

  • Il va générer un modèle QUser. Dans ce modèle, vous devrez
    implémenter l'IdentityInterface

    la classe QUser étend\yii\db\ActiveRecord implémente\yii\web\IdentityInterface 

Maintenant, implémentez toutes les méthodes. Si vous utilisez Netbeans, appuyez sur alt + enter. 

public function getAuthKey() {
        return $this->auth_key;
    }

    public function getId() {
        return $this->id;
    }

    public function validateAuthKey($authKey) {
       return $this->auth_key = $authkey;
    }

    public static function findIdentity($id) {

        return self::findOne($id);

    }

    public static function findIdentityByAccessToken($token, $type = null) {

        return $this->access_token;
    }

    public static function findByUsername($email){
        return self::findOne(['email'=>$email]);
    }

    public function validatePassword($password){
        return $this->password_hash === $password;
    }
  • Maintenant, dans le formulaire de connexion, vous devrez définir le modèle Quser afin que Renvoie l'utilisateur

    class LoginForm étend le modèle { public $ nom_utilisateur; public $ mot_passe; public $ email; public $ rememberMe = true;

    private $_user = false;
    
    
    /**
     * @return array the validation rules.
     */
    public function rules()
    {
        return [
            // username and password are both required
            [['email', 'password'], 'required'],
            // rememberMe must be a boolean value
    
            ['rememberMe', 'boolean'],
            // password is validated by validatePassword()
            ['password', 'validatePassword'],
            ['password','match','pattern'=>'$\S*(?=\S*[a-z])(?=\S*[A-Z])(?=\S*[\d])\S*$','message'=>'Password must have atleast 1 uppercase and 1 number '],
            [['password'],'string','min'=>6],
            //email validation
            ['email','email']
        ];
    }
    
    /**
     * Validates the password.
     * This method serves as the inline validation for password.
     *
     * @param string $attribute the attribute currently being validated
     * @param array $params the additional name-value pairs given in the rule
     */
    public function validatePassword($attribute, $params)
    {
        if (!$this->hasErrors()) {
            $user = $this->getUser();
    
            if (!$user || !$user->validatePassword($this->password)) {
                $this->addError($attribute, 'Incorrect username or password.');
            }
        }
    }
    
    /**
     * Logs in a user using the provided username and password.
     * @return boolean whether the user is logged in successfully
     */
    public function login()
    {
        if ($this->validate()) {
            return Yii::$app->user->login($this->getUser(), $this->rememberMe ? 3600*24*30 : 0);
        }
        return false;
    }
    
    /**
     * Finds user by [[username]]
     *
     * @return User|null
     */
    public function getUser()
    {
        if ($this->_user === false) {
            $this->_user = QUser::findByUsername($this->email);
        }
    
        return $this->_user;
    }
    

    }

Ça y est, cela résoudra votre problème. 

1
Mohan Prasad