My Profile Photo

Mehmet Cem Yücel


Technical Writings.
Architecture, Security, Java, Golang, Devops, Microservices, Spring Boot, Kafka, Distributed Systems and Blockchain


Access Management 5-Spring RestTemplate Feign Keycloak

Önceki yazımızda Keycloak‘tan bahsettiğimiz Access Management serimizin son yazısında Spring Boot RestTemplate ve OpenFeign Client kullanarak Keycloak üzerinde kolaylıkla OpenIdConnect ve OAuth2 ile nasıl kimlik doğrulama yapılır bunu inceleyeceğiz.


–SERİNİN DİĞER YAZILARI–


1. Senaryo

Uygulamamız ve test senaryomuz şu şekilde olacak. İki rest servis ayağa kaldıracağız. İki servisi de ayrı roller çağırabilir durumda olacak. Uygulamamızın client’ına sadece 1 role yetki vereceğiz. Bu yetkiyle 1. servisi çağırabildiğini, 2. servise ise unauthorized aldığını gözlemleyeceğiz. Bu çağırımları hem restTemplate ile hem de feign client ile yapacağız. Bütün bu süreci kolaylaştırmak için bir tane de bu servislerin çağırımının yapıldığı bir ayrı bir servis ayağa kaldıracağız.

2. Ortam Kurulumu

2.1. Keycloak on Docker

Ben pratik olması açısından Keycloak’u Docker üzerinde ayağa kaldıracağım. Dilerseniz sitesindeki diğer yöntemlerle de ayağa kaldırabilirsiniz. Komut satırından çalıştıracağımız script;

docker run -p 8080:8080 -e KEYCLOAK_USER=admin -e KEYCLOAK_PASSWORD=admin jboss/keycloak

Bu scriptte iki environment parametresi geçiyoruz. Bunlar admin arayüzüne giriş yapabilmemiz için gereken kullanıcı adı ve şifre parametreleri. Son olarak admin konsoluna erişebilmek için da 8080 portunu expose ettik. Kısa bir süre sonra Keycloak aşağıdakine benzer bir satır ile ayağa kalktı.

[org.jboss.as] (Controller Boot Thread) WFLYSRV0025: Keycloak 9.0.3 (WildFly Core 10.0.3.Final) **started in 19710ms** — Started 683 of 988 services (701 services are lazy, passive or on-demand)

Bu noktadan sonra http://localhost:8080 ‘e gittiğimizde aşağıdaki gibi bir görüntü ile karşılaşıyoruz.

“Administration Console” yazısını tıklayarak login ekranına gidiyoruz.

Docker komutuna verdiğimiz kullanıcı adı ve şifre ile giriş yapıyoruz.

2.2. Realm

Realm’imizi yaratıyoruz. Kabaca birbirleriyle etkileşim içerisinde olacak uygulamaların bir arada olacağı bir environment gibi düşünülebilir. Add realm butonuna tıklayıp isim veriyoruz ve bu aşamayı sonlandırıyoruz.

2.3. Roles

Sırada rollerimizi yaratma adımımız var. İki role, user-role ve user2-role yaratacağız. Bunun için menüden Roles başlığına gidiyoruz.

Add Role butonuna basarak rolü yaratıyoruz.

İki rolü de aynı şekilde yarattıktan sonra son görüntümüz aşağıdaki gibi olmalı.

2.4. Client

Artık uygulamamızın bağlanacağı bilgileri vereceğimiz Client’ımızı yaratmaya geçebiliriz. Client başlığını tıkladığımızda aşağıdaki gibi bir ekran geliyor.

Burada Create butonunu tıklayarak uygulamamıza client yaratacağız. Spring Boot uygulamaları default olarak 8080 portu ile ayağa kalkar. Keycloak da aynı portta ayağa kalktığı için bir çakışma olmaması için ilerleyen adımlarda uygulamamızın portunu 8088 olarak değiştireceğiz. Aşağıdaki bilgilerle uygulamamız için client’ımızı yaratıyoruz.

Sonraki adımımızda clientımızı yapılandırmamız gerekli. Bizim senaryomuz bir frontend uygulaması tarafından Users login edip onların ekran üzerindeki credentiallarıyla ilgili bir deneme yapmak değil. Servislerimizin sadece uygulamamıza verilen yetkiler kapsamında çağırılabildiğini test etmek istiyoruz. Bu sebeple Access Type alanımızı confidential, Service Accounts Enabled ve Authorization Enabled alanlarını On yapıyoruz. Aşağıya kaydırıp Save butonuna tıkladıktan sonra ekranda yeni tablarımız belirecek.

