Yii2で最初の一歩を踏み出し始めています。これまでのところ、Yii1で学んだように、アプリケーションを作成し、データベース内のテーブルをそれに接続することができました。
テーブルはcontacts
で、作成ビューのフォームは問題なくデータをデータベースに送信します。
問題は、Yii2に組み込まれている静的ユーザーモデルでは、Admin/Adminまたはdemo/demoを使用してのみログインできることです。
Yii1.xxでは、このようにCOMPONENTS/useridentityを使用して、データベース内のテーブルからのログインを検証できます(utilizador
という名前のテーブルを使用し、フィールドはid
、utilizador
および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に戻ることを考えています。そこで、データベースに簡単にクエリを実行して、適切なログインシステムを機能させることができました。
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データベースにあるものを無視するように言っています。
独自のモデルを作成して使用します。以下のコードを投稿します。
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;
}
}
これで問題が解決します。