0% menganggap dokumen ini bermanfaat (0 suara)
102 tayangan

Modul Training Java Spring Boot Day - 4

Metode createAccessToken pada kelas UserServiceImpl bertanggung jawab untuk membuat token akses berdasarkan autentikasi pengguna menggunakan Spring Security dan JSON Web Tokens untuk keamanan aplikasi."

Diunggah oleh

abimanyudcse
Hak Cipta
© © All Rights Reserved
Format Tersedia
Unduh sebagai PDF, TXT atau baca online di Scribd
0% menganggap dokumen ini bermanfaat (0 suara)
102 tayangan

Modul Training Java Spring Boot Day - 4

Metode createAccessToken pada kelas UserServiceImpl bertanggung jawab untuk membuat token akses berdasarkan autentikasi pengguna menggunakan Spring Security dan JSON Web Tokens untuk keamanan aplikasi."

Diunggah oleh

abimanyudcse
Hak Cipta
© © All Rights Reserved
Format Tersedia
Unduh sebagai PDF, TXT atau baca online di Scribd
Anda di halaman 1/ 16

Training Java Spring Boot

I. Membuat REST API Signin Dengan Oauth2


Berikut adalah langkah langkah untuk membuat rest api signin dengan oauth2
A. Tambah dependency pada pom.xml

1. Dependensi Spring Security


- <dependency> dengan spring-boot-starter-security: Ini adalah pemicu
Spring Boot untuk menyertakan Spring Security dalam proyek Anda. Ini
menyediakan konfigurasi keamanan default dan dependensi yang
diperlukan.
- <dependency> dengan spring-security-oauth2-autoconfigure: Ini terkait

Training Java Spring Boot Day 4 - 1


dengan otomatisasi konfigurasi Spring Security OAuth2. Ini membantu
mengatur otentikasi OAuth2 dalam aplikasi Spring Boot.
- <dependency> dengan spring-security-oauth2-core: Ini menyediakan
fungsionalitas inti untuk OAuth2 dalam Spring Security.
2. Dependensi Uji Spring Security
- <dependency> dengan spring-security-test: Ini digunakan untuk menguji
komponen-komponen Spring Security. Ini menyediakan utilitas dan anotasi
untuk memudahkan pengujian konfigurasi keamanan.
3. Dependensi JWT (JSON Web Token)
- <dependency> dengan io.jsonwebtoken:jjwt: Ini adalah perpustakaan JWT
Java untuk bekerja dengan Token Web JSON. JWT sering digunakan
untuk otentikasi dan pertukaran informasi antara pihak-pihak yang terlibat.
4. Dependensi Commons IO dan Commons Lang
- <dependency> dengan commons-io: Ini adalah perpustakaan Apache
Commons IO, menyediakan utilitas untuk bekerja dengan operasi I/O.
- <dependency> dengan commons-lang3: Ini adalah perpustakaan Apache
Commons Lang, menawarkan utilitas untuk tugas pemrograman umum.
- <dependency> dengan commons-collections4: Ini adalah perpustakaan
Apache Commons Collections, menyediakan jenis koleksi tambahan dan
utilitas.
B. Buat package security dan buat class WebSecurityConfiguration

Training Java Spring Boot Day 4 - 2


