Sabtu, 11 Desember 2010

Pengenalan Spring Security

Suatu hari Ciplus ditelefon Pak Paijo, manager PT XXX, salah seorang client yang telah meneken kontrak mengembangkan aplikasi berbasis web pada sistem akuntansi di perusahaannya, bulan lalu aplikasi tersebut telah diinstall pada komputer2 di perusahannya. "Halo saya mau komplain ini!" kata beliau di seberang telefon, "Busyet mo komplain aja pake ngrokok segala, mana rokok murahan lagi!" batin Ciplus menahan batuk karena asap yang keluar dari gagang telepon, "Maaf pak tolong rokoknya dimatikan dulu", kata Ciplus dengan sopan. "Oke, saya matikan, tapi tolong kamu kesini sebentar, ini kenapa data pembukuan perusahaan bisa kacau gini? Kamu kesini sekarang, benerin ini program kamu!", kata beliau dengan tegas. "Tapi pak ini kan hari minggu, ini juga baru jam 2 pagi, bagaimana kalau nanti agak siang kira pas jam makan siang bapak, jadi saya bisa nebeng makan gratis?", kata Ciplus. "Yaudah nanti jam 13.00 kamu kesini, nanti saya minta Jessica, pembantu saya, untuk masak tempe goreng dan sambal saja seperti makanan kamu sehari-hari", "Oalah niat mo makan enak saja susah bener, gimana tubuh bisa berisi kalau makanan kurang gizi terus begini".

Jam 12.30 akhirnya Ciplus berangkat, "Bisa abis makan siang kalo berangkat telat", batin Ciplus sambil lari ngejar angkot, soalnya sopir angkotnya rada gokil, suka mainin penumpang, dicegat disini eh berhentinya 50 meter didepan, terus dikasih waktu 5 detik kalau ga naik bakal ditinggal. Singkat cerita sampailah Ciplus di kantor Pak Paijo dengan terengah-engah, maklum harus oper angkot tiga kali. Aplikasi tersebut ditrace ga ada errornya, sepertinya aplikasinya baik2 saja, kenapa datanya bisa berubah? Akhirnya setelah menyewa detektif swasta diketahui bahwa penyebabnya adalah Steven, OB di kantor tersebut, yang sering bermain-main dengan komputer perusahaan. Bagaimana bisa Steven, Office Boy, bisa mengubah data-data seenaknya? Ternyata aplikasi tersebut tidak diberi modul hak akses, jadi semua orang bisa menggunakan aplikasi tersebut.

Panjang banget ya ceritanya? Intinya apa sih? Ya intinya security itu penting dalam sebuah aplikasi yang dikembangkan, bisa juga diberikan tingkatan hak akses, sehingga user yang tidak berhak tidak bisa mengakses modul atau mengubah data. Kalau intinya cuma itu kenapa harus dikasih prolog yang panjang? Blog saya ini mengusung tema cerita dalam segala hal, jadi intinya biar beda lah ama blog-blog pada umumnya hehehehe... Satu lagi pertanyaan, kenapa itu nama pembantu dan OB keren-keren begitu? Pak Paijo ini orang kaya dia ga mau cari pembantu orang lokal, maunya pembantu import. Cerita ini fiktif belaka, nama pemeran pun diubah juga biar lebih fiktif lagi.

Kita bisa mengembangkan modul keamanan kita sendiri, tapi bagi para pengguna Spring, kita bisa menggunakan framework Spring Security untuk mempermudah pekerjaan kita. Kali ini saya ingin berbagi pengalaman menggunakan Spring Security, jadi posting kali ini adalah pengenalan Spring Security. Lain kali saya akan berbagi pengalaman untuk menggunakan Spring Security ini di tingat yang lebih lanjut. Kalo ada teman-teman yang sudah master, boleh lah berbagi ilmunya. Oke saatnya kita serius :-p

Biar up to date, kita menggunakan Spring versi 3.0.x. Bagi yang belum familiar dengan Spring sebaiknya kunjungi blog Bung Endy. ( Nice Blog Sir, I learned a lot from your blog, thx). Saya juga menggunakan NetBeans sebagai IDE-nya. Bagi pengguna IDE lain tidak masalah tinggal menyesuaikan saja. Berikutnya download dulu Spring Security. Extract semua library dan kaitkan dengan NetBeans.

Buat Project Baru, kategori web.

Beri nama project, misal LatihanSecurity.

