web-dev-qa-db-ja.com

MySQLのテーブルからのログインに関するYii2ステップバイステップガイド

Yii2で最初の一歩を踏み出し始めています。これまでのところ、Yii1で学んだように、アプリケーションを作成し、データベース内のテーブルをそれに接続することができました。

テーブルはcontactsで、作成ビューのフォームは問題なくデータをデータベースに送信します。

問題は、Yii2に組み込まれている静的ユーザーモデルでは、Admin/Adminまたはdemo/demoを使用してのみログインできることです。

Yii1.xxでは、このようにCOMPONENTS/useridentityを使用して、データベース内のテーブルからのログインを検証できます(utilizadorという名前のテーブルを使用し、フィールドはidutilizadorおよび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;
       }
   }

}

Yii2では、Stack Overflowのチュートリアルを含め、多くのチュートリアルを読みましたが、MySQLデータベースからユーザー名とパスワードを使用してユーザーにログインする手順については、どのチュートリアルも教えてくれません。 Yii2にはcomponents/useridentity.phpがなく、どこから始めればよいのか、箱から出てくる静的ユーザーモデルをオーバーライドして機能させるための適切なコードは何かわかりません。

拡張機能Yii2-userも試しましたが、PDFガイドを読みましたが、コントローラーのベンダーフォルダーからルートを呼び出す方法がわかりませんでした。何度か試しましたが、すべて失敗しました。

誰かが、優先的に拡張機能を使用せずに、Yii2のデータベースからのログインを検証する方法を教えてもらえますか?

編集

このチュートリアルをStack Overflowで読みましたYii Framework 2.0 Login With User Database

そしてまたPDF Yii2-userextensionから)を研究しましたが、次の部分とどうしたらいいかわかりませんpdfの次のもの。それはルートについて話します、しかし私はそれらを扱う方法を知りません:

2.3.1ユーザーの表示ルート/ user/admin/indexは、登録済みユーザーのリストを表示します。登録時間やIPアドレス、確認やブロック状況など、役立つ情報がたくさん表示されます。

私もこれを読みました:http://www.yiiframework.com/doc-2.0/yii-web-user.html しかし、私の問題を解決するための手順はないと思います。

編集2

Yii基本テンプレートでユーザーモデルとLoginFormモデルを実装して、ユーザーログインを検証しようとしました。データベースを作成してそれに接続しました。データベースをテーブルユーザーとして、ユーザー名、パスワード、authKey、値が入力されたacessToken。組み込みのYii2関数にジョブを実行させるために、ActiveRecordからユーザーモデルを拡張し、\ yii\web\IdentityInterfaceを実装しました。また、メソッドpublic static functiontableNameを記述しました。 (){return'user ';}

ログインしようとするたびに、LoginFormモデルのvalidatepassword()から->ユーザー名またはパスワードが正しくありません。

これが私のコードです:LoginFormモデル:

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;
}

}

...そしてこれが私の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;
}

}

何かアイデアはありますか?? ->ありがとう...

他に何をすべきかわかりません。おそらくパスワードの検証やユーザー名の検索に問題があります。Yii2デバッグでは、mysqlデータベースに適切に接続されていることが示されます。

siteController actionLogin()は高度なテンプレートと同じであり、そのままにしておく方がよいと思いますので、触れないでください。

編集3-> 4時間モデルコードをいじり、読んだすべてのソリューションを実践しましたが、それでも「ユーザー名またはパスワードが正しくありません」とスローされます。差出人:

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

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

あきらめたくないのですが、古いYii1.xxに戻ることを考えています。そこで、データベースに簡単にクエリを実行して、適切なログインシステムを機能させることができました。

6
André Castro

Yii2 Advanced Appには、デフォルトでDBからのログイン部分の実用的な例が付属しています(基本的なものは静的なユーザー名とパスワードを使用しているようです)。余分なものをインストールする必要はありません。コードを確認するだけです。高度なアプリをインストールし、フロントエンドを見てください。

つまり、SiteControllerは検証にLoginModelを使用し、次にLoginModelのlogin()を使用してUserモデルをUserコンポーネントにログインします。

ユーザーモデルを使用したくない場合は、独自のモデルを作成して使用してください。デフォルトのユーザーコンポーネントは使用せず、独自のコンポーネントを作成するだけです。とても簡単です。

編集:メイト、以下の変数のパブリック宣言を削除します。

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

あなたはYiiデータベースにあるものを無視するように言っています。

6
Mihai P.

独自のモデルを作成して使用します。以下のコードを投稿します。

1)まず、独自の要件を持つデータベーステーブルを作成します。

 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; 
  • 次に、モデルジェネレータに移動し、q_userテーブルを使用してモデルを作成します。

  • QUserモデルを生成します。このモデルでは、次のことを行う必要があります
    IdentityInterfaceを実装する

    クラスQUserは\ yii\db\ActiveRecordを拡張し\ yii\web\IdentityInterfaceを実装します

次に、すべてのメソッドを実装します。 Netbeansを使用している場合は、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;
    }
  • ログインフォームで、Quserモデルを定義して、ユーザーに返されるようにする必要があります。

    class LoginForm extends Model {public $ username; public $ password; 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;
    }
    

    }

これで問題が解決します。

1
Mohan Prasad