Belajar konsep OOP dengan bahasa pemrograman PHP – Lesson I

Diposting oleh Ivo Idham Perdameian pada 28 September 2011Tinggalkan komentar (1)Menuju ke komentar

Banyak sekali artikel dan tutorial yang membahas pembelajaran konsep OOP, namun hal itu masih terasa tidak memenuhi atau boleh dikatakan artikel dan tutorialnya tidak memuaskan. Nah dalam tutorial saya kali ini saya ingin membahas hal tersebut secara sederhana yang mudah dipahami untuk pemula dalam belajar konsep OOP dengan bahasa pemrograman PHP dan tutorial ini merupakan tutorial yang berkelanjutan dan saya akan bahas secara tuntas, jadi tunggu aja kelanjutan tutorial berikutnya karena tulisan ini hanya sekedar pengantar dari pembahasan yang panjang , setelah tutorial ini kita akan membuat source

code sebagai bentuk implementasi dari pembahasan dari artikel/tutorial yang dibahas, so stay upto date via rss juga boleh. Pengertian singkat OOP
OOP (Object Oriented Programming) adalah sebuah konsep pemograman yang berbasis objek, OOPmerupakan terobosan baru dalam pemrograman setelah pemrograman prosedural, pemrograman modular dan pemrograman abstraksi data.

Kenapa harus OOP?
OOP memberikan kemudahan bagi programmer dalam pembuatan sebuah program, memberikan fleksibilitas yang lebih,
kemudahan penggunaan program, dan dipakai luas dalam teknik piranti lunak skala besar. Selain itu dengan pemograman OOP kode yang dibuat akan lebih mudah dikembangkan dan dirawat dalam arti seorang programer bisa menambah sebuah objek baru tanpa harus menggangu dan merubah modul yang lain. Berikut ini keuntungan dari penggunaan OOP dalam pemograman : 1. 2. 3.

Reusability (kemampuan untuk digunakan kembali). Kode yang dibuat dapat digunakan kembali di aplikasi atau program
lainnya.

Extensibility (Kemampuan untuk dapat dikembangkan). Kita dapat membuat method yang baru atau mengubah yang
sudah ada sesuai dengan yang kita inginkan tanpa harus membuat kode dari awal.

Maintainability (Kemampuan untuk mudah dikelola), kode yang sudah dibuat lebih mudah untuk di maintain/manage.
Apabila aplikasi yang dibuat adalah aplikasi dengan skala besar dan apabila terjadi error atau kesalahan maka dengan OOP hal tersebut mudah ditangani karena pemograman yang menggunakan OOP sudah modularitas(memecahkan program yang besar menjadi bagian-bagian kecil) sehingga perbaikan cukup pada modulmodul tertentu saja tanpa harus mengubah modul yang lainnya.

Empat konsep utama OOP
Dalam pemograman OOP, ada empat hal yang harus diperhatikan karena hal tersebut merupakan konsep vital dari OOP tersebut. Berikut ini konsep tiga konsep utama tersebut: 1. 2. 3. 4.

Encapsulation/pembungkusan, merupakan penyembunyian informasi melalui private danprotected. Inheritance/pewarisan, adalah kemampuan untuk membuat class turunan yang mewarisi propertydan method dari kelas
induk.

Abtraction/abtraksi, adalah sebuah konsep yang merupakan representasi abstrak dari konsep dalam pemograman,
misalnya objek mobil merupakan representasi abstrak dari mobil dalam dunia nyata.

Polymorphism/banyak bentuk, seorang programer bisa memakai method dengan nama yang sama pada class-class yang
berbeda.

Untuk sementara cukup sampai di sini dulu, lain waktu saya akan menulis kelanjutannya.