1. @EnableGlobalMethodSecurity(prePostEnabled = true)
- Fungsi: Anotasi ini mengaktifkan dukungan untuk anotasi-level security
menggunakan @PreAuthorize, @Secured, dan sejenisnya pada metode-
metode di kelas layanan (service). prePostEnabled = true memungkinkan
penggunaan anotasi @PreAuthorize dan @PostAuthorize.
2. @EnableWebSecurity
- Fungsi: Anotasi ini menandakan bahwa kelas ini mengkonfigurasi
keamanan web menggunakan Spring Security.
3. WebSecurityConfigurerAdapter
- Fungsi: Kelas ini adalah turunan dari WebSecurityConfigurerAdapter,
yang menyediakan konfigurasi default untuk keamanan web. Anda dapat
menggantinya untuk menyediakan konfigurasi kustom sesuai kebutuhan.
4. @Bean public AuthenticationManager authenticationManagerBean()
- Fungsi: Mendefinisikan sebuah bean yang merupakan implementasi dari
AuthenticationManager. Bean ini digunakan untuk mengelola proses
otentikasi.
5. @Override public void configure(WebSecurity web)
- Fungsi: Konfigurasi untuk WebSecurity. Metode ini memungkinkan
konfigurasi yang bersifat umum, seperti mengabaikan beberapa URL dari
proses keamanan (ignoring).
6. @Override protected void configure(HttpSecurity http)
- Fungsi: Konfigurasi untuk HttpSecurity. Metode ini mengatur kebijakan
keamanan HTTP untuk aplikasi. Dalam contoh ini, CSRF dinonaktifkan,
CORS diaktifkan, dan semua permintaan diizinkan tanpa memerlukan
otentikasi.
7. @Bean public RequestHeaderAuthenticationFilter
requestHeaderAuthenticationFilter(AuthenticationManager
authenticationManager)
- Fungsi: Membuat bean RequestHeaderAuthenticationFilter, yang
merupakan filter khusus untuk melakukan otentikasi berdasarkan header
permintaan (request header). Filter ini digunakan untuk menangani
otentikasi berbasis header.
Secara keseluruhan, kelas WebSecurityConfiguration ini mengkonfigurasi
keamanan web untuk mengizinkan akses tanpa otentikasi pada beberapa
URL tertentu, menonaktifkan CSRF, mengaktifkan CORS, dan
mengkonfigurasi beberapa filter khusus seperti
RequestHeaderAuthenticationFilter. Konfigurasi ini dapat berguna tergantung
pada kebutuhan spesifik aplikasi dan penggunaan Spring Security.

Training Java Spring Boot Day 4 - 3


C. Buat properti baru untuk konfigurasi jwt, buat package jwt pada package
security kemudian buat class JwtUtils untuk konfigurasi dari Json Web Token
(JWT)

Training Java Spring Boot Day 4 - 4


1. Generasi Token Akses (JWT)
- Metode: generateJwtToken(String userName)
- Fungsi: Membangun dan menghasilkan token JWT berdasarkan nama
pengguna (username). Token ini berisi informasi tertentu seperti subyek
(subject), waktu penerbitan, waktu kedaluwarsa, dan ditandatangani
dengan menggunakan algoritma HS512 dan kunci rahasia yang ditentukan.
2. Mendapatkan Nama Pengguna dari Token JWT
- Metode: getUserNameFromJwtToken(String token)
- Fungsi: Mengekstrak dan mengembalikan nama pengguna dari token JWT.
Ini dilakukan dengan mengurai klaim subjek (subject) dari token.
3. Validasi Token JWT
- Metode: validateJwtToken(String authToken)
- Fungsi: Memvalidasi token JWT untuk memastikan integritas dan
keabsahannya. Melibatkan proses parsing token dan memeriksa tanda
tangan serta klaim token. Jika token valid, metode ini mengembalikan true;
jika tidak valid, log pesan kesalahan dicatat dan metode mengembalikan
false.
4. Generasi Token Refresh
- Metode: generateRefreshToken(String userName)
- Fungsi: Membangun dan menghasilkan token refresh. Seperti token akses,
token refresh memiliki informasi yang serupa (subyek, waktu penerbitan,
waktu kedaluwarsa), tetapi ditandatangani dengan kunci rahasia yang
berbeda.
5. Mendapatkan Nama Pengguna dari Token Refresh
- Metode: getRefreshTokenUserName(String token)
- Fungsi: Mengekstrak dan mengembalikan nama pengguna dari token
refresh. Ini dilakukan dengan mengurai klaim subjek (subject) dari token
refresh.
Class ini bertanggung jawab untuk mengelola pembuatan, validasi, dan
ekstraksi informasi dari token JWT dan refresh token. Digunakan dalam konteks
keamanan aplikasi untuk mendukung otentikasi dan manajemen sesi.
D. Buat package request pada package model kemudian buat class
AuthenticationRequest

Class diatas berfungsi untuk menjadi penampung object dari request body api

Training Java Spring Boot Day 4 - 5


E. Buat method passwordEncoder pada class MainApplication

1. @Bean("passwordEncoder")
- Anotasi: @Bean menandakan bahwa method ini akan menghasilkan bean,
yaitu objek yang dikelola oleh kontainer Spring.
- Parameter: "passwordEncoder" adalah nama bean yang akan digunakan
untuk mengakses objek ini secara spesifik dalam konteks aplikasi.
2. public PasswordEncoder passwordEncoder()
- Fungsi: Method ini mengembalikan objek yang mengimplementasikan
antarmuka PasswordEncoder. PasswordEncoder digunakan untuk
mengenkripsi dan memverifikasi kata sandi (password) dalam konteks
keamanan aplikasi.
3. return new BCryptPasswordEncoder(BCryptVersion.$2Y);
- Fungsi: Method ini membuat dan mengembalikan instance dari
BCryptPasswordEncoder. Algoritma pengenkripsian yang digunakan
adalah BCrypt, yang merupakan algoritma yang umum digunakan untuk
mengamankan kata sandi.
- Parameter: BCryptVersion.$2Y menentukan versi BCrypt yang digunakan.
Pilihan versi $2Y adalah versi yang umum digunakan dan
direkomendasikan.
Dengan cara ini, bean dengan nama "passwordEncoder" dan implementasi
BCryptPasswordEncoder dapat diakses dan digunakan dalam konfigurasi
Spring Security untuk mengenkripsi dan memverifikasi kata sandi. Penggunaan
PasswordEncoder ini penting untuk meningkatkan keamanan aplikasi dengan
menyimpan kata sandi pengguna dalam bentuk terenkripsi, sehingga kata sandi
yang sebenarnya tidak disimpan dalam bentuk teks biasa.

Training Java Spring Boot Day 4 - 6


F. Buat method baru pada controller dengan menggunakan anotasi
@PostMapping dan anotasi @RequestBody dengan menggunakan class
AuthenticationRequest

1. Tambahkan pemanggilan pada method service yang akan digunakan


sebagai tempat penulisan logic dari api.
2. ResponseEntity berfungsi untuk mendefinisikan value dari body response
api dan juga status code http.
G. Buat method pada interface service dan class serviceImpl (polimorfisme).
H. Pada method classImpl, tambahkan logic berikut

Training Java Spring Boot Day 4 - 7


Method createAccessToken pada kelas UserServiceImpl tampaknya
bertanggung jawab untuk membuat token akses (access token) berdasarkan
autentikasi pengguna menggunakan Spring Security dan JSON Web Tokens
(JWT). Berikut adalah penjelasan tentang fungsi dan langkah-langkah yang
dilakukan oleh method ini
1. @Service
- Anotasi: @Service menandakan bahwa kelas ini adalah sebuah service
bean yang dapat dielola oleh Spring.
2. @Transactional
- Anotasi: @Transactional menandakan bahwa setiap metode dalam kelas ini
akan dijalankan dalam satu transaksi. Ini mendukung keamanan dan
konsistensi data dalam operasi yang melibatkan interaksi dengan basis
data.
3. @Slf4j
- Anotasi: @Slf4j adalah anotasi dari proyek Lombok yang menghasilkan
logger otomatis dengan nama log. Ini memungkinkan penggunaan metode
log tanpa membuat logger manual.
4. Dependency Injection:
- @Autowired private CustomUserDetailService customUserDetailService:
Menginject (menyuntikkan) CustomUserDetailService yang digunakan
untuk mengambil detail pengguna kustom.
- @Autowired private AuthenticationManager authenticationManager:
Menginject AuthenticationManager yang digunakan untuk melakukan
proses otentikasi.
- @Autowired private JwtUtils jwtUtils: Menginject JwtUtils yang digunakan
untuk operasi terkait JWT.
5. Metode createAccessToken(String username, String password)
- Fungsi: Membuat token akses (access token) setelah berhasil
mengotentikasi pengguna berdasarkan username dan password yang
diberikan.
- Langkah-langkah:
- Membuat objek UsernamePasswordAuthenticationToken berdasarkan
username dan password yang diberikan.
- Menggunakan AuthenticationManager untuk mengotentikasi token.
- Mengatur hasil otentikasi dalam konteks keamanan Spring menggunakan
SecurityContextHolder.
- Mengambil detail pengguna yang terotentikasi.
- Membuat token JWT menggunakan JwtUtils.generateJwtToken.
- Memuat kembali detail pengguna dari customUserDetailService untuk
mendapatkan data tambahan.
- Membuat objek respons (ResponseApi) dengan menyertakan token akses,
token refresh, dan data pengguna.
- Menangkap dan mengelola exception jika otentikasi gagal.
Training Java Spring Boot Day 4 - 8
- Mengeksekusi dalam transaksi menggunakan anotasi @Transactional.
6. Log dan Respon:
- Melakukan logging informasi terkait hasil operasi (status, pesan, kode)
menggunakan logger otomatis.
- Mengembalikan objek ResponseApi sebagai respons dari metode.
Secara keseluruhan, metode ini melakukan proses otentikasi menggunakan
Spring Security, menghasilkan token akses dan refresh, dan menyediakan
respons dalam bentuk objek ResponseApi.
I. Buat interface service baru dengan nama CustomUserDetailService dengan
menggunakan extends class UserDetailsService

