Yii2 étape par guide pas à pas lors de la connexion à partir de la table dans MySQL
Je suis en commençant à faire les premiers pas dans Yii2. Jusqu'à présent, j'ai été capable d'écrire une application et se connecter à une table dans une base de données, tout comme j'ai appris à faire dans Yii1.
La table est contacts
et la forme dans ma vue de créer envoie les données à la base de données sans problèmes.
Le problème est que je ne pouvez vous connecter en utilisant Admin/Admin ou demo/demo dans la statique du modèle utilisateur qui vient intégré dans Yii2.
Dans Yii1.xx j'ai réussi à valider la connexion à partir d'une table dans la base de données à l'aide de COMPOSANTS/useridentity, juste comme ça (j'ai utilisé une table nommée utilizador
, avec des 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 une à Débordement de Pile, mais aucun d'eux ne m'éclairer sur la procédure de connexion des utilisateurs avec le nom d'utilisateur et le mot de passe à partir d'une base de données MySQL. Yii2 n'ont pas components/useridentity.php et je ne sais pas par où commencer et quel est le bon code pour le faire fonctionner substitution de la statique de l'utilisateur modèle qui sort de la boîte.
J'ai aussi essayé une extension Yii2-utilisateur, veuillez lire le guide au format PDF mais ne savait pas comment appeler du parcours du vendeur dossier dans mes contrôleurs. Fait plusieurs essais, mais tous ont échoué.
Quelqu'un peut m'enseigner comment valider la connexion à partir de la base de données dans Yii2, de préférence sans utiliser une extension?
Modifier
J'ai lu ce tutoriel dans le Débordement de la Pile
Yii Framework 2.0 Connexion Avec La Base De Données Utilisateur
Et a également étudié le fichier PDF à partir de Yii2 de l'utilisateur de l'extension, mais vous ne savez pas quoi faire avec la partie suivante et à côté de la pdf. On parle de routes, mais je ne sais pas comment travailler avec eux:
2.3.1 Afficher les utilisateurs
Itinéraire /utilisateur/admin/index affiche une liste des utilisateurs enregistrés. Vous serez en mesure de voir beaucoup d'informations utiles telles que l'enregistrement du temps et de l'adresse ip, de la confirmation et de l'état de blocage, etc.
J'ai aussi lu ceci:
http://www.yiiframework.com/doc-2.0/yii-web-user.html
mais je ne pense pas qu'il a les étapes pour résoudre mon problème.
EDIT 2
J'ai essayé de mettre en œuvre le Modèle de l'Utilisateur et LoginForm Modèle dans Yii modèle de base pour valider les connexions de l'utilisateur. Créé une base de données et coneected. La base de données dans une table utilisateur et les champs nom d'utilisateur, mot de passe, authKey, acessToken remplis avec des valeurs. Étendu le Modèle de l'Utilisateur à partir de ActiveRecord et mis en œuvre \yii\web\IdentityInterface afin de rendre la Yii2 fonctions de faire leur travail. Aussi wrrited la méthode public static function tableName() { return 'utilisateur'; }
Chaque fois que j'essaie de vous connecter, cela jette -> nom d'utilisateur ou mot de passe incorrect, de la validatepassword() dans LoginForm Modèle.
Voici mon code:
LoginForm Modèle:
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 c'est là mon User.php Modèle
<?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, il a peut-être un problème de validation du mot de passe ou de trouver le nom d'utilisateur, Yii2 debug il montre qui est le propre connecté à la base de données mysql.
N'avez pas touché à la siteController actionLogin() car elle est égale à l'avancée de modèle et je pense qu'il est préférable de rester de cette façon.
MODIFIER 3 -> 4 HEURES de jouer avec les modèles de code, de mettre en pratique chaque solution, j'ai lu et ça en jette toujours "nom d'utilisateur Incorrect ou un mot de passe." à partir 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 je suis envisagent de revenir à l'ancienne Yii1.xx. Là, j'ai pu facilement interroger la base de données et de faire un bon système d'ouverture de session de travail.
Je comprends vos préoccupations et ont édité la question selon elle. Pour l'instant je n'ai pas le code pour afficher parce que la tente n'a pas de travail et que mon projet de sortie des erreurs, et est devenu inutilisable.
Quel genre de réponse sont d'après vous? Si c'est "un exemple de travail", alors je pense que cela va venir dans le cadre du "trop large" de la catégorie (c'est à dire les réponses devront être importante, et peut ne pas fonctionner dans votre cas d'utilisation). L'officiel docs ont pas un tutoriel qui contient un exemple de travail?
il semble que ça va aider et trop.
Pas de. Je ne peux pas faire le code dans les documents de travail. Peut-être, parce que je suis nouveau sur Yii2.
OriginalL'auteur André Castro | 2014-12-04
Vous devez vous connecter pour publier un commentaire.
Yii2 avancées de l'application est livré par défaut avec un exemple de travail de la connexion de la partie de la DB (je vois la de base utilise une statique nom d'utilisateur et mot de passe). Vous n'avez pas à installer quoi que ce soit extra, il suffit de regarder le code. Installer les avancées de l'application et de prendre un coup d'oeil à l'interface.
En bref SiteController utilise LoginModel de validation puis utilise le login() de la LoginModel de connexion de l'Utilisateur modèle de l'Utilisateur du composant.
Si vous ne souhaitez pas utiliser le modèle de l'Utilisateur, il suffit de créer votre propre modèle et l'utiliser. Vous ne voulez pas utiliser la valeur par défaut de l'Utilisateur du composant, il suffit de créer votre propre. Il est assez facile à faire.
Edit:
mate, retirez le public déclarations de variables ci-dessous.
Vous dites Yii d'ignorer ce qui est dans la base de données.
J'ai regardé l'application de base, je comprends le problème maintenant. Regardez celle avancée.
Je suis à la recherche d'Yii2 avancé et je pense que je peux reproduire le système avec moins de champs de la table et de mettre en œuvre quelque chose de similaire dans le modèle de base. Demain je vais travailler sur ça. Merci beaucoup.
de ce que j'ai vu, vous avez juste à changer un couple de fichiers et c'est tout.
J'ai édité Modèle d'Utilisateur et LoginForm Modèle comme ci-dessus expliqué dans EDITION 2, et d'après ce que j'ai étudié et vu dans l'avancée de modèle. Ne fonctionne pas 🙁
OriginalL'auteur Mihai P.
Créer votre propre modèle et ensuite l'utiliser. Je vais poster le code ci-dessous.
1) tout d'Abord créer une table de base de données avec vos propres exigences.
Maintenant, allez dans le générateur de Modèle et de créer un Modèle à l'aide de la q_user
tableau
Il va générer un QUser modèle. Dans ce modèle, vous devrez
mettre en œuvre les IdentityInterface
classe QUser s'étend \yii\db\ActiveRecord implémente \yii\web\IdentityInterface
Maintenant de mettre en œuvre toutes les méthodes. Si à l'aide de Netbeans appuyez sur alt+ entrée.
Maintenant dans le formulaire de Connexion, vous aurez à définir Quser modèle de sorte qu'il sera
de retour à l'utilisateur
classe LoginForm s'étend Modèle
{
public $nom d'utilisateur;
public $password;
public $email;
public $rememberMe = true;
}
Que c'est cela permettra de résoudre votre problème.
Prasad : je pense que vous avez mal orthographié le corps de findIdentityByAccessToken() de la fonction, il convient de
public static function findIdentityByAccessToken($token, $type = null) { return self::findOne(['access_token'=>$token]); }
OriginalL'auteur Mohan Prasad