27 January 2009

Autentifikasi Web Aplikasi pada Tomcat dengan JDBC Realms

Setelah beberapa saat yang lalu kita menggunakan session untuk melakukan validasi pada halaman jsp, kali ini kita akan mencoba membuat autentifikasi web aplikasi dengan Realm.

Pada Apache atau web server lain yang sejenis, biasanya kita menggunakan autentifikasi Realms dengan mengikutsertakan File .htaccess pada direktori dimana kita menginginkan adanya keamanan dalam direktori tersebut.

Sama halnya dengan Apache, Realm adalah suatu fitur dalam Tomcat yang berfungsi sebagai pintu autentifikasi bagi user yang ingin mengakses semua resources dalam web aplikasi yang kita buat. Realm mengatur role-role dari setiap user yang terdaftar, role-role ini menjadi sebuah acuan bagi Tomcat untuk mengatur web aplikasi mana saja yang boleh di akses oleh user-user yang telah terdaftar. Tomcat secara default telah mendukung Realm dengan sangat fleksibel. Fleksibel yang dimaksud disini adalah, Tomcat mensupport autentikasi dengan beberapa metode yang bisa kita pilih sesuai dengan keinginan kita. Metode autentikasi Realm yang didukung oleh Tomcat antara lain:

  1. Autentifikasi berdasarkan File (The Memory Realms).

Pada metode ini, autentikasi dijalankan dengan cara membaca File tomcat-users.xml yang terletak pada /conf/tomcat-users.xml, dalam file ini berisi list dari user-user dengan role-role tertentu.

  1. Autentifikasi menggunakan JDBC (The JDBC Realms).

Metode ini menggunakan database sebagai storage list user-user dan role-role yang dimilikinya. Pada Tomcat 5.5, secara default ada beberapa database yang sudah didukung untuk metode JDBC Realms ini. Untuk memakai metode ini library database seperti mysql-connector harus di install dengan cara memasukkan File jar mysql-connector ke dalam <Tomcat-Folder>/common/lib/.

  1. Autentifikasi dengan JNDI (JNDI Realms).

Pada autentifikasi ini, Tomcat akan memvalidasi user dan role-rolenya dengan cara membaca web directory service, seperti LDAP. Untuk menggunakan metode ini, library-library yang berisi provider-provider JNDI harus diinstall ke dalam <Tomcat-Folder>/common/lib/.

Dari beberapa tipe autentifikasi dengan Realm di atas, kita akan mencoba menggunakan metode yang ke dua yaitu Autentifikasi menggunakan JDBC (The JDBC Realms) sebagai percobaan kita kali ini. Kita akan menggunakan database mysql sebagai storage list dari user-user dan role-role yang dimilikinya. Sementara untuk skenario-skenario percobaan kita kali ini, kira-kira seperti dibawah ini:

  • Buat database sebagai storage yang menampung user-user dengan role-role yang dimilikinya.

  • Buat sebuah username pada mysql yang hanya bisa membaca saja pada database skenario pertama.

  • Aktifkan konfigurasi Realm dengan metode JDBC pada Tomcat.

  • Buat konfigurasi web aplikasi pada Tomcat agar bisa mendukung Realms.

Pada skenario-skenario diatas, sebenarnya dari langkah 1 sampai dengan langkah 3 hanya kita lakukan sekali saja, artinya konfigurasi dari langkah 1 sampai langkah 3 akan menjadi permanen dalam environment Tomcat yang ter-install tsb. Sementara untuk langkah ke-4 sifatnya optional, artinya setiap web aplikasi yang nantinya akan kita deploy, bisa memakai autentikasi Realm ini, dan boleh juga tidak, jadi tergantung keputusan kita dalam menentukan apakah suatu web aplikasi yang kita buat akan memakai autentifikasi Realm atau tidak. Kemudian pada jika kita ingin menambahkan list user dengan role-rolenya, atau merubah role suatu user, maka perubahannya kita lakukan dari dalam database mysql.

Sekarang mari kita jalankan satu demi satu skenario diatas. Untuk skenario pertama silahkan buat database dan tabel-tabelnya pada database mysql, seperti contoh query mysql berikut ini:


create database tomcat_server;
use tomcat_server;
-- --------------------------------------------------------
--
-- Table structure for table `user_auth`
--

