Keamanan jelas sudah menjadi fitur wajib yang ada dalam sebuah aplikasi bahkan meskipun itu hanya merupakan aplikasi blog semata. Keamanan menunjukkan integritas data dan service yang diberikan oleh sebuah institusi melalui aplikasi-nya. Apalagi aplikasi sekelas e-commerce dan aplikasi yang menyediakan data finansial, sudah tentu security-nya harus di-manage dengan baik.
Dalam serial ini, kita akan mempelajari tentang fitur security dari framework Spring. Dalam implementasinya kita akan menggunakan Spring Boot yang ditambahkan dependency Spring Security.
Spring Security sendiri adalah salah satu project dari framework Spring dengan banyak fitur-fitur menarik: key authentication dengan LDAP, SSO, JAAS dan lain-lain. Dengan dokumentasi yang terstruktur pula, akan memudahkan kita untuk mempelajarinya, mari kita mulai!
Untuk awal, silahkan download starter Spring Boot project dari start.spring.io. Masukkan nama group (nama brand/company yang nantinya akan jadi struktur package, biasanya dimulai dengan nama domain terlebih dahulu, misal: id.daengweb.springsecurity.tutorial) dan artifact (nama project, misal: daengweb-spring-security-tutorial). Isi dependency dengan: Web dan Thymeleaf. Lalu klik Generate Project. Starter project siap digunakan.
Buka file starter project tadi dengan editor kesayangan kamu, penulis sendiri menggunakan Intellij IDEA.
Setelah project di-import ke dalam editor, jangan lupa install dependency yang dibutuhkan dengan run command maven: mvn clean install
. Intellij IDEA sendiri punya fitur auto-import untuk melakukan ini.
Untuk mengamankan sebuah aplikasi, pertama-tama kita harus memiliki aplikasi yang tidak aman -tentu saja, hehe. Starter project yang kita download ini tidak memiliki fitur security apapun. Coba buat 1 file resource html dan 1 file config untuk mengarahkan kita ke resource tersebut.
Buat 1 file html dengan nama hello.html
di dalam direktori src/main/resource
.
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org" xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity3">
<head>
<meta charset="UTF-8">
<title>Greetings from Spring Security Tutorial</title>
</head>
<body>
<h3>Hello world!</h3>
</body>
</html>
Lalu kita buat file config untuk redirect dari URL ke resource tersebut. Buat package baru di id.daengweb.springsecurity.tutorial.config
. Lalu generate class MvcConfig.java
.
package com.ichromanrd.spring.security.start.config;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class MvcConfig implements WebMvcConfigurer {
@Override
public void addViewControllers(ViewControllerRegistry registry) {
registry.addViewController("/hello").setViewName("hello");
}
}
Lalu jalankan aplikasi kita dengan command maven: mvn clean compile run
, atau bisa dengan run class Application.java
.
Setelah aplikasi berhasil dijalankan dengan sempurna dan memunculkan output seperti di bawah ini
Buka browser dan ketikkan URL httpp://localhost:8080/hello. Kita akan diarahkan ke resource html yang kita buat tadi, hasilnya kira-kira seperti ini,
Tahap pertama selesai. Kita telah membuat aplikasi yang tidak aman. Artinya siapapun dapat mengakses http://localhost:8080/hello dan bisa melihat konten yang ada di situ. Sekarang saatnya kita melakukan proteksi kepada URL tersebut dan hanya memberikan otorisasi untuk mengakses URL tersebut kepada authenticated user.
Untuk menambahhkan fitur Spring Security, tambahkan kode berikut ke dalam file pom.xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
Lakukan dependency install dengan run command maven: mvn install
, untuk men-download dependency Spring Security.
Spring akan otomatis mendeteksi dependency Security di dalam class path dan memberikan basic authentication kepada aplikasi kita. Sekarang coba run kembali aplikasi kita dan buka http://localhost:8080/hello. Kita akan otomatis diarahkan ke halaman login, dan jika kita berusaha untuk login, pasti tidak akan bisa.
Ini dikarenakan kita belum melakukan set-up credential user mana saja yang dibolehkan untuk mengakses aplikasi kita.
Buat 1 file config lagi untuk Spring Security. Di sini kita akan mengatur permission user yang dibolehkan login.
WebSecurityConfig.java
package com.ichromanrd.spring.security.start.config;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
@Configuration
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
auth.inMemoryAuthentication()
.withUser("user")
.password( "{noop}password" )
.roles("USER");
}
}
Re-run aplikasi kita, lalu akses http://localhost:8080/hello dan kita akan kembali diarahkan ke halaman login. Masukkan user: user dan password: password. Voila! Kita sekarang bisa mengakses halaman hello.
Mengapa pada password kita menambahkan "{noop}"
? Password yang di-store secara default membutuhkan password encoder. Karena kita menyimpan plain password, maka kita berikan tanda {noop}
yang artinya tanpa password encoder. Kita bisa saja menambahkan password encoder seperti SHAPasswordEncoder atau MD5PasswordEncoder. Kita akan mencoba menggunakan BcryptPasswordEncoder yang lebih modern.
Modifikasi class WebSecurityConfig.java
menjadi seperti berikut
package com.ichromanrd.spring.security.start.config;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
@Configuration
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Bean
public BCryptPasswordEncoder getPasswordEncoder() {
return new BCryptPasswordEncoder();
}
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
auth.inMemoryAuthentication()
.withUser("user")
.password( getPasswordEncoder().encode("password") )
.roles("USER");
}
}
Re-run aplikasi kita dan sekarang coba lagi login. Yap, tidak ada perubahan berarti, hanya saja password kita sekarang lebih aman karena sudah dilakukan encoding.
Nah, pada seri pertama ini kita sudah berhasil membuat project Spring Security. Source code pada seri ini dapat dilihat di https://github.com/ichromanrd/spring-security-tutorial/tree/master/starter. Di seri selanjutnya kita akan belajar lebih jauh tentang WebSecurityConfigurerAdapter dan proses authentification.
Terima kasih.
Comments