1. loadUserByUsername(String username)
- Fungsi: Metode ini digunakan untuk memuat informasi lengkap tentang
pengguna (user) berdasarkan username yang diberikan.
- Parameter: username adalah nama pengguna (username) yang akan
digunakan untuk mengidentifikasi pengguna.
- Pengembalian Nilai: Objek UserDetails yang mencakup informasi seperti
username, password, peran (roles), dan detail lainnya tentang pengguna.
- Exception: Jika pengguna dengan username yang diberikan tidak
ditemukan, metode dapat melempar UsernameNotFoundException.
2. Implementasi dari UserDetailsService umumnya terdapat dalam kelas
khusus yang bertanggung jawab untuk mengakses penyimpanan data
(seperti database) dan mengambil informasi pengguna. Implementasi ini
biasanya diintegrasikan dengan Spring Security untuk mendukung
otentikasi dan otorisasi.
3. Contoh implementasi UserDetailsService bisa melibatkan query ke
database untuk mengambil informasi pengguna, atau memanfaatkan
layanan lain yang menyimpan data pengguna. Setelah informasi pengguna
ditemukan, objek UserDetails dibuat dan dikembalikan kepada Spring
Security untuk proses otentikasi lebih lanjut.
4. Secara keseluruhan, UserDetailsService berperan penting dalam
pengembangan aplikasi yang menggunakan Spring Security, karena
menyediakan cara untuk mengambil informasi pengguna dari sumber data
eksternal dan mendukung otentikasi pengguna dalam aplikasi.

Training Java Spring Boot Day 4 - 9


J. Buat class CustomUserDetailServiceImpl dengan polimorfisme, dan tambahkan
method implements CustomUserDetailService
K. Pada class method tersebut buat logic berikut

Method loadUserByUsername pada kelas CustomUserDetailServiceImpl


mengimplementasikan antarmuka UserDetailsService dari Spring Security.
Fungsi utamanya adalah untuk memuat informasi lengkap tentang pengguna
(user) dari sumber data (dalam kasus ini, dari database) berdasarkan username
yang diberikan. Berikut adalah penjelasan fungsi dari method tersebut
1. @Service dan @Slf4j
- Anotasi @Service: Menandakan bahwa kelas ini adalah sebuah service
bean yang dapat dielola oleh Spring.
- Anotasi @Slf4j: Menandakan penggunaan Lombok untuk menghasilkan
logger otomatis dengan nama log.
2. Dependency Injection:
- @Autowired private PasswordEncoder passwordEncoder: Menginject
(menyuntikkan) bean PasswordEncoder yang akan digunakan untuk
melakukan enkripsi dan dekripsi kata sandi (password).
- @Autowired private UserDao dao: Menginject bean UserDao yang
digunakan untuk berinteraksi dengan sumber data (database) untuk
mendapatkan informasi pengguna.

Training Java Spring Boot Day 4 - 10


