Memakai Spring Security Di Grails


Untuk menambahkan fitur keamanan di Grails, saya dapat memakai Spring Security.  Yup!  Benda yang sama seperti yang saya pakai di Spring Framework sehingga saya tidak perlu mempelajari sesuatu yang sangat baru.

Saya akan mulai dengan menambah plugin spring-security-core pada proyek latihan.  Btw, plugin adalah sebuah mekanisme untuk menambah fitur yang tidak ada pada Grails bawaan.  Tidak seperti pada istilah di CMS, plugin Grails ditargetkan untuk dipakai oleh developer bukan pengguna (lebih mirip seperti komponen).  Jadi, ada peluang bagi seorang developer untuk membuat plugin yang nantinya bisa dipakai oleh developer lain yang tidak ingin repot.  Halaman http://grails.org/plugins berisi seluruh daftar plugin yang tersedia untuk Grails saat ini.

Untuk memakai plugin spring-security-core, saya menambahkan baris berikut ini di file BuildConfig.groovy:

...
plugins {
  ...
  compile ":spring-security-core:1.2.7.3"
  ...
}

Setelah itu, saya memberikan perintah berikut ini agar Grails men-download file yang dibutuhkan:

refresh-dependencies

Setelah proses download selesai, saya akan menemukan sebuah baris dengan isi berupa Installed plugin spring-security-core-1.2.7.3.  Sekarang, saya dapat mulai melakukan konfigurasi Spring Security.

Saya perlu membuat domain class yang dibutuhkan oleh Spring Security.  Untuk itu, saya memberikan perintah:

s2-quickstart com.latihan User Role

Plugin Spring Security secara otomatis akan membuat domain class bernama com.latihan.Role, com.latihan.User, dan com.latihan.UserRole.  Selain itu, ia juga akan membuat controller dengan nama LoginController.groovy dan LogoutController.groovy.

Selanjutnya, saya membuat sebuah domain class Mahasiswa dan menghasil scaffolding sama seperti yang saya lakukan di tulisan Memakai Grails’ Object Relation Mapping (GORM).  Saya ingin siapa saja boleh melihat daftar mahasiswa yang ada, tetapi hanya user admin yang boleh melakukan modifikasi data mahasiswa.

Saya akan menambahkan data percobaan setiap kali aplikasi dijalankan.  Hal ini supaya saya tidak perlu men-klik tombol Create untuk membuat semua domain object yang terlibat.  File BootStrap.groovy di bagian conf (bila dilihat dari plugin STS) berisi kode program yang akan dikerjakan setiap kali aplikasi dijalankan.  Oleh sebab itu,  saya mengubah file ini sehingga terlihat seperti berikut ini:

import com.latihan.*;

class BootStrap {

  def init = { servletContext ->
    def adminRole = new Role(authority: 'ROLE_ADMIN').save(flush: true)
    def testUser = new User(username: 'snake', enabled: true, password: 'password').save(flush: true)
    UserRole.create(testUser, adminRole, true)		

    new Mahasiswa(nim: "1122334455", nama: "Solid Snake", usia: 27).save(flush: true)
    new Mahasiswa(nim: "1122334466", nama: "Jocki Hendry", usia: 28).save(flush: true)
    new Mahasiswa(nim: "1122334477", nama: "Liquid Snake", usia: 25).save(flush: true)

    assert User.count()==1
    assert Role.count()==1
    assert Mahasiswa.count()==3
  }
}

Saya akan mendefinisikan keamanan dalam bentuk annotation, oleh sebab itu, saya perlu menambahkan baris berikut ini di Config.groovy:

grails.plugins.springsecurity.securityConfigType = "Annotation"

Lalu, saya menambahkan annotation @Secured pada action di controller yang ingin saya lindungi.  Karena yang boleh melalukan modifikasi CRUD hanya user dengan role ROLE_ADMIN, maka saya memberika annotation seperti berikut ini:

class MahasiswaController {
  def index() { ... }

  def list() { ... }

  @Secured(['ROLE_ADMIN'])
  def create() { ... }

  @Secured(['ROLE_ADMIN'])
  def save() { ... }

  def show(Long id) { ... }

  @Secured(['ROLE_ADMIN'])
  def edit(Long id) { ... }

  @Secured(['ROLE_ADMIN'])
  def update(Long id, Long version) { ... }

  @Secured(['ROLE_ADMIN'])
  def delete(Long id) { ... }
}

Saya akan menjalankan aplikasi dengan memberikan perintah run-app.  Setelah itu, saya akan membuka url http://localhost:8080/latihan/mahasiswa/list.  Siapa saja bisa melihat daftar mahasiswa yang ada.  Tetapi begitu saya men-klik tombol New Mahasiswa, saya akan dibawa ke halaman login (dibuat oleh Spring Security secara otomatis) seperti yang terlihat pada gambar berikut ini:

Halaman Login Yang Dibuat Spring Security

Halaman Login Yang Dibuat Spring Security

Untuk mengerjakan action di controller yang khusus untuk role ROLE_ADMIN, saya dapat login dengan menggunakan user snake dan password berupa password.

Saya dapat menambahkan beberapa elemen di view supaya pengguna bisa logout dengan memakai Security TagLib.  Saya akan menambahkan kode berikut ini tepat sebelum definisi <table>:

<div style="margin: 10px;">
  <sec:ifLoggedIn>
    Selamat datang, <sec:loggedInUserInfo field="username" /> |
    <g:link controller="logout">Logout</g:link>
  </sec:ifLoggedIn>
  <sec:ifNotLoggedIn>
    <g:link controller="login">Login</g:link>
  </sec:ifNotLoggedIn>
</div>

Isi tag <sec:ifLoggedIn> hanya akan ditampilkan bila user sudah login, sebaliknya, isi tag <sec:ifNotLoggedIn> hanya akan ditampilkan bila user belum login.  Didalam masing-masing tag, saya memakai <g:link> untuk memanggil LoginController atau LogoutController yang isinya dihasilkan oleh Spring Security plugin.

Sekarang, bila saya sudah login dan membuka halaman list, saya akan menemukan pilihan untuk logout seperti pada tampilan seperti berikut ini:

Tampilan Dengan Pilihan Logout Bila User Sudah Login

Tampilan Dengan Pilihan Logout Bila User Sudah Login

Perihal Solid Snake
I'm nothing...

Apa komentar Anda?

Please log in using one of these methods to post your comment:

Logo WordPress.com

You are commenting using your WordPress.com account. Logout / Ubah )

Gambar Twitter

You are commenting using your Twitter account. Logout / Ubah )

Foto Facebook

You are commenting using your Facebook account. Logout / Ubah )

Foto Google+

You are commenting using your Google+ account. Logout / Ubah )

Connecting to %s

%d blogger menyukai ini: