Yii2 Hash İşlemi


        Senaryolara giriş yaptığım yazıda veritabanındaki tabloda bulunan 'password' alanını kullanmıştık. Fakat parolaları veritabanında olduğu halleriyle saklamak ne kadar güvenli? Elbette hiç güvenli değil çünkü ağda bu bilgileri doğrudan, üzerinde hiçbir işlem yapmadan göndermek demek ağı dinleyen kişilerin bu bilgilere kolaylıkla ulaşması demek bunun gibi bir çok önemli sebep yüzünden parolalar veritabanında tutulurken gölgelenmiş halleri kullanılmalıdır. Peki bunu nasıl yaparız?

        Yii2'nin bu işlem için kendi hazırladığı Hash fonksiyonları bulunur. Bu yazımda da bu fonksiyonların nasıl kullanılacağından bahsedeceğim. Öncelikle geçen yazıda verdiğim örneği 'password' alanını eklediğimiz kısma kadar yapmış olmanız gerekmekte.

        Bu fonksiyonları kullanırken tüm işi controllerlar yardımı ile yapacağız view kısmında bir şey değiştirmemize gerek kalmayacak.
  • Yazıdaki işlemleri aynen yaptıysanız UsersController.php dosyası ile çalışacağız. Elbette istediğiniz controller ile (view'ına dikkat ederek) çalışabilirsiniz. /controllers/UsersController.php dosyamızı açıyoruz ve 'password' hangi view dosyasında ise o dosyanın action'ını buluyoruz. Bizim yaptığımız örnekte create.php dosyasında olduğu için actionCreate metodunda çalışacağız. 
  •  Sadece hash işlemi yapmak için gerekli kod:
    • $hash = Yii::$app->getSecurity()->generatePasswordHash($password); // kodundan yararlanırız. Nasıl? 
  • Şöyle ki; actionCreate metodunun içerisindeki alanı aşağıdaki gibi düzenlememiz gerekir.
        if ($model->load(Yii::$app->request->post())) {

            $pass = $model->password;

            $hash = Yii::$app->getSecurity()->generatePasswordHash($pass);

            $model->password = $hash;
            $model->password_repeat ı= $hash;
            $model->save();
,
            return $this->redirect(['view', 'id' => $model->id]);
        }
  • Metodu bu şekilde düzenledikten sonra girilen parolalar veritabanında gölgelenmiş halleri ile saklanır. Fakat şöyle bir sorun var, eğer ki parola değiştirme kısmı yaparsanız bu fonksiyon her defasında farklı hash sonucu üreteceğinden eski parola ile karşılaştırmada sorun oluşacaktır. Bu sorunu çözmek için de karşılaştırma yaptığınız metotta (bende updateAction) bazı değişiklikler yapılması gerekiyor. Bunun için kullanılacak kod:
    • if (Yii::$app->getSecurity()->validatePassword($password, $hash)) {
          // all good, logging user in
      } else { $hash = Yii::$app->getSecurity()->generatePasswordHash($password);
          // wrong password
      }
  • View dosyanızda 'old_password', 'new_password', 'new_confirm' alanlarını oluşturduktan sonra actionUpdate metodu içerisindeki kod şöyle olmalıdır:
        if ($model->load(Yii::$app->request->post())) {

            $pass = $model->old_password;
            $password = $model->password;

            if (Yii::$app->getSecurity()->validatePassword($pass, $password)) {

                $passw = $model->new_password;
                $hashh = Yii::$app->getSecurity()->generatePasswordHash($passw);
                $model->new_password = $hashh;
                $model->password = $model->new_password;
                $model->new_confirm = $model->new_password;

                $model->save();
                return $this->redirect(['view', 'id' => $model->id]);

            } else {
                $model->addError('old_password', 'Old Password' . 'Does not match.');
            }
        }

        Böylece hem hash işlemi hem de parolaların gölgelenmiş halleriyle kontrol işlemi gerçekleştirmiş olduk. İyi çalışmalar.