mit Yii 2 Basis nicht die erweiterte Version hinzufügen.wie Sie Hash-Passwörter in yii2
Ich habe ein Crud-Admin-Authentifizierungssystem. Das speichert nur eine ID, einen Benutzernamen und ein Passwort in der Datenbank. Wenn der Benutzer sich anmeldet, wenn der Benutzername und das Passwort korrekt sind, sind sie eingeloggt.
Allerdings möchte ich jetzt diese Passwörter sichern, also möchte ich sie salzen und hacken. Dies ist der Teil, den ich schwer zu tun finde. Oder mehr, wo ich Dinge hinstellen kann.
Teil 1: Ich habe einen AdminController, der mit meiner User Model Create.php Seite einhergeht. Teil 2:. ich einen siteController habe, die zusammen mit dem Loginform Modell geht und die login.php Seite eingeloggt seine
Ich werde ersten Teil einen übergehen, da es offenbar tatsächlich haben wird, um ein Hash-Passwort zu generieren Hier.
Admincontroller:
public function actionCreate()
{
$model = new User();
if ($model->load(Yii::$app->request->post()) && $model->save()) {
return $this->redirect(['view', 'id' => $model->id]);
} else {
return $this->render('create', [
'model' => $model,
]);
}
}
User.php
<?php
namespace app\models;
use yii\base\NotSupportedException;
use yii\db\ActiveRecord;
use yii\web\IdentityInterface;
use yii\data\ActiveDataProvider;
/**
* User model
*
* @property integer $id
* @property string $username
* @property string $password
*/
class User extends ActiveRecord implements IdentityInterface
{
/**
* @inheritdoc
*/
public static function tableName()
{
return 'Users';
}
public function rules(){
return [
[['username','password'], 'required']
];
}
public static function findAdmins(){
$query = self::find();
$dataProvider = new ActiveDataProvider([
'query' => $query,
]);
return $dataProvider;
}
/**
* @inheritdoc
*/
public static function findIdentity($id)
{
return static::findOne(['id' => $id]);
}
/**
* @inheritdoc
*/
public static function findIdentityByAccessToken($token, $type = null)
{
throw new NotSupportedException('"findIdentityByAccessToken" is not implemented.');
}
/**
* Finds user by username
*
* @param string $username
* @return static|null
*/
public static function findByUsername($username)
{
return static::findOne(['username' => $username]);
}
/**
* @inheritdoc
*/
public function getId()
{
return $this->id;
}
/**
* @inheritdoc
*/
public function getAuthKey()
{
return static::findOne('AuthKey');
}
/**
* @inheritdoc
*/
public function validateAuthKey($authKey)
{
return static::findOne(['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;
}
}
Frage ??: So wie Sie in diesem Modell sehen kann ich nur id, Benutzername und Passwort haben kommend von der Datenbank, also nehme ich, muss ich einen für field in db namens "hashed_password" erstellen?
create.php:
<?php $form = ActiveForm::begin(); ?>
<?= $form->field($model, 'username')->textInput(['maxlength' => 50]) ?>
<?= $form->field($model, 'password')->passwordInput(['maxlength' => 50]) ?>
<div class="form-group">
<?= Html::submitButton($model->isNewRecord ? 'Create' : 'Update', ['class' => $model->isNewRecord ? 'btn btn-success' : 'btn btn-primary']) ?>
</div>
<?php ActiveForm::end(); ?>
rechts, so dass Teil 1, die tatsächliche Bit war, wo die Hash-Passwort erzeugt werden muss, und in der Datenbank gespeichert, wie kann ich das erreichen?
Gut auf dem beweglichen Part2:
SiteController:
public function actionLogin()
{
if (!\Yii::$app->user->isGuest) {
return $this->goHome();
}
$model = new LoginForm();
if ($model->load(Yii::$app->request->post()) && $model->login()) {
return $this->goBack();
} else {
return $this->render('login', [
'model' => $model,
]);
}
}
LoginForm.php (Modell):
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;
}
}
login.php:
<?php $form = ActiveForm::begin(); ?>
<?= $form->field($model, 'username'); ?>
<?= $form->field($model, 'password')->passwordInput(); ?>
<div class="form-group">
<div class="col-lg-offset-1 col-lg-11">
<?= Html::submitButton('Login', ['class' => 'btn btn-primary', 'name' => 'login-button']) ?>
</div>
</div>
Also das ist es, wie integriere ich ein hashed_password für jeden Benutzer bei der Erstellung und validiere dies dann bei der Anmeldung?
Ich habe gelesen, dies auf die Dokumentation aber kann nicht nur erhalten diese http://www.yiiframework.com/doc-2.0/guide-security-passwords.html
wo setze ich Yii :: $ app-> security-> generatePasswordHash ($ password); das obwohl? –
in Ihrer Aktion create: 'if ($ model-> laden (\ Yii :: $ app-> request-> post()) && modell-> register())' so in diesem Register Funktion Passwort Hash generieren und speichern auf db – ineersa
danke das hat funktioniert, es ist nur so, dass in der validatePassword Funktion du nicht \ für yii gesetzt hast: $ app .... so dass es nicht funktionierte, dann merkte ich, dass es ein \ vor yii :: $ app ... beim Generieren gab das Hash-Passwort Vielen Dank! –