# önder online
Teknoloji ve siber güvenlik dünyasına hoş geldiniz Güncel siber tehditler ve korunma yöntemleri Yapay zekâ ve otomasyonun güvenliğe etkileri Microsoft 365 ve Active Directory güvenlik rehberleri Yazılım geliştirmede güvenlik odaklı yaklaşımlar Teknoloji ve siber güvenlik dünyasına hoş geldiniz Güncel siber tehditler ve korunma yöntemleri

Menu

Keycloak Nedir

Keycloak Nedir

Keycloak Nedir ve Django ile Nasıl Entegre Edilir? (Örnek Proje Rehberi) Modern web uygulamaları geliştirirken kullanıcı kimlik doğrulama (authentication) ve yetkilendirme (authorization) s&uuml...

Keycloak Nedir ve Django ile Nasıl Entegre Edilir? (Örnek Proje Rehberi)

Modern web uygulamaları geliştirirken kullanıcı kimlik doğrulama (authentication) ve yetkilendirme (authorization) süreçleri projenin en kritik parçalarından biridir. Her proje için ayrı bir kullanıcı veritabanı, şifre sıfırlama akışı veya iki aşamalı doğrulama (2FA) yazmak hem zaman kaybıdır hem de güvenlik riskleri barındırır.

İşte tam bu noktada Keycloak devreye girer. Bu yazıda Keycloak'un ne olduğunu inceleyecek ve popüler Python çatısı Django ile nasıl entegre edileceğini adım adım göreceğiz.

1. Keycloak Nedir?

Keycloak, modern uygulamalar ve servisler için açık kaynaklı, merkezi bir Kimlik Yönetimi ve Erişim Kontrolü (IAM) sistemidir. Red Hat tarafından geliştirilen bu araç; Tek Oturum Açma (SSO - Single Sign-On), kimlik federasyonu (Google, GitHub, LDAP ile giriş vb.) ve kullanıcı yönetimi gibi işlemleri merkezi olarak yönetmenizi sağlar.

Keycloak'un Sağladığı Başlıca Avantajlar:

  • Tek Noktadan Yönetim: Tüm uygulamalarınızın kullanıcıları tek bir havuzda toplanır.
  • Açık Standartlar: OpenID Connect (OIDC) ve OAuth 2.0 gibi endüstri standardı protokolleri destekler.
  • Hazır Arayüzler: Giriş, kayıt, şifre sıfırlama ve profil yönetimi için hazır, özelleştirilebilir ekranlar sunar.
  • Güvenlik: Şifre politikaları, brute-force koruması ve iki aşamalı doğrulama (2FA/OTP) gibi güvenlik katmanlarını kod yazmadan yapılandırmanıza olanak tanır.

2. Django ile Keycloak Entegrasyonu (Örnek Proje Mimarisi)

Django, yerleşik bir kimlik doğrulama sistemine sahip olsa da, kurumsal yapılarda veya mikroservis mimarilerinde dışarıdan bir kimlik sağlayıcıya (Identity Provider - IdP) bağlanmak gerekir. Django'yu Keycloak ile konuşturmak için en yaygın yöntem OpenID Connect (OIDC) protokolünü kullanmaktır.

Bu entegrasyon için mozilla-django-oidc kütüphanesini kullanacağız.

Adım 1: Keycloak Tarafında Hazırlık

  1. Keycloak yönetim panelinde (Admin Console) yeni bir Realm oluşturun (Örn: blog-realm).
  2. Bu realm içinde yeni bir Client oluşturun (Örn: django-app).
  3. Client ayarlarında Access Type değerini confidential yapın ve uygulamanızın yönlendirme (Redirect URI) adresini tanımlayın (Örn: http://localhost:8000/oidc/callback/).
  4. Credentials sekmesinden üretilen Client Secret değerini güvenli bir yere not edin.

Adım 2: Django Projesine Kütüphane Kurulumu

Projenize terminal üzerinden mozilla-django-oidc paketini kurun:

 
pip install mozilla-django-oidc

Adım 3: Django settings.py Ayarları

Keycloak ile haberleşebilmek için settings.py dosyasına OIDC parametrelerini ekleyin:

 
INSTALLED_APPS = [
    # ...
    'mozilla-django-oidc',
]

AUTHENTICATI
    'mozilla-django-oidc.auth.OIDCAuthenticationBackend',
    'django.contrib.auth.backends.ModelBackend',
]