Kaydettikten sonra çıkan Service Account Roles tabına geçerek uygulamamıza yarattığımız rollerden sadece user-role rolünü veriyoruz.

Son olarak Credentials tabına giderek uygulamamız için yaratılan Secret’ı kopyalıyoruz. Bu secret’ı uygulamamıza vermemiz gerekecek.

3. Spring Boot Uygulaması

Şimdi geçelim Spring Boot uygulamamıza. Spring Initializr’dan yeni bir uygulama alıyoruz. Pom.xml’imizin son durumu aşağıdaki gibi olmalı.

3.1. Consumable Rest Services

Sonrasında bir Controller yaratalım. İki farklı rol tarafından tüketilebilen iki servisimiz olsun.

userRoleService metodu Keycloak’ta yarattığımız rollerden user-role’e sahip olan client’lar tarafından çağırabilir. userRole2Service metodu ise sadece user2-role’e sahip clientlar tarafından çağırılabilir. Hatırlarsanız uygulamamız için yarattığımız client’a sadece ilk rolü tanımlamıştık. Madem öyle artık uygulamamızın application.properties dosyasının içerisinde Keycloak’u yapılandırmaya geçebiliriz.

3.2. Application.properties

Hatırlarsanız Keycloak ile uygulamamızın portlarını değiştireceğimizden bahsetmiştik. Bunun yanısıra Keycloak tarafından ihtiyaç duyulacak özellikler keycloak ile başlıyor. Uygulamamıza yaratılan client’ın adı, realmi gibi bilgiler burada bulunuyor. auth-config ile başlayan yapılandırmaları ise biz birazdan hem restTemplate’ımızı hem de FeignClient’ımızı konfigüre ederken kullanacağız.

3.3. Keycloak Configuration

Uygulamamızın Keycloak’u ve uygulamamıza erişim yöntemlerini yapılandırmak için aşağıdaki sınıfa ihtiyacımız var.

Burada PreAuthorize annotation’ı kullanılan servislerin haricinde tüm servislere erişim hakkı vermemizin sebebi birazdan controller’ımıza ekleyeceğimiz yeni metodların direk erişilebilir olmasını istememizden kaynaklanıyor.

3.4. Test Rest Services

Controller’ımıza birkaç yapılandırma ekleyerek ilk eklediğimiz servisleri hızlıca deneyebileceğimiz servisler yaratıyoruz.

test-rest-template servisine geçeceğimiz servis ismiyle ilk iki servisi direk çağırabiliriz. FeignServiceClient interface’inde de yine ilk yarattığımız servislerin imzaları bulunuyor. Bunları çağırabilmek için de test-feign-1 ve test-feign-2 servislerini yarattık. Ancak bunları çağırmadan önce restTemplate’ımızı ve FeignClient’ımızı OAuth2 kullanmak üzere yapılandırmamız gerekiyor.

3.5. RestTemplate Configuration

Application.yml’dan okuduğumuz değerlerle yapılandırmamızı yapıyoruz.

3.6. Feign Client Configuration

Application.yml’dan okuduğumuz değerlerle yapılandırmamızı yapıyoruz.

4. Testler

Sonuçları gözlemlemek için bu yazımda bahsettiğim rest servis entegrasyon testi yöntemlerini de kullanabilirsiniz. Farkettiğiniz üzere ben bu yazımda doğrudan browserdan deneyerek gözlemlemeyi tercih ettim. Sonuç olarak 2si restTemplate, 2si feingClient olmak üzere deneyeceğimiz 4 farklı servis çağırımımız var. Aşağıya sonuçlarını ekliyorum.

4.1. RestTemplate Authorized

4.2. RestTemplate Unauthorized

4.3. Feign Client Authorized

4.4. Feign Client Unauthorized

5. Sonuç

Yukarıdaki gibi bir entegrasyon ile Keycloak olsun olmasın tüm OAuth2 entegrasyonlarınızı kolay bir şekilde halledebilirsiniz. Refresh token, access token, veya expire konularını düşünmenize gerek kalmadan size hızlı entegrasyon sağlayacaktır. Keycloak ile bunun authorization kısmını da hazır ekranları aracılığıyla zahmetsizce yönetme imkanınız olacaktır. Uygulamanın kodlarına buradan erişebilirsiniz.




May interest this topics

If you interested in Blockchain Technologies,


comments powered by Disqus