\

} } . fastcgi_index index. PHP 5.html /index.php index.html index.[share] Membuat central authentication server di PHP Kemarin ada yang PM ane. include fastcgi_params.0. libssl untuk openssl 4. root /srv/cas/public.htm. webserver: Nginx.3 3.php$ { fastcgi_pass 127. tetapi apache juga bisa 2. index index. location / { try_files $uri $uri/ /index. Untuk keperluan ini. Karena itu sekalian ane bahas aja disini.1:9000. yang ane pakai adalah: 1. } location ~ \. dan sekaligus melakukan single logon untuk mereka.php. server_name localhost.php. mysql 5. gimana cara pisahin beberapa aplikasi. libcurl Ini adalah contoh config file nginx yang digunakan pada CAS server: Code: http { server { listen 80.0. tanya gimana cara bedain aplikasi internal sama external.

php. ane pake database yang cukup simple saja.html. Dan apabila diakses melalui http://ipaddress:8000/ maka dia akan serve file dari /srv/cas/internal. } location ~ \. Sekarang.1:9000. Untuk contoh. dibutuhkan minimal 3 tabel untuk ini.. Tabel application Code: id: varchar(50) key: text key adalah untuk menampung public key dari aplikasi agan. Modul encryption bisa agan buat sendiri dengan implement ICasEncryption interface.server { listen 8000. kita membutuhkan sebuah server. Kemudian kita bisa membuat firewall untuk memblokir port 8000 agar tidak bisa diakses dari internet. dan database untuk authentication. root /srv/cas/internal. database.0. dia akan listen pada port 80 dan 8000.0. Bisa gunakan cron dengan mysql cleanup. .. private $schema. } } } Jadi pada nginx. Jelas. private $user. Tabel users Code: uid: varchar(50) name: varchar(200) pwd: char(200) Sesuaikan panjang pwd dengan password yang akan agan encrypt..sql untuk membersihkan tiket tiket ini. PHP Code: class ConnectionConfig { private $host. Informasi yang ane contohkan juga hanya nama user. apabila nginx diakses melalui http://ipaddress/ maka dia akan serve file dari /srv/cas/public. Pertama adalah config modul yang dibutuhkan. location / { try_files $uri $uri/ /index. Tabel tickets Code: id: char(15) -> untuk menampung id tiket uid: varchar(50) -> asosiasi tiket dan user Mungkin bisa ditambahkan expired date? Jadi ticket yang kelamaan ga diakses akan dihapus dengan sendirinya.php$ { fastcgi_pass 127. Dengan config diatas. Kemudian kita akan membuat modul untuk melakukan CAS authentication. jadi hanya aplikasi yang bisa menggunakan port 8000 untuk internal. private $pass. fastcgi_index index. include fastcgi_params.

} public function getPass() {return $this->pass. Cukup mudah dimengerti kan? masih simple sekali class-nya. . $user.} public function getSchema() {return $this->schema. } public function getApps() {return $this->apps. Sekarang. $this->pass = $pass. $pass. } public function getConnection() {return $this->connection. } public function getHost() {return $this->host. $this->tickets = 'tickets'.} public function getUser() {return $this->user. private $apps. private $user. PHP Code: interface ICasEncryption { public function getSalt($text).} public function setHost($host) {$this->host = $host. private $tickets. $pass.function __construct($host.} public function setPass($pass) {$this->pass = $pass.} } PHP Code: class ConfigObject { private $connection. $pass. $this>connection = new ConnectionConfig('localhost'. $this->user = 'users'.} public function setSchema($schema) {$this->schema = $schema. $schema). $schema) { $cn = new ConnectionConfig($host.} public function setUser($user) {$this->user = $user. 'root'.} public function setTickets($tickets) {$this->tickets = $tickets. $user. $user.} } Ini untuk config di CAS server nantinya. $this->connection = $cn.} public function setApps($apps) {$this->apps = $apps.} public function getUser() {return $this->user. $this->schema = $schema.} public function setUser($user) {$this->user = $user.} public function setConnection($host. $schema) { $this->host = $host. $this->user = $user. kita perlu sebuah file encryption yang harus dibuat untuk melakukan authentication. function __construct() { $this->apps = 'applications'. 'cas'). ''.} public function getTickets() {return $this->tickets.

$salt) { return md5($text). tetapi harus implement ICasEncryption. $connect->getUser(). } private function connect() { if ($this->connection) {return true. .public function encrypt($text. $this->connection = new mysqli($connect>getHost(). Silahkan merubahnya supaya lebih sakti Last edited by magico. dengan md5. } public function encrypt($text. karena itu yang akan digunakan oleh CasServer untuk compare password. } private function createTicket($uid) { $ticket = 'T'.. QUOTE KaskusAd .} public function setConfig($config) { if ($config instanceof ConfigObject) $this->config = $config. } public function __construct() { $this->config = new ConfigObject(). $this->connect(). $connect>getSchema()). tanpa salt. yaitu CasServer PHP Code: class CasServer { private $config. } class CasEncryption implements ICasEncryption { public function getSalt($text) { return "". 01:04 AM #2 magico kaskus addict UserID: 50559 8 Join Date: Jul 2008 Posts: 3.Create an KasAD / Buat Iklan KasAD 04-07-2011. } public function createSalt() { return "".uniqid(). return true. private $connection. $config = $this->config. $salt). $this->connection = NULL. kita akan masuk ke main module. ane buat encryption biasa.} $connect = $this->config->getConnection(). Untuk contoh. public function getConfig() {return $this->config.979 Sekarang. } } Terserah agan mau encrypt seperti apa. $connect->getPass(). 04-07-2011 at 01:59 AM. public function createSalt().

$pass. } } public function authenticate($uid. $config = $this->config. $encryption) { $this->connect(). $row = $result->fetch_array(). '$uid')"). name. $config = $this->config. lakukan one way encryption . $row = $result->fetch_array(). if ($row[0] == 0) { //Tidak ada duplikat //Encrypt password $salt = $encryption->createSalt(). '$enc')"). $conn->real_query("INSERT INTO {$config>getTickets()} (id. if (!$encryption instanceof ICasEncryption) { trigger_error("ERROR: Need ICasEncryption object").$conn = $this->connection. if ($row) { //User ditemukan. //sanitize $uid = $conn->real_escape_string($uid). //insert $conn->real_query("INSERT INTO {$config>getUser()} (uid. $conn = $this->connection. $name. } //Ambil encrypted password $result= $conn->query("SELECT pwd FROM {$config>getUser()} WHERE uid = '$uid'. } else { return false. } //Periksa userid $result = $conn->query("SELECT count(uid) FROM {$config>getUser()} WHERE uid = '$uid'"). '$name'. $conn = $this->connection. //Sanitize $uid = $conn->real_escape_string($uid). $salt). if (!$encryption instanceof ICasEncryption) { trigger_error("ERROR: Need ICasEncryption object"). pwd) VALUES ('$uid'. } public function createuser($uid. $enc = $encryption->encrypt($pass. $encryption) { $this->connect(). $pass = $conn->real_escape_string($pass). return true. $pass = $conn->real_escape_string($pass). uid) VALUES ('$ticket'. $pass. return $ticket.").

//Sanitize $app=$conn->real_escape_string($app). if ($text == $pass2) { //Hash sama.uid. if ($row[0] > 0) return false. return $ticket. $key=$conn->real_escape_string($key). $user['name']=''. } } else { return false.uid = t. $config = $this->config. buat tiket $ticket = $this->createTicket($uid). $uid = ''. //Ambil data user sesuai tiket $query = "SELECT `key` FROM {$config>getApps()} WHERE id = '$app'. `key`) VALUES ('$app'. $config = $this->config. $pass2 = $encryption->encrypt($pass. } else { return false.$text = $row[0].uid . '$key')"). //Check apakah sudah terdaftar $result = $conn->query("SELECT count(id) FROM {$config>getApps()} WHERE id = '$app'"). } public function redeem($app. $row = $result->fetch_array(). SELECT u. //Sanitize $app = $conn->real_escape_string($app). u. $ticket = $conn->real_escape_string($ticket). $conn = $this->connection.name FROM {$config->getTickets()} t INNER JOIN {$config>getUser()} u ON u. //Register aplikasi baru $conn->real_query("INSERT INTO {$config>getApps()} (id. $ticket) { $this->connect(). } } public function register($app. $key) { $this->connect(). $user['uid']=''. $conn = $this->connection. $salt). $salt = $encryption->getSalt($text). $key = ''. return true.

$row = $data->fetch_array(). Kemudian default connection bisa diatus melalui setConnection pada ConfigObject. } public function createsalt() { .. $cas->setConfig($config). 'rahasiadong'.WHERE id = '$ticket'". 'useragan'. $crypted. $salt) { . } } Pertama. setUser() untuk tabel user. } } else { echo $conn->error. agan bisa mengirimkannya melalui setConfig(). $key). } //Encrypt sesuai public key $data = json_encode($user). Jadi misalnya agan membuat Encryption berikut: PHP Code: class IniEncryption implements ICasEncryption { public function getSalt($text) { . $row = $data->fetch_array(). Keduanya meminta ICasEncryption interface. $user['uid']= $row[0].. $cas = new CasServer(). } public function encrypt($text. $config>setConnection('localhost'. $key = $row[0]. if ($conn->multi_query($query)) { $data = $conn->store_result(). Misalnya: PHP Code: $config = new ConfigObject(). Keduanya menerima $encrytion parameter sebagai object yang akan melakukan encrypt terhadap password tersebut.. if ($conn->next_result()) { $data = $conn->store_result(). Kemudian ada method createuser dan authenticate yang akan mengatur user. method setConfig.. $user['name']= $row[1].. dan setTickets() untuk tabel penampung tiket. $crypted = ''.. Setelah agan mengatur ConfigObject. } } .. } else { //Tiket tidak ditemukan return false. return base64_encode($crypted). setApps() akan mengatur nama tabel untuk aplikasi. 'schemaane' ). $config->setApps('aplikasineh').. openssl_public_encrypt($data.. akan memastikan agan bisa mengatur config dari CasServer ini sesuai object ConfigObject diatas.

maka modul authenticate akan membuat tiket dengan memanggil createticket(). dengan nomor tiket '12345'.urlencode($public_key). $result = curl_exec($ch). CURLOPT_POST. new IniEncryption()). $key). //Register ke url yang diberikan $ch = curl_init($url). Jadi biarpun agan tahu bahwa aplikasi menggunakan nama 'testapp'.Maka agan akan bisa pass sebagai cara enkripsi password seperti ini: PHP Code: $cas>createuser('magic'. curl_close($ch). curl_setopt($ch. CURLOPT_RETURNTRANSFER. 2). return $key. $public_key = openssl_pkey_get_details($key). tetapi agan tidak akan bisa membaca datanya apabila agan tidak memiliki private key untuk membuka kuncinya. $public_key = $public_key['key']. openssl_pkey_export($key. '123456'. 'Ane nehh'. Method register adalah untuk registrasi aplikasi. CURLOPT_POSTFIELDS. dan createSalt adalah Salt generator. pastikan agan bisa mengambil salt-nya. curl_setopt($ch.key'. } public function __construct($appname) { $this->appname = $appname. $param). } public function register($url) { //Generate SSL encryption key $key=openssl_pkey_new(). Aplikasi yang register harus mengirimkan public key-nya. . Setelah pemeriksaan selesai. yaitu CasClient PHP Code: class CasClient { private $keypath = '/srv/test/private. } private function loadkey() { $key = file_get_contents($this->keypath). $privatekey). $param = 'id='. Kita sampai pada bagian terakhir.'&key='. curl_setopt($ch. dan menyimpannya ke database. $app = $this->appname. Sedangkan encrypt adalah untuk melakukan encryption dan hashing. private $appname. key ini nantinya akan digunakan untuk encrypt data yang dikirimkan ke luar. dan application id. Maka password 123456 akan diencrypt sesuai code agan pada class IniEncryption getSalt adalah untuk extract Salt dari text yang sudah disimpan. return $result == "OK". //Save key ke config file $this->savekey($privatekey).$app. private function savekey($key) { file_put_contents($this->keypath. true). Jadi pastikan kalau membuat encryption dengan salt.

} public function redeem($url.urlencode($ticket). return $decrypted.979 Kelemahan dari modul yang ane buat ini. $param). Agan bisa rubah folder tersebut. 01:40 AM #3 magico kaskus addict UserID: 5055 98 Join Date: Jul 2008 Posts: 3.. if (!isset($_POST['id'])) { die(). Ada cara lain.inc'. CURLOPT_POSTFIELDS. $cas=new CasServer(). } } Modul ini digunakan pada aplikasi client yang akan melakukan otentikasi ke CAS server. $decrypted.'&ticket='. curl_setopt($ch. client akan membuat sebuah RSA key. life example dari modul modul ini Pada folder /srv/cas/internal registrasi. openssl_private_decrypt($result. supaya user tidak bisa mengakses port ini. $result= base64_decode($result). } $app = $_POST['id'].$app. $ticket) { $key = $this->loadkey(). $appname disini adalah identifikasi aplikasi. data yang dikirim oleh CasServer tidak akan bisa dibaca oleh method redeem(). Pada waktu register. tetapi pastikan agan bisa menulis ke sana. 2). $param = 'id='. apabila bisa mengakses ke page dengan registrasi ini. true). yang akan disimpan oleh server CasServer dan digunakan untuk melakukan enkripsi. Karena itu ane membuatnya pada port internal. 04-07-2011 at 01:32 AM. yaitu membatasi data aplikasi dan melakukan verifikasi sebelum data boleh digunakan oleh method redeem() pada CasServer Berikutnya.php PHP Code: require_once 'init. //decrypt data $decrypted="". $key). CURLOPT_POST. Last edited by magico. //Request data ke url yang diberikan $ch = curl_init($url). . $key = $_POST['key']. adalah siapapun bisa melakukan registrasi. curl_setopt($ch. QUOTE 04-07-2011. dan menyimpan private key-nya pada folder tertentu. $app = $this->appname. $result = curl_exec($ch). curl_setopt($ch. Tanpa private key ini. curl_close($ch). dan mengirimkan public key-nya ke server supaya server bisa melakukan encrypt. CURLOPT_RETURNTRANSFER.

redeem. else echo "FAIL". new CasEncryption()). $cas->setConfig($config). 'root'. $pass = $_POST['pass']. Pada folder /srv/cas/public login. $uid = $_POST['user']. if ($result) echo "OK". $ticket = $_REQUEST['ticket']. if ($ticket) { header("location: $ref?ticket=$ticket"). $pass. } else { $error_string = "Maaf.$result = $cas->register($app. $key).inc'. 'sso'). if (isset($_REQUEST['ref'])) { $ref = $_REQUEST['ref']. if ($data) echo $data. if (!isset($_REQUEST['id'])) { die(). die(). } } ?> <h2>Contoh login gateway untuk CAS Server</h2> <br/> Anda masuk kesini karena akan masuk dari:<br/> <? echo $ref ?><br/> <br/> Silahkan login:<br/> <? echo $error_string. ?> . $ticket = $cas>authenticate($uid.inc'.php PHP Code: <?php require_once 'init. ''. $config->setConnection('localhost'.php PHP Code: require 'init. $config = new ConfigObject(). $cas = new CasServer(). } $app = $_REQUEST['id']. $error_string = ''. } if (isset($_POST['user']) && isset($_POST['pass'])) { $cas = new CasServer(). $ticket). $data = $cas->redeem($app. } else { die(). tidak dapat menemukan data anda< br/>".

Jadi ga perlu tiap mau redeem harus register.'?ref='. ?>" /> User: <input type="textbox" name ="user" /><br/> Pass: <input type="password" name ="pass" /><br/> <input type ="submit" value ="Login"/> </form> Hanya itu saja pada publik.inc'.$_SERVER['PHP_SELF'] ).php"> <input type="hidden" name="ref" value="<? echo $ref. ane lupa. $app). $status = $cas->register($url. $cas->redeem($url.. echo $uid. entah di mana Untuk melakukan registrasi: PHP Code: require_once('init. new CasClient('testapp'). kemudian port external. $app = 'testapp'. EDIT: Oh.inc'). Tiket bisa agan simpan pada AJAX. $loginpage = '/login/login. $url $app $cas $uid ?> Jadi total ada 3 project disini. dan client application. $ticket). $cas = new CasClient($app). Pertama untuk port internal. Semoga bisa bermanfaat untuk agan.php'. Kemudian pada server client. $url = 'http://localhost:8000/register. else echo "fail". 'testapp'..php'.<form method="post" action="/login/login. . dan ini adalah untuk login PHP Code: <?php require_once 'init. if ($status) echo "OK". if (!isset($_GET['ticket'])) { header('location: '.$loginpage.php'. registration ke CAS hanya cukup satu kali seumur hidup program. } $ticket = $_GET['ticket']. sehingga bisa dilakukan pengiriman ke beberapa aplikasi yang terdaftar pada CAS. = = = = 'http://localhost:8000/redeem. die().

Sign up to vote on this title
UsefulNot useful