php 从 MySQL 中的表登录的 Yii2 分步指南
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/27304066/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Yii2 step-by-step guide on login from table in MySQL
提问by André Castro
I'm begining to make the first steps in Yii2. So far, I was able to write an application and connect a table in a database to it, just like I learned to do in Yii1.
我开始在 Yii2 中迈出第一步。到目前为止,我已经能够编写一个应用程序并将数据库中的表连接到它,就像我在 Yii1 中学到的那样。
The table is contacts
and the form in my create view sends the data to the database with no problems.
该表是contacts
我创建视图中的表单将数据发送到数据库没有问题。
The problem is that I only can login using Admin/Admin or demo/demo in the static user model that comes built-in in Yii2.
问题是我只能在 Yii2 内置的静态用户模型中使用 Admin/Admin 或 demo/demo 登录。
In Yii1.xx i manage to validate login from a table in database using COMPONENTS/useridentity, just like this (I used a table named utilizador
, with fields id
, utilizador
and password
):
在Yii1.xx我设法从数据库中的表验证登录使用组件/的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;
}
}
}
With Yii2 I have read a lot of tutorials, including one in Stack Overflow but none of them enlighten me on the procedure to login users with username and password from a MySQL database. Yii2 don't have components/useridentity.php and I don't know where to start and what is the proper code to make it work overriding the static user model that comes out of the box.
使用 Yii2,我阅读了很多教程,包括 Stack Overflow 中的一个教程,但没有一个教程让我了解使用 MySQL 数据库中的用户名和密码登录用户的过程。Yii2 没有 components/useridentity.php ,我不知道从哪里开始,也不知道什么是正确的代码来让它覆盖开箱即用的静态用户模型。
I also have tried an extension Yii2-user, read the PDF guide but didn't understand how to call the route's from the vendor folder in my controllers. Made several tries but all failed.
我也尝试了一个扩展 Yii2-user,阅读了 PDF 指南,但不明白如何从我的控制器中的供应商文件夹中调用路由。尝试了几次,但都失败了。
Can someone teach me how to validate login from database in Yii2, preferentially without using an extension?
有人可以教我如何在 Yii2 中验证从数据库登录,优先不使用扩展吗?
Edit
编辑
I read this tutorial in Stack OverflowYii Framework 2.0 Login With User Database
我在 Stack Overflow Yii Framework 2.0 Login With User Database 中阅读了本教程
And also studied the PDF from Yii2-user extension, but don't know what to do with following part and next ones of the pdf. It speaks about routes, but i don't know how to work with them:
并且还研究了 Yii2-user extension 中的 PDF,但不知道如何处理 pdf 的以下部分和下一部分。它谈到了路线,但我不知道如何使用它们:
2.3.1 Show users Route /user/admin/index shows a list of registered users. You will be able to see a lot of useful information such as registration time and ip address, confirmation and block status, etc.
2.3.1 显示用户 Route /user/admin/index 显示注册用户列表。您将能够看到很多有用的信息,例如注册时间和 IP 地址、确认和阻止状态等。
I have also read this:http://www.yiiframework.com/doc-2.0/yii-web-user.htmlbut I don't think it has the steps to resolve my problem.
我也读过这个:http : //www.yiiframework.com/doc-2.0/yii-web-user.html但我认为它没有解决我的问题的步骤。
EDIT 2
编辑 2
I tried to implement the User Model and LoginForm Model in Yii basic template to validate user logins. Created a database and coneected to it. The database as a table user and fields username, password, authKey, acessToken populated with values. Extended the User Model from ActiveRecord and implemented \yii\web\IdentityInterface in order to make the in-built Yii2 functions do their job. Also wrrited the method public static function tableName() { return 'user'; }
我尝试在 Yii 基本模板中实现 User Model 和 LoginForm Model 来验证用户登录。创建一个数据库并连接到它。数据库作为表用户和字段用户名、密码、authKey、用值填充的 acessToken。从 ActiveRecord 扩展用户模型并实现 \yii\web\IdentityInterface 以使内置的 Yii2 函数完成它们的工作。还写了方法public static function tableName() { return 'user'; }
Every time i try to login it throws -> username or password incorrect, from the validatepassword() in LoginForm Model.
每次我尝试登录时,它都会从 LoginForm 模型中的 validatepassword() 抛出 -> 用户名或密码不正确。
Here is my code: LoginForm Model:
这是我的代码: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;
}
}
}
... and here is my User.php Model
...这是我的 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;
}
}
Any ideas ?? -> Thanks...
有任何想法吗 ??-> 谢谢...
I don't know what else should i do, perhaps it has a problem in validating the password or find the username, in Yii2 debug it shows that is proper connected to the mysql database.
我不知道我还能做什么,可能是验证密码或查找用户名时出现问题,在 Yii2 调试中显示正确连接到 mysql 数据库。
Don't touched in the siteController actionLogin() because it is equal to the advanced template and i think it is better to stay that way.
不要触及 siteController actionLogin() 因为它等于高级模板,我认为最好保持这种状态。
EDIT 3 -> 4 HOURS messing with the models code, putting in pratice every solution i read and it still throws "Incorrect username or password." from:
编辑 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.');
}
}
}
I don't want to give up, but i'm considering go back to the old Yii1.xx. There i could easily query the database and make a good login system working.
我不想放弃,但我正在考虑回到旧的 Yii1.xx。在那里我可以轻松查询数据库并使良好的登录系统正常工作。
采纳答案by Mihai P.
Yii2 advanced app comes by default with a working example of the login part from the DB (I see the basic ones uses a static username and password). You do not have to install anything extra, just look at the code. Install the advanced app and take a look at the frontend.
Yii2 高级应用程序默认带有一个来自数据库的登录部分的工作示例(我看到基本应用程序使用静态用户名和密码)。您不必安装任何额外的东西,只需查看代码即可。安装高级应用程序并查看前端。
In short SiteController uses LoginModel for validation then uses the login() of the LoginModel to login the User model to the User component.
简而言之,SiteController 使用 LoginModel 进行验证,然后使用 LoginModel 的 login() 将 User 模型登录到 User 组件。
If you do not want to use the User model, just create your own model and use that one. You do not want to use the default User component, just create your own. It is quite easy to do.
如果您不想使用 User 模型,只需创建自己的模型并使用该模型。您不想使用默认的 User 组件,只需创建您自己的组件即可。这很容易做到。
Edit:mate, remove the public declarations of variables bellow.
编辑:伙伴,删除下面变量的公共声明。
class User extends ActiveRecord implements \yii\web\IdentityInterface
{
public $id;
public $username;
public $password;
public $authKey;
public $accessToken;
You are telling Yii to ignore what is in the database.
您告诉 Yii 忽略数据库中的内容。
回答by Mohan Prasad
Create your own model and then use that. I will post the code below.
创建您自己的模型,然后使用它。我将在下面发布代码。
1) First create a database table with your own requirements.
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;
Now go to the Model generator and create a Model using the q_user table
It will generate a QUser model. In this model you will have to
implement the IdentityInterfaceclass QUser extends \yii\db\ActiveRecord implements \yii\web\IdentityInterface
现在转到模型生成器并使用 q_user 表创建一个模型
它将生成一个 QUser 模型。在此模型中,您必须
实现 IdentityInterface类 QUser 扩展 \yii\db\ActiveRecord 实现 \yii\web\IdentityInterface
Now implement all the methods. If using Netbeans hit alt+ enter.
现在实现所有方法。如果使用 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;
}
Now in Login form you will have to define Quser model so it will return back the user
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; }
}
现在在登录表单中,您必须定义 Quser 模型,以便它将返回用户
class LoginForm extends Model { public $username; 公共 $password; 公共 $email; 公共 $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; }
}
That's it this will solve your problem.
就是这样,这将解决您的问题。