Spring Boot Uygulamasında Üye Kaydı ve Girişi

Kamer Elciyar
3 min readSep 27, 2019

Güncelleme 02.05.2020: `csrf().disabled()` konfigürasyonu ve CustomAuthenticationProvider sınıfı kaldırıldı. Ayrıca Optional kullanımını değiştirdim ve `orElseThrow()` metodunu kullandım. Değerli yorumları için @gokcendedat ve @utkuozdemir’e teşekkür ederim.

Merhaba, bu yazımda Spring Boot uygulamasında kullanıcı kaydı, onay maili gönderme ve kullanıcı girişi işlemlerinin nasıl yapılacağını anlatacağım. Ana konudan sapmamak için exception handling kısımlarından bahsetmeyeceğim. Spring Boot hakkında bilgi sahibi olmanız, tercihen bir IDE kullanmanız gerekmektedir. Doğrudan kaynak kodları incelemek için https://github.com/kamer/spring-boot-user-registration

Spring Initialzr ile Projenin Oluşturulması

https://start.spring.io/ adresine giderek veya kullandığınız IDE’nin ilgili plugin’lerini kullanarak bir proje oluşturun. Projede Spring Web, Lombok, Thymeleaf, Spring Security, Java Mail Sender, H2 ve Spring Data JPA dependency’lerini seçin. Tercihen farklı bir veritabanı da kullanabilirsiniz.

User Entity’sinin Oluşturulması

entity adında bir package oluşturun ve içinde UserRole adında bir enum yaratın. Kullanıcı rollerini tutacağımız bu enumda ADMIN ve USER adında iki değer olacak.

Sonra User adında bir class yaratın. Bu class UserDetails interface’ini implement etmeli. UserDetails interface’i temel kullanıcı bilgilerinin metotlarını barındıran bir interface. Örnek bir kullanımını görmek için org.springframework.security.core.userdetails.User sınıfına bakabilirsiniz. Hatta doğrudan bu sınıfı extend edip eklemek istediğiniz değişkenleri ekleyebilirsiniz. Ben extend etmeden sıfırdan bir class oluşturacağım. Birkaç değişken oluşturup UserDetails’dan gelen metotların bodylerini dolduracağız.

expired değişkenini kullanmayacağım için isAccountNonExpired ve isCredentialsNonExpired metotlarından true döndürdüm. Username yerine email kullanacağım için de getUsername metodundan email döndürdüm. Diğerlerini metot isimlerinden çıkarabilirsiniz.

UserService’in Oluşturulması

Kullanıcı kaydı işlemlerini yapacağımız UserService classı için user adında bir package oluşturacağız. Bu class da UserDetailsService interfaceini implement edecek. Bu interfaceten loadByUsername adında bir metot alacağız. email kullanacağımız için bu sınıf da adı loadByUsername olsa da mail parametresi alıp ona göre kullanıcı döndürecek.

Tabii veritabanından kullanıcı çekmek için önce repository’e ihtiyacımız var. Hemen aynı sınıf içinde UserRepository interface’i oluşturuyoruz ve içinde findByEmail metot imzasını oluşturuyoruz.

Şimdi UserService’e geri dönüp loadByUsername metodunun içini doldurabiliriz.

ConfirmationToken Classının Oluşturulması

Her kullanıcı kaydolduğunda bir token oluşturacağız ve göndereceğimiz mailde bu token ile eşsiz bir link oluşturacağız. user package’ı içinde ConfirmationToken adında bir class yaratıyoruz ve aşağıdaki şekilde dolduruyoruz.

Her kullanıcıya bir token vereceğimiz için OneToOne ilişki kuruyoruz ve token’ların bir geçerlilik süresi olacağı için createdDate değişkeni tutuyoruz.

Örnek Kullanıcı Kaydı Senaryosuna Göre Metotların Yazılması

Servisleri ve tüm metotları en baştan yazmak yerine aşama aşama gitmeyi daha doğru buluyorum. Böylece gerçek bir geliştirme akışına daha yakın bir yazı olacak.

Kullanıcı kaydında önce kullanıcı bilgilerini alacağız. Sonra BCryptPasswordEncoder ile parolayı encode edeceğiz ve kullanıcıyı enabled=false(default) olacak şekilde kaydedeceğiz. Sonra bir ConfirmationToken oluşuturup bu token’ı kullanıcı ile ilişkilendireceğiz. Token ile eşsiz bir link oluşturup kullanıcıya mail yoluyla göndereceğiz. Kullanıcı bu linke tıkladığında ise ilgili kullanıcının enabled alanı true olacak ve token silinecek.

signUpUser metodunu oluşturmadan önce ConfirmationTokenRepository ve ConfirmationTokenService oluşturup yeni token kaydetmek için bir metot oluşturacağız.

Şimdi UserService’e gidip signUpUser metodunu yazalım.

Mail Confirmation Metotlarının Yazılması

Senayoda kullanıcı, kendisine gelen maile tıkladığında çalışacak olan metodu yazalım. Önce link ile maili onayladıktan sonra token’ı silecek olan metodu yazalım.

Şimdi de maili confirm edecek olan metodu yazalım.

Spring Mail Ayarları

Ben Gmail için örnek bir yml dosyasını aşağıda paylaşıyorum. Eğer 2-factor kullanıyorsanız uygulama için özel bir parola oluşturmanız gerekiyor. (https://support.google.com/mail/answer/185833?hl=en) yml yerine application.properties de kullanabilirsiniz.

EmailService’in ve Mail Gönderen Metodun Yazılması

user package’ı içinde EmailSenderService adında bir class oluşturun ve aşağıdaki şekilde doldurun.

Şimdi de UserService içinde mail gönderen metodu yazalım.

işlemler olduğu için yalnızca üye kaydı ve girişi yapacağınız

WebSecurityConfig ve WebConfig class’ı ile Security Konfigürasyonunun Yapılması

Burada hangi sayfaların authetication olmadan kullanılabileceğini, giriş işlemini hangi path’in handle edeceğini seçiyoruz.

Controller’ların Yazılması ve Sayfaların Oluşturulması

Şimdi de controller’da yönlendirdiğimiz sayfaları hazırlayalım.

Thymeleaf ile Sayfaların Oluşturulması

Buraya kadar eksiksiz takip ettiyseniz http://localhost:8080/sign-up adresinden kullanıcı kaydı yapabilirsiniz. Tabii ki bu haliyle yetersiz bir proje. Çünkü exception handling kısımlarını eklemedim. Aynı zamanda token’ların geçerliliğini kontrol etme gibi şeyleri de kontrol etmedim. Bunlar basit işlemler olduğu için yalnızca üye kaydı ve girişi yapacağınız kısımdan bahsettim.

Sorularınız, önerileriniz ve düzeltmeleriniz için:

Twitter: https://twitter.com/kamer_ee
Mail: kamer@kamer.dev

--

--