gpt4 book ai didi

php - Yii2 分步指南从 MySQL 中的表登录

转载 作者:可可西里 更新时间:2023-11-01 06:44:48 28 4
gpt4 key购买 nike

我开始迈出 Yii2 的第一步。到目前为止,我已经能够编写应用程序并将数据库中的表连接到它,就像我在 Yii1 中学到的那样。

表是 contacts,我创建 View 中的表单将数据毫无问题地发送到数据库。

问题是我只能在 Yii2 内置的静态用户模型中使用 Admin/Admin 或 demo/demo 登录。

在 Yii1.xx 中,我设法使用 COMPONENTS/useridentity 从数据库中的表验证登录,就像这样(我使用了一个名为 utilizador 的表,其中包含字段 id , utilizadorpassword):

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 指南但不明白如何从我的 Controller 中的 vendor 文件夹调用路由。做了几次尝试,但都失败了。

谁能教我如何在 Yii2 中验证数据库登录,最好不使用扩展?

编辑

我在 Stack Overflow 中阅读了这个教程 Yii Framework 2.0 Login With User Database

还研究了 Yii2 用户扩展的 PDF,但不知道如何处理 pdf 的后续部分和下一部分。它谈到路线,但我不知道如何使用它们:

2.3.1 显示用户路由/user/admin/index 显示注册用户列表。您将能够看到很多有用的信息,例如注册时间和 ip 地址、确认和阻止状态等。

我也读过这个: http://www.yiiframework.com/doc-2.0/yii-web-user.html但我认为它没有解决我的问题的步骤。

编辑 2

我尝试在 Yii 基本模板中实现用户模型和登录表单模型来验证用户登录。创建了一个数据库并连接到它。数据库作为表用户和字段用户名、密码、authKey、acessToken 填充值。从 ActiveRecord 扩展用户模型并实现\yii\web\IdentityInterface 以使内置的 Yii2 函数完成它们的工作。还编写了方法 public static function tableName() { return 'user';

每次我尝试登录时,都会从 LoginForm 模型中的 validatepassword() 抛出 -> username or password incorrect。

这是我的代码:登录表单模型:

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 高级应用程序默认带有一个来自数据库的登录部分的工作示例(我看到基本的使用静态用户名和密码)。您不必安装任何额外的东西,只需查看代码即可。安装高级应用程序并查看前端。

简而言之,SiteController 使用 LoginModel 进行验证,然后使用 LoginModel 的 login() 将 User 模型登录到 User 组件。

如果您不想使用用户模型,只需创建您自己的模型并使用该模型即可。您不想使用默认的用户组件,只需创建您自己的组件即可。这很容易做到。

编辑:伙计,删除下面变量的公共(public)声明。

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

你告诉 Yii 忽略数据库中的内容。

关于php - Yii2 分步指南从 MySQL 中的表登录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27304066/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com