Spring Security

Mert İncesu
Pia-Team Tech
Published in
4 min readApr 25, 2022

Herkese merhaba, ilk yazımda sizlere Spring Security nedir, neden kullanılır, kurulumu ve genel yapısını bildiğim şekilde aktarmaya çalışacağım. Keyifli okumalar dilerim.

•Spring Security nedir ?

Spring Security, Spring uygulamalarında uygulama düzeyinde güvenlik sağlamak için kullanılan özelleştirilebilir, kimlik doğrulama (authentication) ve yetkilendirme (authorization) sağlayan, birçok servlet filtresi içeren bir framework’tür. Spring Security’nin kullanılabilmesi için ise Java 8 veya daha yüksek bir versiyonu gerektirir.

Terimleri biraz daha yakından tanımak istersek; authentication, web uygulamalarında karşımıza çıkan kullanıcı kontrolü olarak tanımlanabilir. Uygulamalara girmek isteyen kişinin, kullanıcı adı veya mail adresinden biri ve şifresinin kontrolü ile yapılmaktadır. Doğrulama işlemlerinde in-Memory ve LDAP yöntemleri kullanılabilir. in-Memory yönteminde, bilgiler bellek üzerinden Spring uygulaması çalıştığı süreç boyunca doğrulama yapılabilir ancak sunucu durdurulursa bellek temizlenir ve doğrulama yapılamaz. LDAP (Lightweight Directory Access Protocol) yöntemi ise TCP/IP üzerinde çalışan, ağ üzerinde bulunan tüm kullanıcıların hızlı, güvenli ve ölçeklenebilir bir şekilde bilgiye ulaşması için kullanılan çok katmanlı bir uygulama katmanı, ağ protokolüdür.

Authentication için benzetme yaparsak işyeri veya üniversite kampüsü gibi gündelik hayatta giriş yaparken karşılaştığımız kimlik doğrulaması buna örnek olabilir.

Authorization, uygulamalara giriş yaptıktan sonra belirli alanlara erişim yetkisi sağlanabilmesi için verilen roller olarak tanımlanabilir. Genellikle büyük ölçekli projelerde kullanıcı erişimi için izinler veya roller olarak karşımıza çıkar.

•Nasıl entegre edilir ?

Spring Security ile alakalı kavramlardan bahsettik, peki Spring Security’i projelerimize nasıl entegre edebiliriz ? Projelere entegre edebilmemiz için yapmamız gereken işlem oldukça kolay, Spring Boot projemizin bağımlılıklarına aşağıdaki şekilde ekleme yapmamız yeterli olacaktır.

Maven için
Gradle için

•Spring Security Web Uygulaması

Öncelikle Intellij üzerinde Spring Initializr servisi ile gerekli bağımlılıkları ekleyerek projeyi oluşturuyoruz.

pom.xml Yapısı

Projeyi ayağa kaldırdığımızda üzerinde örnekleri test edebilmemiz için HomePage isimli bir kaynak dosyası oluşturuyoruz. Bu dosyada HTTP üzerinden gelen GET isteklerini GetMapping anotasyonunu kullanarak yönlendiriyoruz. “/”, “/user “ve “/admin” yönlendirmelerinde ise home, user ve admin fonksiyonlarını tanımlayarak, ilgili adreslere gittiğimizde içerilerinde hangi sayfada olduğumuzu belirten basit bir açıklama döndürürerek testimizi gerçekleştirebileceğiz.

HomePage.java

Spring Security ile ilgili terimleri tanımlarken authentication (kimlik doğrulama) ve authorization (yetkilendirme)’dan bahsetmiştik. Bu işlemleri gerçekleştirebilmek için SecurityConfiguration isimli bir sınıf oluşturuyoruz. SecurityConfiguration sınıfımızı, WebSecurityConfigurerAdapter sınıfından kalıtım yoluyla oluşturarak ihtiyacımız olan bazı metotları kullanacağız.

Güvenlik ile ilgili tanımlamalar yapacağımız için @EnableWebSecurity anotasyonu ile SecurityConfiguration sınıfını işaretliyoruz. Doğrulama ve yetkilendirme işlemlerini yapmamız için, configure metotlarını WebSecurityConfigurerAdapter sınıfından kalıtım yolu ile alınarak, override ederek ilk configure methodunda inMemoryAuthentication kullanarak kimlik doğrulama testi yapacağımız kullanıcıları, şifrelerini ve rollerini oluşturuyoruz.

Kullanıcı tarafından girilen şifreyi üstünde yapılandırdığımız şifreyle karşılaştırmak için NoOpPasswordEncoder kullanacağız. Ancak NoOpPasswordEncoder ’ ı ürün veya bir uygulama ortaya çıkartırken kullanmamalıyız çünkü Spring artık güvenli olmadığını ve kullanımdan kaldırıldığını açıklamıştır.

İkinci configure metotunda ise http.authorizeRequests() fonksiyonu ile, gelen http requestleri, oluşturduğumuz yapıda belirtilmiş adrese yönlendirilerek sahip olunan rol veya rolleri kontrol ederek gösterim izni sağlıyor veya reddediyor. Örnek vermek gerekirse, kullanıcı “/admin” adresine gitmek istediğinde hasRole fonksiyonu içinde bulunan parametreye (“ADMIN”) rol olarak sahip ise erişim sağlayabiliyor. “/user” adresine ise hasAnyRole fonksiyonu içinde bulunan herhangi parametreden birine sahipse erişim sağlayabiliyor.

Projeyi localhost:8080'de ayağa kaldırdığımızda, karşımıza Welcome yani hoşgeldiniz sayfası geliyor.

Anasayfa

Kullanıcı girişi yapmak için http://www.localhost:8080/login adresine gittiğimizde karşımıza kullanıcı adı ve şifre ile giriş yapabileceğimiz login formu çıkıyor. “USER” rolüne sahip testuser kullanıcısı ile form doldurulup butona basıldığında kontrol sağlandıktan sonra giriş yapılıyor ve anasayfaya login olmuş şekilde kullanıcı yönlendiriliyor.

Login sayfası

testuser’ın rolünü test etmek için önce www.localhost:8080/user adresine gittiğimizde başarılı şekilde erişim sağlayabiliyoruz.

Ancak aynı kullanıcı ile www.localhost:8080/admin adresine erişim sağlamak istediğimizde Status:403 yani erişimin yasak olduğu anlamına gelen kodu alıyoruz. testuser isimli kullanıcının sahip olduğu rol “USER” ve “/admin” path’ine tek erişim sağlayabilen rolün “ADMIN” rolüne sahip olan kullanıcıların olması sebebiyle erişim sağlanamıyor.

Aynı adrese ( www.localhost:8080/admin), adminuser isimli ve “ADMIN” rolüne sahip kullanıcı ile ulaşmaya çalıştığımızda başarılı şekilde erişim sağlamakta HomePage isimli sınıfımızda tanımladığımız mesajı görmekteyiz.

Spring Security hakkında daha detaylı için bilgi edinmek için https://spring.io/projects/spring-security adresine bakabilirsiniz.

Spring Security konusunda genel bilgileri ve deneyimlediklerimi basit bir şekilde, siz değerli okuyuculara anlattığım ilk Medium yazım umarım faydalı ve anlaşılır olmuştur. Yorumlarınız ve tavsiyelerinizi bekliyorum. Yeni bir yazıda görüşmek dileğiyle.

--

--