CREATE TABLE IF NOT EXISTS `user_auth` (
`USERNAME` varchar(30) NOT NULL default '',
`PASSWORD` varchar(30) NOT NULL default '',
PRIMARY KEY (`USERNAME`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

--
-- Dumping data for table `user_auth`
--

INSERT INTO `user_auth` (`USERNAME`, `PASSWORD`) VALUES
('admin', 'admin99'),
('mojo', '7mono7');

-- --------------------------------------------------------

--
-- Table structure for table `user_role`
--

CREATE TABLE IF NOT EXISTS `user_role` (
`ROLE_NAME` varchar(30) NOT NULL,
`USERNAME` varchar(30) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

--
-- Dumping data for table `user_role`
--

INSERT INTO `user_role` (`ROLE_NAME`, `USERNAME`) VALUES
('tomcat', 'mojo'),
('manager', 'admin'),
('admin', 'admin');

Query tsb, juga langsung bisa dijalankan dengan cara meng-copy paste langsung ke dalam mysql-console, hanya saja perhatikan nanti untuk konfigurasi selanjutnya karena kita akan memakai database dan tabel yang telah kita buat pada tahap ini.

Kita lanjutkan dengan skenario ke-dua yaitu membuat user yang hanya mampu membaca saja database ini. Kenapa harus bisa membaca saja? Kita harus berhati-hati dalam memberikan access-privileges pada user database, apalagi konteks pada Realms ini adalah berkaitan dengan access seluruh web aplikasi kita. Untuk skenario ke-dua ini sebenarnya sebagai saran saja dari saya, jika anda memang menginginkan membuat user database dengan access-privileges yang lebih luas dari pada skenario ini untuk pengembangan lebih lanjut, silahkan saja (All by your own risk). Dibawah ini adalah contoh query yang bisa mengakomodir skenario ke-dua

mysql> grant select on tomcat_server.* to 'tomcat-user'@'localhost' identified by 'tomcat55';

Pada query tsb, kita membuat sebuah user dengan nama tomcat-user dan dengan passwordnya tomcat55, grant select adalah perintah kepada database mysql supaya user tomcat-user ini hanya bisa membaca saja.

Kemudian kita masuk ke skenario ke-3, dimana dalam skenario ini kita akan mengaktifkan konfigurasi Realm dengan metode JDBC pada tomcat. Konfigurasi Realm ada pada file servlet.xml yang terletak pada folder <Tomcat-Folder>/conf/. maka kita harus mengedit File ini untuk bisa mengaktifkan Realm dengan metode JDBC. Ada dua langkah yang harus dilakukan untuk skenario ke dua ini. Dimana langkah-langkah tersebut adalah:

  • Aktifkan konfigurasi Realm.

Cari dan lakukan pengeditan servlet.xml pada bagian seperti di bawah ini:

<Realm className="org.apache.catalina.Realm.UserDatabaseRealm"
resourceName="UserDatabase"/>

Jika baris tersebut belum ada, maka silahkan tambahkan, atau bila baris tersebut ada dalam blok comment, silahkan hapus comment yang mem-blok baris ini.

  • Aktifkan dan isi konfigurasi JDBC Realm sesuai dengan skenario pertama yang tadi kita buat. Seperti contoh servlet.xml pada bagian dibawah ini:
<Realm  className="org.apache.catalina.Realm.JDBCRealm"
driverName="com.mysql.jdbc.Driver"
connectionURL="jdbc:mysql://localhost/tomcat_server"
connectionName="tomcat"
connectionPassword="tomcat55"
userTable="user_auth"
userNameCol="USERNAME"
userCredCol="PASSWORD"
userRoleTable="user_role"
roleNameCol="ROLE_NAME" />

Kita bahas sedikit sebagai review dari konfigurasi di atas, di sini kita memakai driver com.mysql.jdbc.Driver untuk mysql-drivernya, kemudian memakai user tomcat dengan password tomcat55 untuk koneksi ke database mysql sesuai dengan skenario ke dua yang kita buat tadi. Perhatikan bahwa semua value pada tahap ini kita buat sama persis dengan sql query yang kita buat pada skenario pertama.

Kemudian kita bisa jalankan skenario ke-4 yaitu menerapkan autentifikasi JDBC Realms pada web aplikasi kita. Buatlah sebuah web aplikasi, atau pakai web aplikasi kita yang memang sudah ada untuk bisa kita terapkan autentifikasi ini. Cara mengaktifkan authentifikasi ini pada web aplikasi adalah dengan cara mengedit File web.xml yang ada pada folder /webapps/<your-application>/WEB-INF/

Pengeditan dilakukan dengan cara menambah baris-baris seperti di bawah ini pada File web.xml:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
version="2.5">

<!--Access Configuration based on Realms-->
<security-constraint>
<web-resource-collection>
<web-resource-name>All Page</web-resource-name>
<url-pattern>/*</url-pattern>
</web-resource-collection>
<auth-constraint>
<role-name>tomcat</role-name>
</auth-constraint>
</security-constraint>

<login-config>
<auth-method>BASIC</auth-method>
<Realm-name>Tomcat-Advance-Authentication-Realm</Realm-name>
</login-config>
……………
……………

<web-apps>

Pada baris tsb, semua autentifikasi dilakukan pada semua resources yang ada pada web-aplikasi ditandai dengan baris <url-pattern>/*</url-pattern>, kemudian untuk metode autorisasinya disini kita menggunakan autorisasi BASIC.

Demikianlah, percobaan kita kali ini, menggunakan autentifikasi JDBC Realm pada Tomcat sebagai validasi user terhadap resources web aplikasi kita. Silahkan dikembangkan sesuai dengan keinginan dan kebutuhan.


Terima kasih.

Menteng, 26 Januari 2008.

Josescalia.

No comments: