Quarkus Security 1- HTTP Basic Auth dengan storage di properties files
1. Sekilas Info
Quarkus Rest dengan IntelliJ IDEA IDE |
Web browser dapat menggunakan header Authorization untuk mengirimkan username dan password dalam setiap permintaan HTTP. Header ini ditulis sebagai Authorization: Basic <kredensial>, di mana kredensial adalah hasil pengkodean Base64 dari username pengguna dan kata sandi yang dipisahkan oleh tanda titik dua.
Sebagai contoh:
Jika nama pengguna adalah Alice dan kata sandinya adalah secret, maka header otorisasi HTTP yang akan dikirimkan adalah Authorization: Basic QWxjZTpzZWNyZXQ=. Di sini, QWxjZTpzZWNyZXQ= adalah representasi yang telah dikodekan dalam Base64 dari string Alice:secret.
Namun, penting untuk dicatat bahwa mekanisme otentikasi Basic ini tidak memberikan perlindungan kerahasiaan untuk kredensial yang dikirimkan. Kredensial tersebut hanya dikodekan dengan Base64 saat dalam perjalanan, dan tidak dienkripsi atau di-hash dengan cara apa pun. Oleh karena itu, untuk menjaga kerahasiaan, sebaiknya gunakan otentikasi Basic bersama dengan HTTPS.
Otentikasi Basic adalah skema yang sederhana dan jelas, yang dipahami oleh semua web browser dan sebagian besar server web.
2. Implement elytron-security-properties
Quarkus memungkinkan penggunaan file .properties untuk mengatur otentikasi, terutama dalam pengembangan dan pengujian. Namun, penting untuk diingat bahwa metode ini tidak disarankan untuk produksi karena hanya mendukung kata sandi dalam format teks biasa dan MD5, yang dapat menimbulkan risiko keamanan.
Oleh karena itu, pengembang harus mempertimbangkan alternatif yang lebih aman untuk otentikasi di lingkungan produksi.
Pengaturan yang Diperlukan untuk Otentikasi
- Untuk mengaktifkan otentikasi berbasis file .properties, Anda perlu menambahkan beberapa pengaturan ke dalam file build Anda.
- Pastikan untuk mengaktifkan pengguna yang disimpan secara lokal dengan mengatur
quarkus.security.users.embedded.enabled
ketrue
. - Anda juga dapat menentukan pengguna dan kata sandi mereka dalam format teks biasa, meskipun ini tidak disarankan untuk aplikasi yang berjalan di lingkungan produksi.
Risiko Keamanan
- Menggunakan kata sandi dalam format teks biasa dapat membuat aplikasi rentan terhadap serangan.
- MD5, meskipun lebih baik daripada teks biasa, juga dianggap tidak cukup aman untuk aplikasi modern.
- Oleh karena itu, penting untuk mengevaluasi dan menerapkan metode otentikasi yang lebih kuat, seperti menggunakan hashing yang lebih aman atau sistem otentikasi berbasis token.
Rekomendasi untuk Produksi
- Untuk aplikasi yang akan digunakan di lingkungan produksi, pertimbangkan untuk menggunakan metode otentikasi yang lebih canggih, seperti OAuth2 atau OpenID Connect.
- Pastikan untuk menyimpan kata sandi dengan aman menggunakan algoritma hashing yang kuat dan tidak menyimpannya dalam format yang dapat dibaca.
3. Setup build.gradle
dependencies {
implementation enforcedPlatform("${quarkusPlatformGroupId}:${quarkusPlatformArtifactId}:${quarkusPlatformVersion}")
implementation 'io.quarkus:quarkus-rest'
implementation 'io.quarkus:quarkus-arc'
testImplementation 'io.quarkus:quarkus-junit5'
testImplementation 'io.rest-assured:rest-assured'
implementation 'io.quarkus:quarkus-elytron-security-properties-file'
}
4. Setup Maven (Bila Pakai Maven)
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-elytron-security-properties-file</artifactId>
</dependency>
Kita memakai ektensi elytron-security-properties-file yang mendukung dua realms berbeda untuk mengimpan data authentication dan authorization. Keduanya mendukung penyimpanan informasi pada file properties.
a. enforcedPlatform(...)
-
Ini memastikan semua dependency Quarkus versi tertentu konsisten.
-
quarkusPlatformGroupId
,quarkusPlatformArtifactId
,quarkusPlatformVersion
biasanya didefinisikan digradle.properties
. -
Fungsinya supaya versi REST, ARC, Hibernate, dll, cocok satu sama lain.
b. implementation 'io.quarkus:quarkus-rest'
-
Menambahkan dukungan REST API (JAX-RS) ke project.
c. implementation 'io.quarkus:quarkus-arc'
-
ARC = CDI (Context & Dependency Injection) Quarkus.
-
Memungkinkan kamu pakai
@Inject
dan dependency injection di seluruh project.
d. implementation 'io.quarkus:quarkus-elytron-security-properties-file'
-
Extension untuk Basic Auth dengan embedded users.
-
Membaca username/role dari properties file (
application.properties
).
e. testImplementation 'io.quarkus:quarkus-junit5'
-
Library untuk testing unit & integration dengan JUnit 5 di Quarkus.
f. testImplementation 'io.rest-assured:rest-assured'
-
Library testing REST API, bisa bikin HTTP request & memverifikasi response.
5. ExampleResource.java
package com.yoesoff.demo;
import jakarta.annotation.security.RolesAllowed;
import jakarta.ws.rs.GET;
import jakarta.ws.rs.Path;
import jakarta.ws.rs.Produces;
import jakarta.ws.rs.core.MediaType;
@Path("/hello")
public class ExampleResource {
@GET
@Produces(MediaType.TEXT_PLAIN)
@RolesAllowed("admin")
public String hello() {
return "Hello from Quarkus REST";
}
}
Penjelasan sederhana:
- RolesAllowed: untuk role-based access control.
- GET: mengindikasikan penggunaan HTTP GET requests.
- Path: Memberi tahu URI path pada resource.
- Produces: Indikasi bahwa media type(s) yang dia haslkan
- MediaType: Konstan untuk berbagai media types, seperti TEXT_PLAIN.
6. application.properties
# Quarkus 3.25.3 HTTP Basic Auth properties
quarkus.http.auth.basic=true
quarkus.security.users.embedded.enabled=true
quarkus.security.users.embedded.plain-text=true
quarkus.security.users.embedded.users.scott=jb0ss
quarkus.security.users.embedded.users.stuart=test
quarkus.security.users.embedded.users.jdoe=p4ssw0rd
quarkus.security.users.embedded.users.noadmin=n0Adm1n
quarkus.security.users.embedded.roles.scott=Admin,admin,Tester,user
quarkus.security.users.embedded.roles.stuart=admin,user
quarkus.security.users.embedded.roles.jdoe=NoRolesUser
quarkus.security.users.embedded.roles.noadmin=user
File application.properties
adalah file konfigurasi yang digunakan dalam aplikasi Quarkus untuk
mengatur berbagai pengaturan, termasuk otentikasi dan keamanan. Dalam
contoh ini, kita melihat pengaturan untuk otentikasi dasar HTTP pada
versi Quarkus 3.25.3.
Pertama, pengaturan quarkus.http.auth.basic=true
mengaktifkan otentikasi dasar, yang memungkinkan aplikasi untuk
memverifikasi identitas pengguna melalui nama pengguna dan kata sandi.
Selanjutnya, quarkus.security.users.embedded.enabled=true
mengaktifkan penggunaan pengguna yang disimpan secara lokal dalam aplikasi, sementara quarkus.security.users.embedded.plain-text=true
menunjukkan bahwa kata sandi pengguna disimpan dalam format teks biasa, yang berarti tidak dienkripsi.
Di bawah pengaturan pengguna, kita melihat
beberapa entri yang mendefinisikan pengguna dan kata sandi mereka.
Misalnya, pengguna dengan nama scott
memiliki kata sandi jb0ss
, sedangkan pengguna lain seperti stuart
, jdoe
, dan noadmin
juga memiliki kata sandi masing-masing. Selain itu, setiap pengguna juga diberikan peran tertentu melalui pengaturan quarkus.security.users.embedded.roles
. Misalnya, pengguna scott
memiliki beberapa peran, termasuk Admin
, admin
, Tester
, dan user
, sedangkan pengguna stuart
hanya memiliki peran admin
dan user
.
Pengaturan ini memungkinkan pengembang untuk dengan mudah mengelola otentikasi dan otorisasi pengguna dalam aplikasi Quarkus, meskipun penting untuk diingat bahwa menyimpan kata sandi dalam format teks biasa dapat menimbulkan risiko keamanan. Oleh karena itu, dalam aplikasi produksi, disarankan untuk menggunakan metode penyimpanan kata sandi yang lebih aman, seperti hashing.
7. Test Hasil Pembuatan
Username: scott Password: jb0ss url: http://localhost:8080/hello
Buka Lokalhost dan lihat form username dan password muncul |
Protected resource bisa di akses |
Sebagai kesimpulan, meskipun Quarkus
menyediakan kemudahan dalam menggunakan file .properties untuk
otentikasi selama pengembangan dan pengujian, penting untuk selalu
mempertimbangkan aspek keamanan saat merancang aplikasi untuk lingkungan
produksi. Menggunakan metode otentikasi yang lebih aman dan menyimpan
kata sandi dengan cara yang tepat akan membantu melindungi data pengguna
dan menjaga integritas aplikasi Anda. Selalu prioritaskan keamanan
dalam setiap tahap pengembangan untuk memastikan aplikasi yang andal dan
aman.
Sumber Belajar.
- https://quarkus.io/guides/security-basic-authentication-howto
- https://quarkus.io/guides/security-properties
Comments
Post a Comment