Serial Spring Boot Security: Hello World

Serial Spring Boot Security: Hello World

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

Console output jika berjalan normal

Console output jika berjalan normal

Buka browser dan ketikkan URL httpp://localhost:8080/hello. Kita akan diarahkan ke resource html yang kita buat tadi, hasilnya kira-kira seperti ini,

Default screen hello tanpa plugin security

Default screen hello tanpa plugin security

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.

Login screen

Login screen

Login ditolak

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.

Sukses login

Sukses login

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.

Category:
Share:

Comments