Skip to main content
API iki ayrı Keycloak realm’ından token kabul eder. Her realm kendi kullanıcı havuzu, client’ı, rolleri ve mapper’larıyla tamamen bağımsızdır.

diyanet-vatandas-dev-realm (Vatandaş)

Vatandaş portali (Website SPA) bu realm’a bağlanır.
ÖğeDeğer
Realmdiyanet-vatandas-dev-realm
Clientdiyanet-website (public, PKCE)
Realm/Client rolüCitizen
Identity Providergoogle (Google ile devam et)
Access token ömrü7200 sn (2 saat)
Refresh token rotationaçık, 3600 sn
Login theme / localekeycloak.v2 / tr

diyanet-yonetim-dev-realm (Personel)

Yönetim paneli (Admin SPA) bu realm’a bağlanır.
ÖğeDeğer
Realmdiyanet-yonetim-dev-realm
Clientdiyanet-admin (public, PKCE)
RollerSuperAdmin, Admin, Staff, ReadOnly
Access token ömrü300 sn (5 dakika)
Refresh token rotationaçık, 1800 sn
Login theme / localekeycloak.v2 / tr
Bu dört rol, uygulama tarafındaki Role enumeration’ıyla birebir eşleşir (SuperAdmin=1, Admin=2, Staff=3, ReadOnly=4) ve DB’deki role_permission seed’i bu rollere izin atar. Keycloak rolü token’a realm_access.roles / resource_access.{client}.roles olarak girer; KeycloakRoleClaimsTransformation bunları ClaimTypes.Role ve permissions claim’ine dönüştürür.

Protocol Mapper’lar

Her client’ta iki custom mapper kuruludur (User Attribute → token claim):
NameUser AttributeClaimJSON TypeMultivaluedAccess Token
permissionspermissionspermissionsStringONON
organization_idorganization_idorganization_idStringOFFON
permissions mapper’ı multivalued olmalıdır — bir kullanıcının birden fazla izni token’a ayrı değerler olarak girer. organization_id tek değerlidir ve multi-tenant izolasyonunu besler (tenant_id ile eşdeğer kabul edilir).
{
  "Name": "permissions",
  "UserAttribute": "permissions",
  "ClaimName": "permissions",
  "JsonType": "String",
  "Multivalued": true,
  "AddToAccessToken": true,
  "AddToIdToken": false,
  "AddToUserinfo": true
}

Identity Provider — Google (yalnız vatandaş realm’ı)

Vatandaş realm’ında Google IdP tanımlıdır:
{
  "Alias": "google",
  "DisplayName": "Google ile devam et",
  "ProviderId": "google",
  "Enabled": true,
  "TrustEmail": true,
  "FirstBrokerLoginFlowAlias": "first broker login",
  "DefaultScopes": "openid profile email",
  "SyncMode": "IMPORT",
  "ClientId": "CHANGE_ME",
  "ClientSecret": "CHANGE_ME"
}
ClientId/ClientSecret Google Cloud Console’dan alınıp .env / provisioning config’ine girilir.

Token içeriği örneği

Personel realm’ından Admin rollü bir kullanıcının access token’ının ilgili kesiti (MapInboundClaims=false ile claim isimleri korunur):
{
  "iss": "http://localhost:8080/realms/diyanet-yonetim-dev-realm",
  "aud": ["diyanet-admin", "account"],
  "sub": "a0000002-0000-0000-0000-000000000002",
  "preferred_username": "murat.unluoney",
  "realm_access": { "roles": ["Admin", "offline_access", "default-roles-..."] },
  "resource_access": {
    "diyanet-admin": { "roles": ["Admin"] }
  },
  "permissions": ["users:read", "users:write", "faqs:write"],
  "organization_id": "00000000-0000-0000-0000-000000000001"
}
API tarafında KeycloakRoleClaimsTransformation bu yapıyı normalize eder; ardından UserContextClaimsTransformation DB’den user_id, eksik permissions ve account_status claim’lerini ekler (bkz. Authentication).

İlgili

Client Yapılandırması

Client ayarları ve manuel kurulum.

Provisioning

Bu yapının otomatik kurulumu.

Authorization

Rollerin izinlere haritalanması.

Multi-Tenancy

organization_id ile tenant izolasyonu.