问题描述
我开始在 Yii2 中迈出第一步.到目前为止,我已经能够编写一个应用程序并将数据库中的表连接到它,就像我在 Yii1 中学到的那样.
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.
表格是 contacts
并且我创建视图中的表单将数据发送到数据库没有问题.
The table is contacts
and the form in my create view sends the data to the database with no problems.
问题是我只能在 Yii2 内置的静态用户模型中使用 Admin/Admin 或 demo/demo 登录.
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.
在 Yii1.xx 中,我设法使用 COMPONENTS/useridentity 从数据库表中验证登录,就像这样(我使用了一个名为 utilizador
的表,字段为 id
, utilizador
和 password
):
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
):
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,我不知道从哪里开始,也不知道什么是正确的代码来让它覆盖开箱即用的静态用户模型.
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-user,阅读了 PDF 指南,但不明白如何从我的控制器的供应商文件夹中调用路由.尝试了几次,但都失败了.
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 中验证从数据库登录,优先不使用扩展吗?
Can someone teach me how to validate login from database in Yii2, preferentially without using an extension?
编辑
我在 Stack Overflow 中阅读了本教程Yii Framework 2.0 使用用户数据库登录
并且还研究了Yii2-user extension的PDF,但不知道如何处理pdf的以下部分和下一部分.它谈到了路线,但我不知道如何使用它们:
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:
2.3.1 显示用户路由/user/admin/index 显示注册用户列表.您将能够看到很多有用的信息,例如注册时间和IP 地址、确认和阻止状态等.
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.
我也读过这个:http://www.yiiframework.com/doc-2.0/yii-网络用户.html但我认为它没有解决我的问题的步骤.
I have also read this: http://www.yiiframework.com/doc-2.0/yii-web-user.html but I don't think it has the steps to resolve my problem.
编辑 2
我尝试在 Yii 基本模板中实现 User Model 和 LoginForm Model 来验证用户登录.创建一个数据库并连接到它.数据库作为表用户和字段用户名、密码、authKey、用值填充的 acessToken.从 ActiveRecord 扩展用户模型并实现 yiiwebIdentityInterface 以使内置的 Yii2 函数完成它们的工作.还写了方法public static function tableName() { return 'user';}
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 yiiwebIdentityInterface in order to make the in-built Yii2 functions do their job. Also wrrited the method public static function tableName() { return 'user'; }
每次我尝试登录时,都会从 LoginForm 模型中的 validatepassword() 抛出 -> 用户名或密码不正确.
Every time i try to login it throws -> username or password incorrect, from the validatepassword() in LoginForm Model.
这是我的代码:登录表单模型:
namespace appmodels;
use Yii;
use yiiaseModel;
/**
* 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 appmodels;
use yiidbActiveRecord;
class User extends ActiveRecord implements yiiwebIdentityInterface
{
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 高级应用程序默认带有来自 DB 的登录部分的工作示例(我看到基本应用程序使用静态用户名和密码).您不必安装任何额外的东西,只需查看代码即可.安装高级应用并查看前端.
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.
简而言之,SiteController 使用 LoginModel 进行验证,然后使用 LoginModel 的 login() 将 User 模型登录到 User 组件.
In short SiteController uses LoginModel for validation then uses the login() of the LoginModel to login the User model to the User component.
如果您不想使用 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.
伙计,删除下面变量的公共声明.
mate, remove the public declarations of variables bellow.
class User extends ActiveRecord implements yiiwebIdentityInterface
{
public $id;
public $username;
public $password;
public $authKey;
public $accessToken;
您告诉 Yii 忽略数据库中的内容.
You are telling Yii to ignore what is in the database.
这篇关于从 MySQL 中的表登录的 Yii2 分步指南的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!