Selanjutnya tambahkan library yang diperlukan. Edit web.xml seperti di bawah ini.

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" 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">
    
    <display-name>Latihan Security</display-name>

    <!--
      - Lokasi dari file XML yang mendefinisikan root application context
      - Diaplikasikan oleh ContextLoaderListener.
      -->
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>
            /WEB-INF/applicationContext-security.xml
        </param-value>
    </context-param>

    <!-- Nothing below here needs to be modified -->

    <context-param>
        <param-name>log4jConfigLocation</param-name>
        <param-value>/WEB-INF/classes/log4j.properties</param-value>
    </context-param>

    <context-param>
        <param-name>webAppRootKey</param-name>
        <param-value>latihan.root</param-value>
    </context-param>
    
    <filter>
        <filter-name>springSecurityFilterChain</filter-name>
        <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
    </filter>

    <filter-mapping>
        <filter-name>springSecurityFilterChain</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

    <listener>
        <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
    </listener>

    <!--
    - MVC application controller. Lihat latihan-servlet.xml.
    -->
    <servlet>
        <servlet-name>latihan</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>latihan</servlet-name>
        <url-pattern>*.htm</url-pattern>
    </servlet-mapping>

    <session-config>
        <session-timeout>
            30
        </session-timeout>
    </session-config>

    <welcome-file-list>
        <welcome-file>index.jsp</welcome-file>
    </welcome-file-list>

</web-app>

Tambahkan applicationContext-security.xml di folder WEB-INF. Isinya sebagai berikut :
<?xml version="1.0" encoding="UTF-8"?>

<!--
  - Application context containing authentication, channel
  - security and web URI beans.
  -
  - Only used by "filter" artifact.
  -
  -->
<b:beans xmlns="http://www.springframework.org/schema/security"
    xmlns:b="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
                        http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-3.0.xsd">

    <global-method-security pre-post-annotations="disabled">
        <!--<expression-handler ref="expressionHandler"/>-->
    </global-method-security>

    <http auto-config="true">
        <intercept-url pattern="/login.jsp" filters="none" />
        <intercept-url pattern="/**" access="ROLE_USER" />
    </http>

    <authentication-manager>
        <authentication-provider>
            <user-service id="userDetailsService">
                <user name="username" password="password" authorities="ROLE_USER, ROLE_ADMIN" />
                <user name="test" password="test" authorities="ROLE_USER" />
            </user-service>
        </authentication-provider>
    </authentication-manager>
</b:beans>

Tambahkan latihan-servlet.xml di folder WEB-INF. Isinya sebagai berikut :
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context"
        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
                http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd">
        
 <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
  <property name="mappings">
   <value>/*.htm=urlController</value>
  </property>
 </bean>

 <bean id="urlController"
  class="org.springframework.web.servlet.mvc.UrlFilenameViewController" />

 <!--
  untuk contoh kali ini kita pakai jsp saja, simpan semua file jsp ke /WEB-INF/jsp/
  sehinggan resolver akan mengarahkan ke sana.
 -->
 <bean id="viewResolver"
  class="org.springframework.web.servlet.view.InternalResourceViewResolver">
  <property name="viewClass"
   value="org.springframework.web.servlet.view.JstlView" />
  <property name="prefix" value="WEB-INF/jsp/" />
  <property name="suffix" value=".jsp" />
 </bean>
</beans>

Buat file home.jsp di folder /WEB-INF/jsp/ jadi hanya user yang login yang nantinya bisa mengakses halaman ini. Contoh isinya seperti ini :
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
   "http://www.w3.org/TR/html4/loose.dtd">

<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>Home : Latihan Security</title>
    </head>
    <body>
        <h1>Hanya User yang bisa masuk ke sini!</h1>
    </body>
</html>

Selanjutnya coba build dan deploy project tersebut. bila halaman diarahkan ke halaman login, berarti Spring security sudah bekerja. Selamat dan sukses. Jangan lupa syukuran :-D. Posting berikutnya saya akan mencoba mengulas lebih dalam lagi. Kritik dan saran saya tunggu.

4 komentar:

  1. nga mudeng aw mas..maklum newbe...hikz

    BalasHapus
  2. Gpp Bro, sama2 newbie kok.. ni juga lagi belajar. Yang penting belajar dulu Spring baru securitynya, thx dah berkunjung ya:-)

    BalasHapus
  3. @Yovano : Yang terkesan bukan ilmunya malah prolognya T_T

    BalasHapus