# Keycloak Bilgileri
OIDC_RP_CLIENT_ID = 'django-app'
OIDC_RP_CLIENT_SECRET = 'KEYCLOAK_CLIENT_SECRET_BURaya_YAZILACAK'
OIDC_OP_AUTHORIZATI class="hljs-string">'http://localhost:8080/realms/blog-realm/protocol/openid-connect/auth'
OIDC_OP_TOKEN_ENDPOINT = 'http://localhost:8080/realms/blog-realm/protocol/openid-connect/token'
OIDC_OP_USER_ENDPOINT = 'http://localhost:8080/realms/blog-realm/protocol/openid-connect/userinfo'

# Giriş ve Çıkış Yönlendirmeleri
LOGIN_URL = '/oidc/authenticate/'
LOGIN_REDIRECT_URL = '/'
LOGOUT_REDIRECT_URL = '/'

Adım 4: URL Yönlendirmelerini Ekleme

Ana urls.py dosyanıza OIDC rotalarını dahil edin:
from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('oidc/', include('mozilla_django_oidc.urls')),
]
Bu yapılandırma tamamlandığında, kullanıcılar Django projelerinde korumalı bir sayfaya girmek istediklerinde otomatik olarak Keycloak’un şık giriş ekranına yönlendirilirler. Giriş başarılı olduğunda Keycloak, kullanıcıyı Django'ya geri gönderir ve Django arka planda bu kullanıcıyı veritabanında eşler veya oluşturur.

Keycloak kullanarak Django projelerinizde kimlik doğrulama yükünü sıfıra indirebilir, uygulamanızı kurumsal standartlarda güvenlik özellikleriyle donatabilirsiniz. Birden fazla uygulamanız varsa, kullanıcıların tek bir hesapla hepsine giriş yapabilmesi (SSO) büyük bir kullanıcı deneyimi avantajı sağlar.

Keycloak'u Docker üzerinde ayağa kaldırmayı ve ardından Django projesinde Rol Bazlı Yetkilendirme (RBAC - Role-Based Access Control) senaryolarını nasıl kurgulayacağınızı adım adım inceleyelim.

Bölüm 1: Keycloak'u Docker Üzerinde Ayağa Kaldırma

Keycloak'u yerel ortamınızda test etmek ve hızlıca ayağa kaldırmak için en pratik yol Docker kullanmaktır.

Proje dizininizde bir docker-compose.yml dosyası oluşturun ve aşağıdaki yapılandırmayı ekleyin:

 
version: '3.8'

services:
  postgres:
    image: postgres:15-alpine
    container_name: postgres_keycloak
    environment:
      POSTGRES_DB: keycloak
      POSTGRES_USER: keycloak
      POSTGRES_PASSWORD: password123
    volumes:
      - postgres_data:/var/lib/postgresql/data
    networks:
      - keycloak-net

  keycloak:
    image: quay.io/keycloak/keycloak:24.0.1
    container_name: keycloak_server
    environment:
      KC_DB: postgres
      KC_DB_URL: jdbc:postgresql://postgres:5432/keycloak
      KC_DB_USERNAME: keycloak
      KC_DB_PASSWORD: password123
      KEYCLOAK_ADMIN: admin
      KEYCLOAK_ADMIN_PASSWORD: adminpassword
    command: start-dev
    ports:
      - "8080:8080"
    depends_on:
      - postgres
    networks:
      - keycloak-net

volumes:
  postgres_data:

networks:
  keycloak-net:
    driver: bridge
Terminalde bu dosyanın bulunduğu dizinde şu komutu çalıştırarak servisleri başlatın:

Bash
docker compose up -d
  • Keycloak ayağa kalktıktan sonra tarayıcınızdan http://localhost:8080 adresine gidebilir, admin / adminpassword bilgileriyle yönetim paneline giriş yapabilirsiniz.

Bölüm 2: Keycloak Tarafında Roller ve Client Yapılandırması

Django'da yetkilendirme yapabilmek için Keycloak tarafında roller tanımlamamız ve bunları kullanıcıya atamamız gerekir.

  1. Realm Oluşturma: Keycloak panelinde sol üstten yeni bir Realm oluşturun (Örn: blog-realm).
  2. Client Oluşturma: Clients menüsünden yeni bir client ekleyin:

    • Client ID: django-blog-app
    • Client Authentication: On (Confidential)
    • Valid Redirect URIs: http://localhost:8000/oidc/callback/
  3. Rol Tanımlama (Roles):

    • Oluşturduğunuz client'ın içine girin ve Client Roles sekmesinden şu iki rolü oluşturun:

      • editor
      • admin
  4. Kullanıcıya Rol Atama:

    • Users menüsünden bir kullanıcı oluşturun.
    • Kullanıcının detay sayfasında Role mapping sekmesine gidin ve oluşturduğunuz editor veya admin rolünü kullanıcıya atayın.

