Spring Boot ve Spring Security İle Rest Servisi Koruma 1 - InMemory
Dec 23, 2017
Merhabalar arkadaşlar.
Bu yazıda Spring Rest ile oluşturulmuş basit bir web servisin Spring Boot tabanlı bir maven projesinde Spring Security ile koruma altına alınmasını temel olarak anlatacağım. Bu yazıda başlıkta da belirttiğim üzere inmemory user kullanarak doğrulama ve yetkilendirme işine bakacağız. Bir sonraki yazıda
ise veritabanında tanımlı user ile bu işlemi örnekleyeceğiz.
pom.xml dosyamız içerisinde parent tag’inin altında Spring Boot kütüphanelerinin yer aldığı projeyi tanıtmış olduk. Projemize bağımlılık olarak Spring’in web ve security kütüphanelerini ekledik.
application.properties
application.properties dosyamız içinde projenin deploy edileceği context path ayarını ve çalışacağı portu belirliyoruz.
Address.java
Address sınıfımız içerisinde bir üyenin adresine ait bazı bilgileri tutacak alanlar ve onların get-set metotları yer alıyor. Sınıf içerisinde hiç parametre almayan ve tüm değerleri parametre alan iki constructor bulunuyor.
Member.java
Member sınıfı içerisinde üyeye ait bilgileri tutan name, surname, city, company ve address alanları ve onların get-set metotları yer alıyor. Address sınıfı ile aynı şekilde burada da iki yapılandırıcı mevcut.
MemberListWebService.java
MemberListWebService sınıfı bizim get isteklerimize yanıt verecek olan ve bize üye listesini JSON formatında sunacak bir web servis sınıfıdır. Sınıf içerisinde 3 adet member nesnesi oluşturuyoruz ve ve bunları memberList listesine koyuyoruz. Akabinde eğer gelen istek içerisinde id bilgisi yok ise ya da
0 gelmiş ise tüm listeyi aksi takdirde gelen id bilgisindeki user’ı döndürüyoruz.
Daha önce Spring Rest GET Örneği yazımda Spring ile GET hizmeti sunan bir Testful web servis yazmayı anlatmıştım. İlgilenen arkadaşlar oraya da göz atabilirler.
15.11.2018 Güncelleme
Linkedin'den yaşadığı sorun ile ilgili mesaj atan bir hanım arkadaş vesilesi ile öğrendiğim kadarı ile Spring Boot 2.0 ile beraber InMemoryUser tanımı ve kullanımında değişikliğe gidilmiş. InMemoryUser'ların tanımı ve kullanımı için bir InMemoryUserDetailsManager instance'ı oluşturmalı ve ilgili user'larımızı aşağıdaki gibi
kayda geçirmeliyiz. Spring Boot 2.0 öncesi için ***auth.inMemoryAuthentication().withUser("adminUser").password("adminUserPassword").roles("ADMIN");*** şeklinde kullanmaya devam edebiliriz.
WebSecurityConfig.java
Yazımızın ana noktasını oluşturan olayı konuştuğumuz WebSecurityConfig sınıfına geldi sıra. WebSecurityConfig sınıfını @Configuration ve @EnableWebSecurity notasyonları ile işaretliyoruz. @Configuration notasyonu XML ile de yapılabilen konfigürasyon ayarlarının Java kodunda yapılabilmesini sağlayan notasyondur.
@EnableWebSecurity notasyonu da web projemiz üzerinde güvenlik katmanını aktif hale getiren notasyondur.
WebSecurityConfig sınıfımızı WebSecurityConfigurerAdapter sınıfımızdan kalıtıyoruz ve içerisinde configure(HttpSecurity http) ve configure(AuthenticationManagerBuilder auth) metotlarını Override ediyoruz. configure(HttpSecurity http) metodu ile hangi URL path’inin herkese açık olacağını
hangisinin hangi yetki sahibi kişilerin erişimine açık olacağını kararlaştırıyoruz. Biz burada / path’i yani kök path için herkesin erişimine açık olsun, memberList path’ine sadece ADMIN yetkisi olan kişiler erişebilsin ve httpBasic ile Basic Authentication kullanılsın dedik.
configure(AuthenticationManagerBuilder auth) metodu ile de user tanımlarımızı yapıyoruz. inMemoryAuthentication() ifadesi user’ların runtime’da tutulduğu ve bir yerlerden çekilip alınmadığı manasına gelir. withUser() metodu ile userName’i, password() metodu ile user’ın parolasını, roles() metodu ile
de user’ın rolünü tanımlıyoruz. Biz biri ADMIN biri de USER olacak şekilde iki user tanımladık.
Application.java
Application sınıfımız Spring Boot projemizi çok kolay bir şekilde ayağa kaldırmamızı sağlayan sınıfımızıdır. Application sınıfına sağ tıklayıp Run As -> Java Application dediğimiz zaman projemiz ayağa kalkacaktır.
No Auth bir şekilde yollamış olduğum bu GET isteği ekran görüntüsünde de göreceğiniz gibi Unauthorized ve Full authentication is required to access this resource mesajları ile reddedildi. Şimdi USER rolüne sahip standartUser ve onun standartUserPassowrd parolası ile bir istek gönderiyorum.
Bu kez de Access Denied mesajı ile gönderdiğim istek reddedildi çünkü memberList path’ine sadece ADMIN yetkisi olan user ulaşabilir. Şimdi ADMIN yetkisi olan user’ın bilgileri ile GET isteğini gönderiyorum.
Gördüğünüz gibi web servis ilgili yetkiye sakip kişi bilgisi ile istek gelince bana data dönüşünü yaptı.
Bu yazıda anlatacaklarım bu kadar arkadaşlar. Bir sonraki yazıda yetkilendirme işlemi için database kullanımını anlatacağım.