[Yii Framework] Use CPasswordHelper For Authentication

Note : available for Yii 1.1.14.

Yii framework telah merilis versi 1.1.14, salah satu fitur tambahan yang ada yaitu class CPasswordHelper terbaru : http://www.yiiframework.com/news/75/yii-1-1-14-is-released/.  Class ini sendiri menyediakan fungsi-fungsi yang dapat digunakan untuk proses autentikasi seperti register dan login. So what the different with md5 or sha? For more information about this class, you can see this wiki : http://www.yiiframework.com/wiki/425/use-crypt-for-password-storage/.

Baiklah, pada postingan ini i will explain how to use this class and compare it with md5 way.

CREATE REGISTER USER

Saya asumsikan kita memiliki tabel seperti berikut untuk tabel user :

 CREATE TABLE `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `username` varchar(50) NOT NULL,
  `name` varchar(45) NOT NULL,
  `password` varchar(100) NOT NULL,
  `salt_password` varchar(100) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=latin1;

kita menggunakan password dan salt_password untuk memperkuat enkripsinya ketika kita lakukan dengan md5. Berikut implementasi untuk register user yang kita buat, pada model user kita membuat fungsi untuk generate salt_password dan men-genearate nilai hash password untuk password user.

    public function beforeValidate()
    {
        if($this->isNewRecord)
        {    
            $this->salt_password=$this->generateSalt();
            //before validate, we create random value for salt_password
        }
        return parent::beforeValidate();
    }

    public function beforeSave()
    {
        if($this->isNewRecord)
        {    
            $pword=$this->password;
            $this->password=$this->hashPassword($dua,$this->salt_password); // set password value
            // with value that have been genereate with md5
        }
        return parent::beforeSave();
    }

    // use for validate password when do login
    public function validatePassword($password)
    {
        return $this->hashPassword($password,$this->salt_password)===$this->password;
    }

   // use for generate hash password
    public function hashPassword($password,$salt)
    {
        return md5($salt.$password);
    }

   // use for generate random value
    public function generateSalt()
    {
        return uniqid('',true);
    }

Kemudian untuk fungsi loginnya, kita buat seperti berikut pada component/useridentity :

    private $_id;

    public function authenticate()
    {
        $username = strtolower($this->username);
        $user = FUser::model()->find('LOWER(username)=?', array($username));
        if($user===null)
            $this->errorCode=self::ERROR_USERNAME_INVALID;        
        else if(!$user->validatePassword($this->password))
            $this->errorCode = self::ERROR_PASSWORD_INVALID;
        else
        {
            $this->_id = $user->id;
            $this->username = $user->username;
            $this->errorCode = self::ERROR_NONE;

          }
           return $this->errorCode == self::ERROR_NONE;
    }    

    public function getId()
    {
        return $this->_id;
    }

dan kode di atas, ketika kita melakukan register akan menghasilkan data seperti berikut :

 '1', 'sabit', 'sabit', 'a4057733cf4710736b652963a701746d', '520869a6a1d376.93126928'

Lalu bagaimana dengan implementasi menggunakan cpasswordhelper, yang perlu kita rubah pada bagian model menjadi seperti berikut :

    public function beforeSave()
    {
        if($this->isNewRecord)
        {    
            $pword=$this->password;
            $this->password = CPasswordHelper::hashPassword($pword);
        }
        return parent::beforeSave();
    }

Sementara itu untuk fungsi validatePassword, hashPassword, generateSalt tidak lagi digunkana pada fungsi ini. Kemudian untuk fungsi login kita buat menjadi seperti berikut :

     private $_id;

    public function authenticate()
    {
        $username = strtolower($this->username);
        $user = FUser::model()->find('LOWER(username)=?', array($username));
        if($user===null)
            $this->errorCode=self::ERROR_USERNAME_INVALID;
        else if(!CPasswordHelper::verifyPassword($this->password, $user->password))// here we do change
            $this->errorCode = self::ERROR_PASSWORD_INVALID;
        else
        {
            $this->_id = $user->id;
            $this->username = $user->username;
            $this->errorCode = self::ERROR_NONE;

          }
           return $this->errorCode == self::ERROR_NONE;
    }    

    public function getId()
    {
        return $this->_id;
    }

dan dengan menggunakan cpasswordhelper, kita akan mendapatkan nilai seperti berikut :

 '3', 'andi', 'andi', '$2a$13$ESeZW/8I.lZLWZTomyUKteo0bHmTroH.G91lElgCtXOcrVfmKiPQ.', ''

You can see it we no need with salt_password again..

Finish… Hope it help… happy coding..

Logika Operator

Ini adalah calculator yang sanggat sederhana yang bisa mengoperasikan perhitungan sederhana. Baiklah langsung saja, untuk tahap awal silahkan desain tampilan seperti dibawah ini:

ImageUbahlah nama semua tools sesuai dengan fungsinya. Jika namanya sudah sesuai barulah kita bisa melai membuat codingnya. Baiklah dari gambar diatas terdapat dua buah inputan yaitu nilai1 dan nilai 2 dan jika 5 tombol operator logika di klik maka akan menampilkan hasilnya di textbox hasil. Sekarang mari kita tambahkan aksi-aksi dari setiap tombol

1 btnTambah

       private void btnTambah_Click(object sender, RoutedEventArgs e)
        {
            tbHasil.Text = (int.Parse(tbNilai1.Text) + int.Parse(tbNilai2.Text)).ToString();
        }

2 btnKurang

        private void btnKurang_Click(object sender, RoutedEventArgs e)
        {
            tbHasil.Text = (int.Parse(tbNilai1.Text) -int.Parse(tbNilai2.Text)).ToString();
        }

3 btnKali

       private void Button_Click(object sender, RoutedEventArgs e)
        {
            tbHasil.Text = (int.Parse(tbNilai1.Text) * int.Parse(tbNilai2.Text)).ToString();
        }

4 btnBagi

       private void btnBagi_Click(object sender, RoutedEventArgs e)
        {
            tbHasil.Text = (int.Parse(tbNilai1.Text) / int.Parse(tbNilai2.Text)).ToString();
        }

5 btnmod

       private void btnModulus_Click(object sender, RoutedEventArgs e)
        {
            tbHasil.Text = (int.Parse(tbNilai1.Text) % int.Parse(tbNilai2.Text)).ToString();
        }

Sedangkan untuk tombol Reset berfungsi untuk menghapus isi dari textbox nilai 1, nilai 2 dan hasil dengan code berikut :

       private void btnReset_Click(object sender, RoutedEventArgs e)
        {
            tbNilai1.Text = "";
            tbNilai2.Text = "";
            tbHasil.Text = "";
        }

Tombol keluar akan kembali ke page sebelumnya yang ada di history.

       private void btnKeluar_Click(object sender, RoutedEventArgs e)
        {
            NavigationService.GoBack();
        }

Memanipulasi Tulisan pada TextBlock Windows Phone 8

Kali ini saya akan membahas contoh sederhana tentang manipulasi tulisan pada Text Block. Di windows Phone tidak ada Tools Label seperti yang ada di windows form, sebagai gantiny adalah Text Block. Bagaimana caranya mengubah warna tulisan dan mengubah Alignment Text yang ada di Text Bock. Langsung saja kita desain sebuah Page ali ini saya menggunakan page Landscape

Image

yang kemudian saya desain seperti gambar dibawah ini :

Image

Pada page kali ini saya menggunakan page Landscape. Pada setiap Tombol saya ubah namanya menjadi btnTextLeft, btnTextCenter, btnTextRight, btnMerah, btnBiru, btnKuning, btnHijau, btnUngu, dan btnPink. Sedangkan Text Block ke2 saya ubah namanya menjadi lbNama yang akan berfungsi untuk menduplikat isi dari textbox. Langkah-langkah yang harus kita lakukan adalah :

  1. Menduplikat isi text pada TextBox1 di lbNama, tambahkan event text changed pada textBox1 tersebut dan tambahkan code berikut :
      private void tbNama_TextChanged(object sender, TextChangedEventArgs e)
        {
            LbNama.Text = tbNama.Text;
        }

2. Kemudian mengubah Alignment LbNama menjadi :

a)      rata kiri dengan menambah event klik pada btnTextLeft dan menambah coding seperti berikut :

        private void btnTextLeft_Click(object sender, RoutedEventArgs e)
        {
            LbNama.HorizontalAlignment = HorizontalAlignment.Left;
        }

b)      rata tengah dengan menambah event klik pada btnTextCenter dan menambah coding seperti berikut :

        private void btnTextCenter_Click(object sender, System.Windows.RoutedEventArgs e)
        {
            LbNama.HorizontalAlignment = HorizontalAlignment.Center;
        }

c)       rata kanan dengan menambah event klik pada btnTextRight dan menambah coding seperti berikut :

        private void btnRight_Click(object sender, System.Windows.RoutedEventArgs e)
        {
            LbNama.HorizontalAlignment = HorizontalAlignment.Right;
        }

3. Sedangkan 6 tombol yang berwarna warni berfungsi untuk mengubah warna tulisan dari TextBlock. Berikut code yang harus   ditambahkan :

a)      btnMerah

        private void btnMerah_Click(object sender, RoutedEventArgs e)
        {
            LbNama.Foreground = new SolidColorBrush (Colors.Red);
        }

b)      btnBiru

        private void btnBiru_Click(object sender, RoutedEventArgs e)
        {
            LbNama.Foreground = new SolidColorBrush(Colors.Blue);
        }

c)       btnKuning

        private void btnKuning_Click(object sender, RoutedEventArgs e)
        {
            LbNama.Foreground = new SolidColorBrush(Colors.Yellow);
        }

d)      btnHijau

        private void btnHijau_Click(object sender, RoutedEventArgs e)
        {
            LbNama.Foreground = new SolidColorBrush(Colors.Green);
        }

e)      btnUngu

        private void btnUngu_Click(object sender, RoutedEventArgs e)
        {
            LbNama.Foreground = new SolidColorBrush(Colors.Purple);
        }

f)       btnPink

        private void btnPink_Click(object sender, RoutedEventArgs e)
        {
            LbNama.Foreground = new SolidColorBrush(Colors.Magenta);
        }

Selamat mencoba… 🙂

Memanggil Form di Windows Phone 8

Kali ini saya akan membahas tentang navigasi page pada windows phone, mungkin istilah navigasi agak asing bagi programmer yang belum menggenal pemrograman web dan berbasis hp. Navigasi page adalah navigasi perubahan form yang ada pada aplikasi. Form biasanya sering disebut dengan page atau halaman sehingga navigasi page bisa disebut juga dengan aksi perubahan halaman. Saya akan memberikan contoh navigasi page dari aksi sebuah button.

  1. Pertama buatlah sebuah halaman yang memilki sebuah tombol seperti dibawah ini.

 Image

2. Kemudian, buatlah sebuah halaman ke2 seperti gambar di bawah ini.

Image

3. Jika telah selesai desain kedua halaman sekarang anda bisa menambah aksi tombol page 2, yaitu aksi klik. Anda bisa langsung menambahkan coding berikut :

      private void btnPage2_Click(object sender, RoutedEventArgs e)
        {
            NavigationService.Navigate(new Uri("Halaman2.xaml",UriKind.Relative));
        }

Sekarang bisa anda coba navigasi halaman yang telah kita buat.