3. Metode loadUserByUsername(String username)
- Fungsi: Memuat informasi lengkap tentang pengguna berdasarkan
username dari sumber data (dalam hal ini, database).
- Langkah-langkah:
- Menggunakan UserDao untuk mendapatkan objek User berdasarkan
username.
- Melakukan pengecekan apakah pengguna dengan username tersebut
ditemukan. Jika tidak, melempar UsernameNotFoundException.
- Membuat objek Set<GrantedAuthority> yang akan digunakan untuk
menyimpan peran (roles) pengguna.
- Mendekripsi kata sandi (password) yang telah dienkripsi sebelumnya,
mengganti prefix dari $2y$ ke $2a$.
- Membuat objek CustomUserDetails yang mengimplementasikan
UserDetails dengan menggunakan informasi pengguna yang telah dimuat.
- Mengembalikan objek UserDetails yang telah dibuat.
4. Log
- Menggunakan logger otomatis untuk mencatat informasi terkait proses
otentikasi.
Metode ini berfungsi sebagai bagian dari sistem otentikasi dalam aplikasi yang
menggunakan Spring Security. Melalui implementasi UserDetailsService,
metode ini memungkinkan Spring Security untuk memuat informasi pengguna
dari database dan menggunakan informasi tersebut dalam proses otentikasi.
L. Buat method baru pada interface dao
M. Buat method query baru pada mapper dengan menggunakan element <select>

Training Java Spring Boot Day 4 - 11


1. <resultMap id="BaseResultMap" type="com.ogya.training.model.User">
- Fungsi: Membuat pemetaan antara kolom-kolom dalam tabel database
"User" dengan properti-properti pada objek Java User.
- id: Mewakili kolom ID dari tabel.
- result: Mengaitkan setiap kolom dalam tabel dengan properti yang sesuai
pada objek Java.
2. <sql id="Base_Column_List">
- Fungsi: Menyediakan daftar kolom dari tabel "User" untuk digunakan dalam
query SQL.
- u."ID", u."UserName", dst.: Mendefinisikan setiap kolom yang digunakan
dalam daftar.
3. <select id="loadUserByUsername" resultMap="BaseResultMap">
- Fungsi: Mendefinisikan query SQL untuk mengambil data pengguna
berdasarkan nama pengguna (username).
- <include refid="Base_Column_List" />: Menggunakan daftar kolom yang
telah didefinisikan sebelumnya.
- from "User" u: Menunjukkan bahwa data diambil dari tabel "User" dan
diakses menggunakan alias "u".
- where u."UserName" = #{username}: Menggunakan klausa WHERE untuk
memfilter data berdasarkan nama pengguna yang diberikan.
Dengan definisi ini, MyBatis akan menghasilkan SQL query secara otomatis
saat menjalankan metode loadUserByUsername pada mapper UserDao. Data
yang diambil dari database akan dipetakan ke objek User sesuai dengan
definisi BaseResultMap.

Training Java Spring Boot Day 4 - 12


II. Membuat REST API createUser
Pada dasarnya rest api createUser sama saja dengan rest api insert yang lain, akan
tetapi ada sedikit perbedaan pada logic, yaitu menambahkan encode pada nilai dari
password sebelum dilakukan proses pemanggilan query insert

Method tersebut merupakan implementasi dari metode createUser yang tampaknya


berada di dalam kelas yang di-annotate dengan @Service. Berikut adalah penjelasan
dari fungsi masing-masing bagian dalam metode tersebut
1. @Autowired private PasswordEncoder passwordEncoder;
- Fungsi: Menggunakan Dependency Injection untuk menginject (menyuntikkan)
bean PasswordEncoder ke dalam kelas ini.
- Tujuan: Untuk melakukan encoding (hashing) kata sandi (password) sebelum
disimpan ke database. PasswordEncoder digunakan untuk menghasilkan
representasi yang aman dari kata sandi.
2. @Autowired private UserDao dao;
- Fungsi: Menggunakan Dependency Injection untuk menginject (menyuntikkan)
bean UserDao ke dalam kelas ini.
- Tujuan: Mengakses objek UserDao untuk berinteraksi dengan database, terutama
dalam konteks penciptaan pengguna baru.

Training Java Spring Boot Day 4 - 13