Bölüm 3: Django'da Rol Bazlı Yetkilendirme (RBAC) Entegrasyonu

Keycloak, kullanıcı giriş yaptığında JWT (JSON Web Token) veya kullanıcı bilgileriyle birlikte bu rolleri Django'ya iletir. mozilla-django-oidc kullanarak bu rolleri Django'nun kendi grup/yetki sistemine map'leyebilir veya özel bir backend yazabiliriz.

1. Özel OIDC Backend ile Rolleri Django'ya Aktarma

Django'nun kullanıcıyı oluştururken veya güncellerken Keycloak'tan gelen rolleri okumasını sağlamak için mozilla-django-oidc yapılandırmasını özelleştirebiliriz.

Projenizde (örneğin accounts/backends.py içinde) şu sınıfı yazın:

 
from mozilla_django_oidc.auth import OIDCAuthenticationBackend

class KeycloakOIDCAuthenticationBackend(OIDCAuthenticationBackend):
    def create_user(self, claims):
        user = super().create_user(claims)
        self.update_user_roles(user, claims)
        return user

    def update_user(self, user, claims):
        self.update_user_roles(user, claims)
        return user

    def update_user_roles(self, user, claims):
        """
        Keycloak token/claim içerisinden gelen rolleri okur 
        ve Django grup/yetki sistemine işler.
        """
        # Keycloak JWT yapısına göre roller genelde resource_access içinde gelir
        resource_access = claims.get('resource_access', {})
        client_access = resource_access.get('django-blog-app', {})
        roles = client_access.get('roles', [])

        # Örnek: 'admin' rolüne sahipse Django is_staff yapalım
        if 'admin' in roles:
            user.is_staff = True
            user.is_superuser = True
        else:
            user.is_staff = False
            user.is_superuser = False
        
        user.save()

2. settings.py Güncellemesi

Özel Authentication Backend'imizi settings.py dosyasına tanımlayın:

 
AUTHENTICATI
    'accounts.backends.KeycloakOIDCAuthenticationBackend', # Özel backend
    'django.contrib.auth.backends.ModelBackend',
]

# Claims içerisinden rollerin düzgün okunabilmesi için OIDC ayarları (gerekirse ek scopes)
OIDC_RP_SIGNATURE_ALGO = 'RS256'
OIDC_OP_JWKS_ENDPOINT = 'http://localhost:8080/realms/blog-realm/protocol/openid-connect/certs'

3. Django Görünümlerinde (Views) Rol Kontrolü

Artık standart Django decorators veya mixin yapılarını kullanarak roller üzerine kısıtlamalar getirebilirsiniz.

  • Fonksiyon Bazlı Görünümlerde (Function-based views):

     
    from django.contrib.auth.decorators import user_passes_test
    from django.shortcuts import render
    
    def is_editor(user):
        return user.is_authenticated and (user.is_staff or user.groups.filter(name='editor').exists())
    
    @user_passes_test(is_editor)
    def blog_yonetim_paneli(request):
        return render(request, 'blog/admin_panel.html')
    
  • Sınıf Bazlı Görünümlerde (Class-based views):

    from django.contrib.auth.mixins import LoginRequiredMixin, UserPassesTestMixin
    from django.views.generic import TemplateView
    
    class ArticleCreateView(LoginRequiredMixin, UserPassesTestMixin, TemplateView):
        template_name = 'blog/article_create.html'
    
        def test_func(self):
            # Sadece admin veya editor rolündekiler erişebilir
            return self.request.user.is_staff
    

Özet Senaryo Akışı

  1. Kullanıcı Django'da korumalı bir sayfaya gider ve Keycloak'a yönlendirilir.
  2. Keycloak üzerinde editor rolüne sahip kullanıcı başarıyla giriş yapar.
  3. Keycloak, Django'ya kullanıcı bilgilerini ve rollerini iletir.
  4. KeycloakOIDCAuthenticationBackend sınıfımız bu rolleri yakalar ve kullanıcının yetkilerini (örn. is_staff = True) günceller.
  5. Django, @user_passes_test veya UserPassesTestMixin yardımıyla kullanıcının sayfaya erişimine izin verir.