3. ResponseApi createUser(User data)
- Fungsi: Membuat pengguna baru dalam sistem.
- Langkah-langkah:
-data.setPassword(passwordEncoder.encode(data.getPassword()));:
Menggunakan PasswordEncoder yang telah diinject untuk mengenkripsi kata
sandi pengguna sebelum disimpan ke dalam database.
- dao.createUser(data);: Menggunakan UserDao yang telah diinject untuk
menjalankan query penciptaan pengguna baru di dalam database.
- Membuat objek ResponseApi sebagai respons dari operasi pembuatan
pengguna.
- Jika sukses, mengatur kode respons, pesan, dan status sukses.
- Jika gagal, menangkap exception yang mungkin terjadi selama operasi, dan
mengatur kode respons, pesan, dan status error.
- Melakukan logging informasi terkait respons.
4. Return responseApi:
- Pengembalian: Mengembalikan objek ResponseApi sebagai respons dari operasi
pembuatan pengguna. Objek ini berisi informasi tentang kesuksesan atau
kegagalan operasi.
Metode ini bertanggung jawab untuk membuat pengguna baru dengan melakukan
encoding kata sandi dan menyimpan informasi pengguna ke dalam database
menggunakan objek UserDao. Objek ResponseApi digunakan untuk memberikan
respons yang jelas terkait dengan hasil operasi tersebut.
Sama halnya dengan rest api resetPassword maupun updateUser, nilai dari password
perlu diencode terlebih dahulu sebelum disimpan.

Training Java Spring Boot Day 4 - 14


III. Java Data Types
Di Java, terdapat berbagai macam tipe data dan objek yang dapat digunakan untuk
merepresentasikan data. Beberapa di antaranya adalah:
1. Primitive Data Types:
- int: Merepresentasikan bilangan bulat (integer).
- double: Merepresentasikan bilangan desimal (floating-point).
- char: Merepresentasikan karakter unicode.
- boolean: Merepresentasikan nilai kebenaran (true/false).
- byte: Merepresentasikan bilangan bulat berukuran 8 bit.
- short: Merepresentasikan bilangan bulat berukuran 16 bit.
- long: Merepresentasikan bilangan bulat berukuran 64 bit.
- float: Merepresentasikan bilangan desimal berukuran 32 bit.
Contoh:
java
int number = 42;
double decimal = 3.14;
char letter = 'A';
boolean isTrue = true;
2. Objects:
- String: Merepresentasikan rangkaian karakter (teks).
java
String text = "Hello, Java!";
- Array: Merepresentasikan kumpulan elemen dengan tipe data yang sama.
java
int[] numbers = {1, 2, 3, 4, 5};
- List: Merepresentasikan kumpulan elemen dengan ukuran dinamis menggunakan
antarmuka dari pustaka Java Collections.
java
List<String> names = new ArrayList<>();
names.add("Alice");
names.add("Bob");
- Map: Merepresentasikan pasangan kunci-nilai.
java
Map<String, Integer> ageMap = new HashMap<>();
ageMap.put("Alice", 25);
ageMap.put("Bob", 30);
- Set: Merepresentasikan himpunan elemen unik.
java
Set<String> uniqueNames = new HashSet<>();
uniqueNames.add("Alice");
uniqueNames.add("Bob");
Training Java Spring Boot Day 4 - 15
- Object: Kelas dasar untuk semua kelas di Java. Semua kelas di Java secara tidak
langsung atau langsung turunan dari kelas ini.
java
Object obj = new Object();
- Date: Merepresentasikan tanggal dan waktu.
java
Date currentDate = new Date();
- File: Merepresentasikan path dan properti dari file atau direktori di sistem file.
java
File myFile = new File("example.txt");
- Scanner: Digunakan untuk mendapatkan input dari pengguna melalui konsol.
java
Scanner scanner = new Scanner(System.in);
- Random: Digunakan untuk menghasilkan bilangan acak.
java
Random random = new Random();
int randomNumber = random.nextInt(100);
- BigInteger dan BigDecimal: Digunakan untuk operasi aritmatika presisi tinggi.
java
BigInteger bigInteger = new BigInteger("123456789012345678901234567890");
BigDecimal bigDecimal = new BigDecimal("123.456");
Objek-objek ini memberikan fungsionalitas lebih kompleks dan lebih spesifik
dibandingkan dengan tipe data primitif, dan mereka sering digunakan untuk
memodelkan data dan perilaku yang lebih rumit dalam program Java.

Training Java Spring Boot Day 4 - 16

Anda mungkin juga menyukai