{"id":31881,"date":"2025-10-15T05:31:37","date_gmt":"2025-10-15T02:31:37","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/openfga-ve-go-sunucularinda-rbac-erisim-kontrolunu-yeniden-tanimlamak\/"},"modified":"2025-10-15T05:31:37","modified_gmt":"2025-10-15T02:31:37","slug":"openfga-ve-go-sunucularinda-rbac-erisim-kontrolunu-yeniden-tanimlamak","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/openfga-ve-go-sunucularinda-rbac-erisim-kontrolunu-yeniden-tanimlamak\/","title":{"rendered":"openFGA ve Go Sunucular\u0131nda RBAC: Eri\u015fim Kontrol\u00fcn\u00fc Yeniden Tan\u0131mlamak"},"content":{"rendered":"<p><body><\/p>\n<p>Modern uygulama geli\u015ftirme d\u00fcnyas\u0131nda, kullan\u0131c\u0131lar\u0131n sistem \u00fczerindeki yetkilerini y\u00f6netmek giderek daha karma\u015f\u0131k bir hal al\u0131yor. \u00d6zellikle mikroservis mimarileri ve da\u011f\u0131t\u0131k sistemlerin yayg\u0131nla\u015fmas\u0131yla birlikte, eri\u015fim kontrol\u00fc art\u0131k basit <code>if-else<\/code> bloklar\u0131yla halledilebilecek bir konu olmaktan \u00e7\u0131kt\u0131. Peki, bu karma\u015f\u0131kl\u0131\u011f\u0131n \u00fcstesinden nas\u0131l gelebiliriz? openFGA ve Go dilinin g\u00fcc\u00fcn\u00fc birle\u015ftirerek, dinamik ve \u00f6l\u00e7eklenebilir bir Role-Based Access Control (RBAC) sistemi kurman\u0131n yollar\u0131n\u0131 ke\u015ffedece\u011fiz. Bu makale, yetkilendirme konusundaki temel kavramlardan ba\u015flayarak, ger\u00e7ek d\u00fcnya senaryolar\u0131yla ad\u0131m ad\u0131m openFGA entegrasyonunu Go sunucular\u0131nda nas\u0131l ger\u00e7ekle\u015ftirece\u011finizi a\u00e7\u0131klayacak.<\/p>\n<p>Bir web uygulamas\u0131 geli\u015ftirdi\u011finizde veya mevcut bir sistemi y\u00f6netti\u011finizde, kullan\u0131c\u0131lar\u0131n\u0131z\u0131n neye eri\u015febilece\u011fini, hangi eylemleri ger\u00e7ekle\u015ftirebilece\u011fini belirlemek kritik \u00f6nem ta\u015f\u0131r. Bu s\u00fcre\u00e7, yetkilendirme (authorization) olarak adland\u0131r\u0131l\u0131r. Geleneksel olarak, bir\u00e7ok uygulama Rol Tabanl\u0131 Eri\u015fim Kontrol\u00fc (RBAC) modelini benimsemi\u015ftir. RBAC, kullan\u0131c\u0131lar\u0131 belirli rollere (\u00f6rne\u011fin, &#8216;Y\u00f6netici&#8217;, &#8216;Edit\u00f6r&#8217;, &#8216;G\u00f6r\u00fcnt\u00fcleyici&#8217;) atar ve bu rollere belirli izinler tan\u0131mlar. \u0130lk bak\u0131\u015fta olduk\u00e7a mant\u0131kl\u0131 ve sade g\u00f6r\u00fcnen bu yakla\u015f\u0131m, uygulaman\u0131z\u0131n b\u00fcy\u00fcd\u00fck\u00e7e ve gereksinimleri karma\u015f\u0131kla\u015ft\u0131k\u00e7a ciddi sorunlar yaratmaya ba\u015flayabilir.<\/p>\n<p>Bir d\u00fc\u015f\u00fcn\u00fcn: Bir dok\u00fcman y\u00f6netim sisteminiz var. Ba\u015flang\u0131\u00e7ta yaln\u0131zca y\u00f6neticiler, edit\u00f6rler ve okuyucular yeterliydi. Ancak zamanla &#8220;proje liderleri&#8221;, &#8220;taslak onaylay\u0131c\u0131lar&#8221; veya &#8220;harici i\u015f ortaklar\u0131&#8221; gibi yeni roller ortaya \u00e7\u0131kt\u0131. Dahas\u0131, her dok\u00fcman\u0131n kendi \u00f6zel izinleri olabilir; bir dok\u00fcman &#8220;herkese a\u00e7\u0131k&#8221; olabilirken, di\u011feri sadece belirli bir &#8220;tak\u0131m&#8221; \u00fcyeleri taraf\u0131ndan g\u00f6r\u00fcnt\u00fclenebilir. Geleneksel RBAC modelleri, bu t\u00fcr ince taneli (fine-grained) yetkilendirme ihtiya\u00e7lar\u0131n\u0131 kar\u015f\u0131lamakta zorlan\u0131r. Rol say\u0131s\u0131 katlanarak artar (role explosion), her bir yeni durum i\u00e7in yeni bir rol tan\u0131mlamak bir y\u00f6netim kabusuna d\u00f6n\u00fc\u015f\u00fcr. Bu durum, sadece y\u00f6netim y\u00fck\u00fcn\u00fc art\u0131rmakla kalmaz, ayn\u0131 zamanda sistemin g\u00fcvenlik a\u00e7\u0131klar\u0131na kar\u015f\u0131 daha savunmas\u0131z hale gelmesine de neden olabilir, \u00e7\u00fcnk\u00fc yetki tan\u0131mlar\u0131 i\u00e7 i\u00e7e ge\u00e7erek anla\u015f\u0131lmas\u0131 ve denetlenmesi g\u00fc\u00e7 bir hal al\u0131r.<\/p>\n<p>Mikroservis mimarileri, bu sorunu daha da derinle\u015ftirir. Her servis kendi i\u00e7inde yetkilendirme mant\u0131\u011f\u0131n\u0131 bar\u0131nd\u0131rd\u0131\u011f\u0131nda, tutars\u0131zl\u0131klar ve g\u00fcvenlik a\u00e7\u0131klar\u0131 ka\u00e7\u0131n\u0131lmaz hale gelir. Kullan\u0131c\u0131 deneyimi a\u00e7\u0131s\u0131ndan da bu durum s\u0131k\u0131nt\u0131l\u0131d\u0131r; bir kullan\u0131c\u0131n\u0131n farkl\u0131 servislerdeki yetkileri aras\u0131nda tutarl\u0131l\u0131k sa\u011flamak, geli\u015ftiriciler i\u00e7in s\u00fcrekli bir ba\u015f a\u011fr\u0131s\u0131d\u0131r. \u0130\u015fte tam da bu noktada, yetkilendirme mant\u0131\u011f\u0131n\u0131 uygulaman\u0131n ana kod taban\u0131ndan ay\u0131rarak merkezi bir \u015fekilde y\u00f6netme ihtiyac\u0131 do\u011far. Bu merkeziyet\u00e7i yakla\u015f\u0131m, yetkilendirme kararlar\u0131n\u0131 h\u0131zl\u0131, tutarl\u0131 ve \u00f6l\u00e7eklenebilir bir \u015fekilde almay\u0131 m\u00fcmk\u00fcn k\u0131lar. openFGA gibi ara\u00e7lar, bu zorluklar\u0131n \u00fcstesinden gelmek i\u00e7in geli\u015ftirilmi\u015f g\u00fc\u00e7l\u00fc \u00e7\u00f6z\u00fcmler sunar. Geleneksel RBAC&#8217;\u0131n \u00f6tesine ge\u00e7erek, nesneler ve aralar\u0131ndaki ili\u015fkiler \u00fczerinden yetkilendirme yapabilen ReBAC (Relationship-Based Access Control) modelini benimseyen openFGA, modern uygulamalar\u0131n dinamik ve karma\u015f\u0131k eri\u015fim kontrol\u00fc gereksinimlerine cevap verir. Bu sayede, &#8220;kim, ne \u00fczerinde, ne yapabilir?&#8221; sorusunun cevab\u0131, uygulaman\u0131z\u0131n i\u015f mant\u0131\u011f\u0131ndan ba\u011f\u0131ms\u0131z olarak, esnek bir \u015fekilde tan\u0131mlanabilir ve y\u00f6netilebilir.<\/p>\n<h2>RBAC Nedir ve Neden Art\u0131k Yeterli De\u011fil?<\/h2>\n<p>Rol Tabanl\u0131 Eri\u015fim Kontrol\u00fc (RBAC), uzun y\u0131llard\u0131r yaz\u0131l\u0131m sistemlerinde yetkilendirme i\u00e7in standart bir model olmu\u015ftur. Temelinde \u00fc\u00e7 ana kavram yatar:<\/p>\n<ul>\n<li><strong>Kullan\u0131c\u0131lar (Users):<\/strong> Sisteme eri\u015fen bireyler veya varl\u0131klar.<\/li>\n<li><strong>Roller (Roles):<\/strong> Bir dizi izin k\u00fcmesini temsil eden ve kullan\u0131c\u0131lara atanan soyut etiketler (\u00f6rne\u011fin, &#8216;Admin&#8217;, &#8216;Muhasebeci&#8217;, &#8216;M\u00fc\u015fteri Temsilcisi&#8217;).<\/li>\n<li><strong>\u0130zinler (Permissions):<\/strong> Kullan\u0131c\u0131n\u0131n belirli bir kaynak \u00fczerinde ger\u00e7ekle\u015ftirebilece\u011fi eylemler (\u00f6rne\u011fin, &#8216;belgeyi d\u00fczenle&#8217;, &#8216;raporu g\u00f6r\u00fcnt\u00fcle&#8217;, &#8216;kullan\u0131c\u0131 olu\u015ftur&#8217;).<\/li>\n<\/ul>\n<p>RBAC&#8217;\u0131n i\u015fleyi\u015fi olduk\u00e7a basittir: Bir kullan\u0131c\u0131ya bir veya birden fazla rol atan\u0131r. Her rol, belirli izin setlerini i\u00e7erir. Kullan\u0131c\u0131 bir eylem ger\u00e7ekle\u015ftirmeye \u00e7al\u0131\u015ft\u0131\u011f\u0131nda, sistem kullan\u0131c\u0131n\u0131n sahip oldu\u011fu rollerin ilgili izne sahip olup olmad\u0131\u011f\u0131n\u0131 kontrol eder. \u00d6rne\u011fin, &#8216;Edit\u00f6r&#8217; rol\u00fcne sahip bir kullan\u0131c\u0131 &#8216;yaz\u0131 d\u00fczenleme&#8217; iznine sahipse, bu eylemi ger\u00e7ekle\u015ftirebilir.<\/p>\n<div class=\"expert-tip\">\n        <strong>Uzman \u0130pucu:<\/strong> RBAC, k\u00fc\u00e7\u00fck ve orta \u00f6l\u00e7ekli uygulamalar i\u00e7in h\u0131zl\u0131 ve etkili bir ba\u015flang\u0131\u00e7 noktas\u0131 sunar. Ancak uzun vadeli planlamada, uygulaman\u0131z\u0131n karma\u015f\u0131kl\u0131\u011f\u0131n\u0131 ve b\u00fcy\u00fcme potansiyelini g\u00f6z \u00f6n\u00fcnde bulundurmak \u00f6nemlidir.\n    <\/div>\n<h3>RBAC&#8217;\u0131n S\u0131n\u0131rl\u0131l\u0131klar\u0131: Neden Yetmez?<\/h3>\n<p>RBAC&#8217;\u0131n sadeli\u011fi, ayn\u0131 zamanda onun en b\u00fcy\u00fck k\u0131s\u0131tlamas\u0131d\u0131r. Uygulaman\u0131z b\u00fcy\u00fcd\u00fck\u00e7e ve daha dinamik hale geldik\u00e7e, RBAC&#8217;\u0131n yetersizlikleri ortaya \u00e7\u0131kmaya ba\u015flar:<\/p>\n<ol>\n<li><strong>Rol Patlamas\u0131 (Role Explosion):<\/strong> Uygulama, farkl\u0131 nesneler (belgeler, projeler, tak\u0131mlar vb.) \u00fczerinde farkl\u0131 d\u00fczeylerde yetkilendirme gerektirdi\u011finde, yeni roller yaratma ihtiyac\u0131 do\u011far. \u00d6rne\u011fin, &#8220;Proje A Y\u00f6neticisi&#8221;, &#8220;Proje B Y\u00f6neticisi&#8221;, &#8220;Proje A Edit\u00f6r\u00fc&#8221; gibi roller tan\u0131mlamak zorunda kal\u0131rs\u0131n\u0131z. Bu, y\u00fczlerce, hatta binlerce role yol a\u00e7arak y\u00f6netimi i\u00e7inden \u00e7\u0131k\u0131lmaz bir hale getirir.<\/li>\n<li><strong>\u0130nce Taneli Yetkilendirme Eksikli\u011fi (Lack of Fine-Grained Authorization):<\/strong> RBAC, genellikle sistem genelinde veya belirli mod\u00fcller \u00fczerinde yetkilendirme yapar. Ancak &#8220;Bu belirli belgeyi yaln\u0131zca \u015fu ki\u015fi d\u00fczenleyebilir&#8221; veya &#8220;Bu dosyay\u0131 sadece bu departmandaki \u00e7al\u0131\u015fanlar g\u00f6rebilir&#8221; gibi nesne d\u00fczeyinde, ko\u015fullu veya ba\u011flama dayal\u0131 (context-aware) yetkilendirme yapmak zordur.<\/li>\n<li><strong>Dinamik \u0130li\u015fkiler:<\/strong> Ger\u00e7ek d\u00fcnyadaki yetkilendirme modelleri genellikle kullan\u0131c\u0131lar, gruplar ve nesneler aras\u0131ndaki karma\u015f\u0131k ili\u015fkilere dayan\u0131r. \u00d6rne\u011fin, &#8220;bir klas\u00f6r\u00fcn sahibi, o klas\u00f6rdeki t\u00fcm belgelerin de sahibidir.&#8221; Bu t\u00fcr t\u00fcremi\u015f (derived) ili\u015fkileri RBAC ile modellemek neredeyse imkans\u0131zd\u0131r ve manuel olarak y\u00f6netmek b\u00fcy\u00fck bir hata riskini beraberinde getirir.<\/li>\n<li><strong>\u00c7oklu Kirac\u0131l\u0131k (Multi-Tenancy) Sorunlar\u0131:<\/strong> Birden fazla m\u00fc\u015fterinin (kirac\u0131n\u0131n) ayn\u0131 platformu kulland\u0131\u011f\u0131 SaaS (Software as a Service) uygulamalar\u0131nda, her kirac\u0131n\u0131n kendi i\u00e7inde benzersiz roller ve izinlere sahip olmas\u0131 gerekir. RBAC, her kirac\u0131 i\u00e7in ayr\u0131 bir rol matrisi olu\u015fturmay\u0131 gerektirebilir ki bu da \u00f6l\u00e7eklenebilirlik a\u00e7\u0131s\u0131ndan b\u00fcy\u00fck bir sorun te\u015fkil eder.<\/li>\n<li><strong>Y\u00f6netim ve Denetim Zorlu\u011fu:<\/strong> Rol say\u0131s\u0131 ve karma\u015f\u0131kl\u0131\u011f\u0131 artt\u0131k\u00e7a, bir kullan\u0131c\u0131n\u0131n belirli bir kayna\u011fa neden eri\u015febildi\u011fini veya eri\u015femedi\u011fini anlamak zorla\u015f\u0131r. Bu da g\u00fcvenlik denetimlerini ve sorun gidermeyi g\u00fc\u00e7le\u015ftirir.<\/li>\n<\/ol>\n<p>Bu s\u0131n\u0131rl\u0131l\u0131klar, modern uygulamalar\u0131n Fine-Grained Authorization (\u0130nce Taneli Yetkilendirme) veya Relationship-Based Access Control (\u0130li\u015fki Tabanl\u0131 Eri\u015fim Kontrol\u00fc &#8211; ReBAC) gibi daha esnek ve g\u00fc\u00e7l\u00fc modellere y\u00f6nelmesini gerektirir. openFGA, tam da bu noktada devreye girerek, Google&#8217;\u0131n Zanzibar makalesinden ilham alan bir yakla\u015f\u0131mla, nesneler ve kullan\u0131c\u0131lar aras\u0131ndaki ili\u015fkiler \u00fczerine kurulu, \u00f6l\u00e7eklenebilir ve y\u00f6netilebilir bir yetkilendirme motoru sunar. Bu sayede, RBAC&#8217;\u0131n sa\u011flad\u0131\u011f\u0131 basitli\u011fi korurken, ayn\u0131 zamanda dinamik ve ince taneli yetkilendirme ihtiya\u00e7lar\u0131n\u0131 da kar\u015f\u0131layabiliriz.<\/p>\n<h2>openFGA Nedir ve Neden Bir Yetkilendirme Motoruna \u0130htiyac\u0131m\u0131z Var?<\/h2>\n<p>Geleneksel RBAC&#8217;\u0131n kar\u015f\u0131la\u015ft\u0131\u011f\u0131 zorluklar\u0131n ve modern uygulamalar\u0131n dinamik yetkilendirme gereksinimlerinin bir sonucu olarak, yetkilendirme mant\u0131\u011f\u0131n\u0131 uygulaman\u0131n ana kod taban\u0131ndan ay\u0131rma fikri giderek daha pop\u00fcler hale geldi. \u0130\u015fte tam da bu ihtiyaca cevap veren g\u00fc\u00e7l\u00fc ara\u00e7lardan biri openFGA&#8217;d\u0131r. openFGA, Auth0 FGA&#8217;n\u0131n a\u00e7\u0131k kaynakl\u0131 bir versiyonu olup, Google&#8217;\u0131n \u00e7\u0131\u011f\u0131r a\u00e7an <a href=\"https:\/\/research.google\/pubs\/pub45172.pdf\" target=\"_blank\">Zanzibar: A Comprehensive System for Authorization from Google<\/a> makalesinde a\u00e7\u0131klanan prensipleri temel alarak geli\u015ftirilmi\u015ftir. K\u0131sacas\u0131, openFGA, &#8220;kimin neye eri\u015fimi var?&#8221; sorusunu merkezi ve \u00f6l\u00e7eklenebilir bir \u015fekilde cevaplamak i\u00e7in tasarlanm\u0131\u015f, ili\u015fki tabanl\u0131 (ReBAC) bir yetkilendirme motorudur.<\/p>\n<h3>Neden Bir Yetkilendirme Motoruna \u0130htiyac\u0131m\u0131z Var?<\/h3>\n<p>Yetkilendirme mant\u0131\u011f\u0131n\u0131 uygulaman\u0131z\u0131n her yerine da\u011f\u0131tmak yerine, neden harici bir yetkilendirme motoruna g\u00fcvenmelisiniz? \u0130\u015fte temel nedenler:<\/p>\n<ul>\n<li><strong>Tek Yetki Kayna\u011f\u0131 (Single Source of Truth):<\/strong> T\u00fcm yetkilendirme kurallar\u0131n\u0131z\u0131 ve ili\u015fkilerinizi tek bir yerde tan\u0131mlamak, y\u00f6netmek ve denetlemek, tutars\u0131zl\u0131klar\u0131 \u00f6nler ve g\u00fcvenlik duru\u015funuzu g\u00fc\u00e7lendirir.<\/li>\n<li><strong>\u00d6l\u00e7eklenebilirlik ve Performans:<\/strong> Yetkilendirme motorlar\u0131, y\u00fcksek hacimli yetki sorgular\u0131n\u0131 d\u00fc\u015f\u00fck gecikmeyle i\u015flemek \u00fczere optimize edilmi\u015ftir. Uygulaman\u0131z\u0131n her mikroservisinde yetkilendirme mant\u0131\u011f\u0131n\u0131 yeniden yazmak yerine, merkezi bir motor bu y\u00fck\u00fc \u00fcstlenir.<\/li>\n<li><strong>Esneklik ve Dinamizm:<\/strong> openFGA&#8217;n\u0131n ili\u015fki tabanl\u0131 modeli, statik rollere ba\u011fl\u0131 kalmaks\u0131z\u0131n, nesneler ve kullan\u0131c\u0131lar aras\u0131ndaki dinamik ili\u015fkiler \u00fczerinden yetkilendirme yap\u0131lmas\u0131na olanak tan\u0131r. Bu, uygulaman\u0131z\u0131n i\u015f mant\u0131\u011f\u0131 de\u011fi\u015ftik\u00e7e yetkilendirme kurallar\u0131n\u0131 kolayca adapte etmenizi sa\u011flar.<\/li>\n<li><strong>Geli\u015ftirici Verimlili\u011fi:<\/strong> Geli\u015ftiricilerin her seferinde yetkilendirme mant\u0131\u011f\u0131n\u0131 ba\u015ftan tasarlamas\u0131na gerek kalmaz. Sadece &#8220;bu kullan\u0131c\u0131 bu nesneye eri\u015febilir mi?&#8221; diye sormak yeterlidir. Bu, kod tekrar\u0131n\u0131 azalt\u0131r ve geli\u015ftirme s\u00fcrecini h\u0131zland\u0131r\u0131r.<\/li>\n<li><strong>G\u00fcvenlik ve Denetlenebilirlik:<\/strong> Merkezi bir yetkilendirme motoru, t\u00fcm eri\u015fim kararlar\u0131n\u0131n loglanmas\u0131n\u0131 ve denetlenmesini kolayla\u015ft\u0131r\u0131r. Bu, uyumluluk gereksinimlerini kar\u015f\u0131laman\u0131za ve g\u00fcvenlik a\u00e7\u0131klar\u0131n\u0131 daha h\u0131zl\u0131 tespit etmenize yard\u0131mc\u0131 olur.<\/li>\n<\/ul>\n<h3>openFGA&#8217;n\u0131n Temel Kavramlar\u0131<\/h3>\n<p>openFGA&#8217;n\u0131n kalbinde, yetkilendirme modelinizi tan\u0131mlayan basit ama g\u00fc\u00e7l\u00fc kavramlar bulunur:<\/p>\n<ul>\n<li>\n            <strong>Yetkilendirme Modeli (Authorization Model &#8211; DSL):<\/strong> openFGA, ili\u015fkilerinizi tan\u0131mlamak i\u00e7in kendi Alan \u00d6zel Dilini (DSL) kullan\u0131r. Bu model, hangi &#8220;t\u00fcrlerin&#8221; (type) oldu\u011funu (\u00f6rne\u011fin, <code>user<\/code>, <code>document<\/code>, <code>folder<\/code>) ve bu t\u00fcrler aras\u0131nda hangi &#8220;ili\u015fkilerin&#8221; (relation) var olabilece\u011fini (\u00f6rne\u011fin, <code>owner<\/code>, <code>editor<\/code>, <code>viewer<\/code>) belirtir.<\/p>\n<pre><code>\n                schema 1.1\n\n                type user\n\n                type document\n                  relations\n                    define editor: [user, group#member] or owner\n                    define viewer: [user, group#member] or editor\n\n                type folder\n                  relations\n                    define owner: [user]\n                    define editor: [user, group#member] or owner\n                    define viewer: [user, group#member] or editor\n                  relations\n                    define parent: [folder]\n            <\/pre>\n<p><\/code><\/p>\n<p>Yukar\u0131daki \u00f6rnekte, bir <code>document<\/code>'\u0131n hem do\u011frudan bir <code>user<\/code> veya <code>group#member<\/code> taraf\u0131ndan <code>editor<\/code> olabilece\u011fi, hem de bir <code>owner<\/code> ili\u015fkisinden bu yetkiyi miras alabilece\u011fi tan\u0131mlanm\u0131\u015ft\u0131r. Bu DSL, yetkilendirme mant\u0131\u011f\u0131n\u0131z\u0131 son derece esnek bir \u015fekilde modellemenizi sa\u011flar.<\/p>\n<\/li>\n<li>\n            <strong>\u0130li\u015fki Demetleri (Relation Tuples):<\/strong> Bunlar, sistemdeki ger\u00e7ek ili\u015fkileri temsil eden verilerdir. \u00d6rne\u011fin, <code>user:alice<\/code>'\u0131n <code>document:roadmap<\/code> \u00fczerinde <code>editor<\/code> oldu\u011funu belirtmek i\u00e7in <code>{ \"user\": \"user:alice\", \"relation\": \"editor\", \"object\": \"document:roadmap\" }<\/code> \u015feklinde bir ili\u015fki demeti depolars\u0131n\u0131z. openFGA, bu demetleri depolayarak ve sorgulayarak yetkilendirme kararlar\u0131n\u0131 verir.\n        <\/li>\n<li>\n            <strong>Kontrol API'si (Check API):<\/strong> Bir kullan\u0131c\u0131n\u0131n belirli bir eylemi ger\u00e7ekle\u015ftirip ger\u00e7ekle\u015ftiremeyece\u011fini sorgulamak i\u00e7in kullan\u0131l\u0131r. \u00d6rne\u011fin, <code>Check(user:alice, \"viewer\", document:roadmap)<\/code> sorgusu, Alice'in \"roadmap\" dok\u00fcman\u0131n\u0131 g\u00f6r\u00fcnt\u00fcleyip g\u00f6r\u00fcnt\u00fcleyemeyece\u011fini kontrol eder.\n        <\/li>\n<li>\n            <strong>Yazma API'si (Write API):<\/strong> Yeni ili\u015fki demetleri olu\u015fturmak veya mevcut olanlar\u0131 silmek i\u00e7in kullan\u0131l\u0131r. Uygulaman\u0131zdaki kullan\u0131c\u0131lar, roller ve nesneler aras\u0131ndaki ili\u015fkiler de\u011fi\u015ftik\u00e7e (\u00f6rne\u011fin, \"Alice, roadmap dok\u00fcman\u0131n\u0131n edit\u00f6r\u00fc oldu\"), bu API'yi kullanarak openFGA'ya bu de\u011fi\u015fiklikleri bildirirsiniz.<\/li>\n<\/ul>\n<p>openFGA'n\u0131n bu temel ta\u015flar\u0131, da\u011f\u0131t\u0131k sistemler i\u00e7in \u00f6l\u00e7eklenebilir, performansl\u0131 ve tutarl\u0131 bir yetkilendirme \u00e7\u00f6z\u00fcm\u00fc sunar. Art\u0131k yetkilendirme mant\u0131\u011f\u0131, uygulaman\u0131n i\u015flevselli\u011finden ayr\u0131, \u00f6zel bir servis olarak ele al\u0131nabilir ve y\u00f6netilebilir.<\/p>\n<h2>Go Sunucusunda openFGA ile RBAC Nas\u0131l Uygulan\u0131r: Ad\u0131m Ad\u0131m Rehber<\/h2>\n<p>Go, y\u00fcksek performans\u0131 ve e\u015fzamanl\u0131l\u0131k yetenekleri sayesinde modern backend uygulamalar\u0131 geli\u015ftirmek i\u00e7in pop\u00fcler bir dildir. openFGA'y\u0131 Go sunucular\u0131n\u0131za entegre etmek, yetkilendirme mant\u0131\u011f\u0131n\u0131 uygulaman\u0131zdan ay\u0131rarak daha temiz, \u00f6l\u00e7eklenebilir ve y\u00f6netilebilir bir kod taban\u0131 olu\u015fturman\u0131z\u0131 sa\u011flar. \u015eimdi, ad\u0131m ad\u0131m bu entegrasyonu nas\u0131l ger\u00e7ekle\u015ftirece\u011fimize bakal\u0131m.<\/p>\n<h3>1. \u00d6n Haz\u0131rl\u0131k: openFGA Sunucusunu \u00c7al\u0131\u015ft\u0131rma<\/h3>\n<p>openFGA, ayr\u0131 bir servis olarak \u00e7al\u0131\u015ft\u0131\u011f\u0131ndan, \u00f6ncelikle bir openFGA sunucusu \u00e7al\u0131\u015ft\u0131rman\u0131z gerekir. En kolay yol Docker kullanmakt\u0131r:<\/p>\n<pre><code>\n        docker pull openfga\/openfga:latest\n        docker run -p 8080:8080 -p 8081:8081 openfga\/openfga:latest\n    <\/pre>\n<p><\/code><\/p>\n<p>Bu komut, openFGA sunucusunu 8080 (HTTP) ve 8081 (gRPC) portlar\u0131nda \u00e7al\u0131\u015ft\u0131racakt\u0131r. Genellikle gRPC API'sini kullanmak, daha iyi performans ve tip g\u00fcvenli\u011fi sa\u011flar. Go SDK's\u0131 gRPC istemcisini kullan\u0131r.<\/p>\n<h3>2. Go SDK Entegrasyonu<\/h3>\n<p>Go projenize openFGA SDK's\u0131n\u0131 ekleyin:<\/p>\n<pre><code>\n        go get github.com\/openfga\/go-sdk\/client\n    <\/pre>\n<p><\/code><\/p>\n<p>Daha sonra, Go kodunuzda bir openFGA istemcisi olu\u015fturun:<\/p>\n<pre><code>\n        package main\n\n        import (\n            \"context\"\n            \"fmt\"\n            \"log\"\n\n            ofga \"github.com\/openfga\/go-sdk\/client\"\n            \"github.com\/openfga\/go-sdk\/credentials\"\n        )\n\n        func main() {\n            ctx := context.Background()\n\n            \/\/ openFGA sunucusu ba\u011flant\u0131 ayarlar\u0131\n            config := ofga.ClientConfiguration{\n                ApiUrl:  \"http:\/\/localhost:8080\", \/\/ Veya gRPC i\u00e7in \"localhost:8081\" ve Scheme: \"grpc\"\n                StoreId: \"01H2144Y1J322A0H1Z0G6X85G3\", \/\/ Kendi Store ID'nizi kullan\u0131n\n                Auth:    &credentials.Credentials{Method: credentials.None}, \/\/ Kimlik do\u011frulama ayarlar\u0131 (\u00f6rne\u011fin, None, Bearer, ClientCredentials)\n            }\n\n            fgaClient, err := ofga.NewClient(config)\n            if err != nil {\n                log.Fatalf(\"openFGA istemcisi olu\u015fturulamad\u0131: %v\", err)\n            }\n\n            fmt.Println(\"openFGA istemcisi ba\u015far\u0131yla olu\u015fturuldu!\")\n\n            \/\/ Store ID'yi almak i\u00e7in:\n            \/\/ Bir defal\u0131k bir i\u015flem olarak, Store ID'nizi openFGA API'si \u00fczerinden olu\u015fturabilirsiniz.\n            \/\/ \u00d6rne\u011fin: curl -X POST http:\/\/localhost:8080\/stores --data-raw '{}'\n            \/\/ veya SDK ile:\n            \/\/ response, err := fgaClient.CreateStore(ctx).Execute()\n            \/\/ if err != nil { \/* ... *\/ }\n            \/\/ fmt.Printf(\"Yeni Store ID: %s\\n\", *response.Id)\n        }\n    <\/pre>\n<p><\/code><\/p>\n<p><code>StoreId<\/code>, yetkilendirme modelinizin ve ili\u015fkilerinizin depoland\u0131\u011f\u0131 mant\u0131ksal bir aland\u0131r. Her uygulaman\u0131n genellikle kendi Store ID'si olur. E\u011fer ilk kez kullan\u0131yorsan\u0131z, yukar\u0131daki <code>curl<\/code> komutu veya SDK ile yeni bir Store olu\u015fturman\u0131z gerekebilir.<\/p>\n<h3>3. Yetkilendirme Modelini Tan\u0131mlama ve Y\u00fckleme<\/h3>\n<p>DSL (Domain Specific Language) ile yetkilendirme modelinizi tan\u0131mlay\u0131n. \u00d6rne\u011fin, bir belge y\u00f6netim sistemi i\u00e7in basit bir model:<\/p>\n<pre><code class=\"language-fga\">\n        schema 1.1\n\n        type user\n\n        type document\n          relations\n            define viewer: [user, group#member] or owner\n            define editor: [user, group#member] or owner or viewer\n            define owner: [user]\n    <\/pre>\n<p><\/code><\/p>\n<p>Bu modeli Go koduyla openFGA sunucusuna g\u00f6nderin:<\/p>\n<pre><code>\n        package main\n\n        import (\n            \"context\"\n            \"fmt\"\n            \"log\"\n\n            ofga \"github.com\/openfga\/go-sdk\/client\"\n            \"github.com\/openfga\/go-sdk\/credentials\"\n        )\n\n        func main() {\n            ctx := context.Background()\n            config := ofga.ClientConfiguration{\n                ApiUrl:  \"http:\/\/localhost:8080\",\n                StoreId: \"01H2144Y1J322A0H1Z0G6X85G3\", \/\/ Kendi Store ID'niz\n                Auth:    &credentials.Credentials{Method: credentials.None},\n            }\n            fgaClient, err := ofga.NewClient(config)\n            if err != nil {\n                log.Fatalf(\"openFGA istemcisi olu\u015fturulamad\u0131: %v\", err)\n            }\n\n            modelDSL := <code>schema 1.1\n\n                type user\n\n                type document\n                  relations\n                    define viewer: [user, group#member] or owner\n                    define editor: [user, group#member] or owner or viewer\n                    define owner: [user]\n\n                type group\n                  relations\n                    define member: [user]<\/code>\n\n            options := ofga.ClientWriteAuthorizationModelOptions{}\n            writeAuthModelResponse, err := fgaClient.WriteAuthorizationModel(ctx).Body(\n                ofga.WriteAuthorizationModelRequest{\n                    Schema: &modelDSL,\n                },\n            ).Options(options).Execute()\n\n            if err != nil {\n                log.Fatalf(\"Yetkilendirme modeli yaz\u0131lamad\u0131: %v\", err)\n            }\n            fmt.Printf(\"Yetkilendirme modeli ba\u015far\u0131yla y\u00fcklendi. Model ID: %s\\n\", *writeAuthModelResponse.AuthorizationModelId)\n            \/\/ Bu model ID'yi kaydedin, \u00e7\u00fcnk\u00fc daha sonraki sorgular\u0131n\u0131zda kullanman\u0131z gerekebilir.\n        }\n    <\/pre>\n<p><\/code><\/p>\n<h3>4. \u0130li\u015fki Demetleri (Relation Tuples) Olu\u015fturma<\/h3>\n<p>Kullan\u0131c\u0131lar ve belgeler aras\u0131ndaki ili\u015fkileri tan\u0131mlay\u0131n. \u00d6rne\u011fin, 'ali' adl\u0131 kullan\u0131c\u0131n\u0131n 'dokuman-123' belgesinin sahibi oldu\u011funu ve 'veli' adl\u0131 kullan\u0131c\u0131n\u0131n bu belgeyi g\u00f6r\u00fcnt\u00fcleyebildi\u011fini varsayal\u0131m:<\/p>\n<pre><code>\n        package main\n\n        \/\/ ... (\u00f6nceki import'lar ve main fonksiyonu ba\u015flang\u0131c\u0131)\n\n        func main() {\n            \/\/ ... (client olu\u015fturma ve model y\u00fckleme kodlar\u0131)\n\n            \/\/ \u0130li\u015fki demetlerini yazma (Write Tuples)\n            \/\/ Alice, document:roadmap'in sahibi\n            _, err = fgaClient.Write(ctx).Body(ofga.ClientWriteRequest{\n                Writes: []ofga.ClientTupleKey{\n                    ofga.ClientTupleKey{\n                        User:     \"user:alice\",\n                        Relation: \"owner\",\n                        Object:   \"document:roadmap\",\n                    },\n                },\n            }).Execute()\n\n            if err != nil {\n                log.Fatalf(\"\u0130li\u015fki demetleri yaz\u0131lamad\u0131 (Alice owner): %v\", err)\n            }\n            fmt.Println(\"Alice, document:roadmap'in sahibi olarak kaydedildi.\")\n\n            \/\/ Bob, document:roadmap'i g\u00f6r\u00fcnt\u00fcleyebilir\n            _, err = fgaClient.Write(ctx).Body(ofga.ClientWriteRequest{\n                Writes: []ofga.ClientTupleKey{\n                    ofga.ClientTupleKey{\n                        User:     \"user:bob\",\n                        Relation: \"viewer\",\n                        Object:   \"document:roadmap\",\n                    },\n                },\n            }).Execute()\n\n            if err != nil {\n                log.Fatalf(\"\u0130li\u015fki demetleri yaz\u0131lamad\u0131 (Bob viewer): %v\", err)\n            }\n            fmt.Println(\"Bob, document:roadmap'i g\u00f6r\u00fcnt\u00fcleyici olarak kaydedildi.\")\n        }\n    <\/pre>\n<p><\/code><\/p>\n<h3>5. Yetkilendirme Kontrol\u00fc (Check API)<\/h3>\n<p>\u015eimdi en \u00f6nemli k\u0131s\u0131m: Bir kullan\u0131c\u0131n\u0131n bir eylemi ger\u00e7ekle\u015ftirip ger\u00e7ekle\u015ftiremeyece\u011fini kontrol etme. Bu, uygulaman\u0131z\u0131n API endpoint'lerinde veya i\u015f mant\u0131\u011f\u0131 katman\u0131nda \u00e7a\u011f\u0131raca\u011f\u0131n\u0131z ana fonksiyondur.<\/p>\n<pre><code>\n        package main\n\n        \/\/ ... (\u00f6nceki import'lar, main fonksiyonu ba\u015flang\u0131c\u0131, client olu\u015fturma ve model\/tuple y\u00fckleme kodlar\u0131)\n\n        func main() {\n            \/\/ ... (\u00f6nceki kodlar)\n\n            \/\/ Yetkilendirme Kontrol\u00fc (Check)\n            checkUserAccess := func(user, relation, object string) {\n                checkResponse, err := fgaClient.Check(ctx).Body(\n                    ofga.ClientCheckRequest{\n                        User:     user,\n                        Relation: relation,\n                        Object:   object,\n                    },\n                ).Execute()\n\n                if err != nil {\n                    log.Printf(\"Check sorgusu ba\u015far\u0131s\u0131z oldu: %v\", err)\n                    return\n                }\n\n                if checkResponse.GetAllowed() {\n                    fmt.Printf(\"%s, %s \u00fczerinde %s yetkisine SAH\u0130P.\\n\", user, object, relation)\n                } else {\n                    fmt.Printf(\"%s, %s \u00fczerinde %s yetkisine SAH\u0130P DE\u011e\u0130L.\\n\", user, object, relation)\n                }\n            }\n\n            \/\/ Test sorgular\u0131\n            checkUserAccess(\"user:alice\", \"owner\", \"document:roadmap\")   \/\/ Alice owner m\u0131? -> EVET\n            checkUserAccess(\"user:alice\", \"editor\", \"document:roadmap\")  \/\/ Alice editor m\u0131? (owner oldu\u011fu i\u00e7in) -> EVET\n            checkUserAccess(\"user:alice\", \"viewer\", \"document:roadmap\")  \/\/ Alice viewer m\u0131? (editor oldu\u011fu i\u00e7in) -> EVET\n            checkUserAccess(\"user:bob\", \"viewer\", \"document:roadmap\")    \/\/ Bob viewer m\u0131? -> EVET\n            checkUserAccess(\"user:bob\", \"editor\", \"document:roadmap\")    \/\/ Bob editor m\u0131? -> HAYIR\n            checkUserAccess(\"user:charlie\", \"owner\", \"document:roadmap\") \/\/ Charlie owner m\u0131? -> HAYIR\n        }\n    <\/pre>\n<p><\/code><\/p>\n<p>Bu ad\u0131mlar, Go sunucunuzda openFGA ile temel bir RBAC sistemini nas\u0131l kuraca\u011f\u0131n\u0131z\u0131 g\u00f6stermektedir. Belirli bir kullan\u0131c\u0131n\u0131n belirli bir eylemi ger\u00e7ekle\u015ftirme yetkisine sahip olup olmad\u0131\u011f\u0131n\u0131 an\u0131nda sorgulayabilirsiniz. openFGA, ili\u015fkileri ve modelinizi kullanarak bu karar\u0131 sizin i\u00e7in verir, b\u00f6ylece uygulaman\u0131z\u0131n kod taban\u0131 yetkilendirme mant\u0131\u011f\u0131ndan ar\u0131nd\u0131r\u0131lm\u0131\u015f olur.<\/p>\n<div class=\"expert-tip\">\n        <strong>Uzman \u0130pucu:<\/strong> API endpoint'lerinizde gelen isteklerdeki kullan\u0131c\u0131 kimli\u011fini al\u0131p, her endpoint i\u00e7in gerekli olan yetkilendirme kontrol\u00fcn\u00fc openFGA Check API'si ile yap\u0131n. Bu, middleware katman\u0131nda veya do\u011frudan handler fonksiyonunda ger\u00e7ekle\u015ftirilebilir. B\u00f6ylece yetkilendirme kararlar\u0131 merkezi ve tekrars\u0131z hale gelir.\n    <\/div>\n<h2>Geli\u015fmi\u015f openFGA Kullan\u0131m\u0131: Dinamik RBAC ve Performans \u0130pu\u00e7lar\u0131<\/h2>\n<p>openFGA'n\u0131n g\u00fcc\u00fc, sadece statik rolleri y\u00f6netmekle s\u0131n\u0131rl\u0131 de\u011fildir. Dinamik ili\u015fkiler, t\u00fcremi\u015f yetkiler ve performans optimizasyonlar\u0131 sayesinde, en karma\u015f\u0131k yetkilendirme senaryolar\u0131n\u0131 bile kolayca modelleyebilirsiniz. Bu b\u00f6l\u00fcm, openFGA'y\u0131 daha ileri d\u00fczeyde kullanma tekniklerini ve Go uygulamalar\u0131n\u0131zdaki performans\u0131n\u0131 art\u0131rmaya y\u00f6nelik ipu\u00e7lar\u0131n\u0131 ele alacakt\u0131r.<\/p>\n<h3>Dinamik \u0130li\u015fkiler ve T\u00fcremi\u015f Yetkiler<\/h3>\n<p>Geleneksel RBAC'\u0131n en b\u00fcy\u00fck zorluklar\u0131ndan biri, hiyerar\u015fik veya t\u00fcremi\u015f yetkileri y\u00f6netmektir. openFGA'n\u0131n DSL'i, bu t\u00fcr karma\u015f\u0131k ili\u015fkileri \u015fema d\u00fczeyinde tan\u0131mlaman\u0131za olanak tan\u0131r. \u00d6rne\u011fin, bir \"klas\u00f6r\"\u00fcn sahibi, o klas\u00f6rdeki t\u00fcm \"belge\"lerin de sahibi olmal\u0131d\u0131r. Bu, openFGA'da Computed Users (Hesaplanan Kullan\u0131c\u0131lar) ve TupleToUserset (Demetten Kullan\u0131c\u0131 K\u00fcmesine) kavramlar\u0131yla kolayca ba\u015far\u0131l\u0131r:<\/p>\n<pre><code class=\"language-fga\">\n        schema 1.1\n\n        type user\n\n        type folder\n          relations\n            define owner: [user]\n            define editor: [user] or owner \/\/ Klas\u00f6r\u00fcn sahibi ayn\u0131 zamanda editor'\u00fcd\u00fcr.\n\n        type document\n          relations\n            define viewer: [user] or editor or parent#viewer \/\/ Document'\u0131n viewr'\u0131; editor'\u00fc veya \u00fcst klas\u00f6r\u00fcn\u00fcn viewer'\u0131 olabilir\n            define editor: [user] or owner or parent#editor \/\/ Document'\u0131n editor'\u00fc; owner'\u0131 veya \u00fcst klas\u00f6r\u00fcn\u00fcn editor'\u00fc olabilir\n            define owner: [user] \/\/ Document'\u0131n do\u011frudan sahibi\n            define parent: [folder] \/\/ Document'\u0131n ba\u011fl\u0131 oldu\u011fu klas\u00f6r\n    <\/pre>\n<p><\/code><\/p>\n<p>Bu modelde:<\/p>\n<ul>\n<li>Bir <code>folder<\/code>'\u0131n <code>owner<\/code>'\u0131, otomatik olarak <code>editor<\/code> yetkisini kazan\u0131r (<code>owner or editor<\/code>).<\/li>\n<li>Bir <code>document<\/code>'\u0131n <code>viewer<\/code>'\u0131, do\u011frudan tan\u0131mlanm\u0131\u015f bir <code>user<\/code> olabilece\u011fi gibi, <code>editor<\/code> ili\u015fkisinden veya ba\u011fl\u0131 oldu\u011fu <code>parent<\/code> klas\u00f6r\u00fcn\u00fcn <code>viewer<\/code>'\u0131ndan da t\u00fcretilebilir (<code>viewer or editor or parent#viewer<\/code>).<\/li>\n<li><code>parent#viewer<\/code> ifadesi, <code>document<\/code>'\u0131n <code>parent<\/code> ili\u015fkisi arac\u0131l\u0131\u011f\u0131yla ba\u011fland\u0131\u011f\u0131 <code>folder<\/code> nesnesinin <code>viewer<\/code> ili\u015fkisini temsil eder. Bu, hiyerar\u015fik yetki ak\u0131\u015f\u0131n\u0131 inan\u0131lmaz derecede esnek bir \u015fekilde tan\u0131mlaman\u0131z\u0131 sa\u011flar.<\/li>\n<\/ul>\n<p>Bu sayede, \"bir \u00fcst klas\u00f6r\u00fcn edit\u00f6r\u00fc, alt\u0131ndaki t\u00fcm belgelerin de edit\u00f6r\u00fcd\u00fcr\" gibi i\u015f kurallar\u0131n\u0131 do\u011frudan yetkilendirme modelinize dahil edebilir ve her belge i\u00e7in tek tek izin atama y\u00fck\u00fcnden kurtulabilirsiniz.<\/p>\n<h3>Performans Optimizasyonu<\/h3>\n<p>Y\u00fcksek performansl\u0131 Go uygulamalar\u0131 i\u00e7in openFGA entegrasyonunda dikkat etmeniz gereken baz\u0131 noktalar:<\/p>\n<ol>\n<li>\n            <strong>Toplu Kontrol (Batch Check) Kullan\u0131m\u0131:<\/strong> Ayn\u0131 anda birden fazla yetkilendirme sorgusu yapman\u0131z gerekti\u011finde (\u00f6rne\u011fin, bir liste ekran\u0131nda her \u00f6\u011fe i\u00e7in yetki kontrol\u00fc), tek tek <code>Check<\/code> \u00e7a\u011fr\u0131lar\u0131 yerine <code>Batch Check<\/code> API'sini kullan\u0131n. Bu, a\u011f gecikmesini azalt\u0131r ve openFGA sunucusundaki kaynak kullan\u0131m\u0131n\u0131 optimize eder.<\/p>\n<pre><code>\n                \/\/ Go SDK'da Batch Check \u00f6rne\u011fi\n                \/\/ checks := []ofga.ClientCheckRequest{...}\n                \/\/ batchCheckResponse, err := fgaClient.BatchCheck(ctx).Body(checks).Execute()\n            <\/pre>\n<p><\/code>\n        <\/li>\n<li>\n            <strong>Do\u011fru Model Tasar\u0131m\u0131:<\/strong> Yetkilendirme modelinizi m\u00fcmk\u00fcn oldu\u011funca sade ve anla\u015f\u0131l\u0131r tutun. \u00c7ok karma\u015f\u0131k ili\u015fkiler veya gereksiz derin t\u00fcretmeler, sorgu s\u00fcrelerini uzatabilir. Modelinizi tasarlarken, hangi sorgular\u0131n en s\u0131k yap\u0131laca\u011f\u0131n\u0131 ve bunlar\u0131n nas\u0131l en verimli \u015fekilde cevaplanabilece\u011fini d\u00fc\u015f\u00fcn\u00fcn. \u00d6rne\u011fin, do\u011frudan ili\u015fkilere \u00f6ncelik vermek genellikle daha h\u0131zl\u0131d\u0131r.<\/li>\n<li>\n            <strong>De\u011fi\u015fiklik Ak\u0131\u015f\u0131 (Change Stream) Kullan\u0131m\u0131:<\/strong> Baz\u0131 durumlarda, bir kullan\u0131c\u0131n\u0131n yetkileri anl\u0131k olarak de\u011fi\u015fti\u011finde uygulaman\u0131z\u0131n bu de\u011fi\u015fikliklerden haberdar olmas\u0131 gerekebilir. openFGA'n\u0131n Change Stream \u00f6zelli\u011fi (<code>ReadChanges<\/code> API), ili\u015fki demetlerindeki de\u011fi\u015fiklikleri ger\u00e7ek zamanl\u0131 olarak dinlemenizi sa\u011flar. Bu, yerel bir \u00f6nbelle\u011fi g\u00fcncel tutmak veya di\u011fer sistemleri tetiklemek i\u00e7in kullan\u0131labilir, b\u00f6ylece her yetki kontrol\u00fcnde openFGA'ya gitme ihtiyac\u0131n\u0131 azaltabilirsiniz.<\/li>\n<li>\n            <strong>Do\u011fru Caching Stratejileri:<\/strong> openFGA sunucusu kendi i\u00e7inde g\u00fc\u00e7l\u00fc bir \u00f6nbellekleme mekanizmas\u0131na sahip olsa da, uygulaman\u0131z\u0131n belirli yetkilendirme kararlar\u0131n\u0131 (\u00f6zellikle s\u0131k sorgulanan ve nadiren de\u011fi\u015fenleri) k\u0131sa s\u00fcreli olarak \u00f6nbelle\u011fe almas\u0131 performans\u0131 art\u0131rabilir. Ancak, bu \u00f6nbelle\u011fin g\u00fcncel kalmas\u0131n\u0131 sa\u011flamak i\u00e7in Change Stream gibi mekanizmalar\u0131 kullanmak \u00f6nemlidir.<\/li>\n<\/ol>\n<h3>Mobil Uyumluluk \u0130\u00e7in \u0130pu\u00e7lar\u0131<\/h3>\n<p>Yetkilendirme \u00e7o\u011funlukla backend taraf\u0131nda ger\u00e7ekle\u015fen bir s\u00fcre\u00e7 oldu\u011fundan, do\u011frudan HTML ve CSS ile mobil uyumluluk sa\u011flamak bu ba\u011flamda ge\u00e7erli de\u011fildir. Ancak, openFGA gibi h\u0131zl\u0131 bir yetkilendirme motoru, mobil uygulamalar\u0131n\u0131z i\u00e7in dolayl\u0131 yoldan \u00f6nemli faydalar sa\u011flar:<\/p>\n<ul>\n<li><strong>H\u0131zl\u0131 API Yan\u0131tlar\u0131:<\/strong> openFGA'n\u0131n y\u00fcksek performansl\u0131 yap\u0131s\u0131, yetkilendirme sorgular\u0131n\u0131n d\u00fc\u015f\u00fck gecikmeyle sonu\u00e7lanmas\u0131n\u0131 sa\u011flar. Mobil uygulamalar, h\u0131zl\u0131 API yan\u0131tlar\u0131na duyarl\u0131d\u0131r; gecikmeler kullan\u0131c\u0131 deneyimini olumsuz etkiler. Daha h\u0131zl\u0131 yetkilendirme kararlar\u0131, genel uygulama yan\u0131t s\u00fcrelerini iyile\u015ftirir.<\/li>\n<li><strong>Tutarl\u0131 Kullan\u0131c\u0131 Deneyimi:<\/strong> Merkezi bir yetkilendirme sistemi, mobil uygulama ve di\u011fer istemciler aras\u0131nda tutarl\u0131 yetki uygulamalar\u0131 sa\u011flar. Bu, kullan\u0131c\u0131lar\u0131n farkl\u0131 platformlarda ayn\u0131 eri\u015fim kurallar\u0131na tabi olmas\u0131n\u0131 garanti eder.<\/li>\n<li><strong>G\u00fcvenli ve Esnek Mobil API'ler:<\/strong> Mobil uygulamalar genellikle s\u0131n\u0131rl\u0131 kaynaklara sahiptir ve her zaman g\u00fcvenli a\u011flarda \u00e7al\u0131\u015fmazlar. openFGA ile yetkilendirme mant\u0131\u011f\u0131n\u0131 sunucu taraf\u0131nda tutmak, mobil uygulamalar\u0131n kendisinde karma\u015f\u0131k yetki kontrolleri yapma ihtiyac\u0131n\u0131 ortadan kald\u0131r\u0131r, bu da g\u00fcvenlik risklerini azalt\u0131r ve istemci kodunu basitle\u015ftirir. Mobil kullan\u0131c\u0131 aray\u00fcz\u00fcn\u00fcz\u00fcn responsive (duyarl\u0131) olmas\u0131, backend'inizden gelen verinin h\u0131zl\u0131 ve do\u011fru olmas\u0131n\u0131 gerektirir; openFGA bu temeli sa\u011flamla\u015ft\u0131r\u0131r.<\/li>\n<\/ul>\n<p>Mobil uyumlu HTML ve CSS, frontend geli\u015ftiricilerinin i\u015fidir. Ancak backend'de openFGA kullanarak sa\u011flad\u0131\u011f\u0131n\u0131z h\u0131zl\u0131 ve tutarl\u0131 yetkilendirme kararlar\u0131, mobil uygulamalar\u0131n daha duyarl\u0131 ve keyifli bir deneyim sunmas\u0131na katk\u0131da bulunur. <\/p>\n<h2>Ger\u00e7ek D\u00fcnya Vaka Analizi: \u00c7ok Katmanl\u0131 Bir SaaS Uygulamas\u0131nda RBAC<\/h2>\n<p>openFGA'n\u0131n ger\u00e7ek d\u00fcnyadaki g\u00fcc\u00fcn\u00fc daha iyi anlamak i\u00e7in, pop\u00fcler bir senaryoyu ele alal\u0131m: karma\u015f\u0131k yetkilendirme ihtiya\u00e7lar\u0131 olan \u00e7ok katmanl\u0131 bir SaaS (Software as a Service) proje y\u00f6netim uygulamas\u0131. Bu uygulama, m\u00fc\u015fterilerine projeleri y\u00f6netme, g\u00f6revler atama, dosya payla\u015f\u0131m\u0131 ve ileti\u015fim kurma imkan\u0131 sunuyor. Uygulaman\u0131n farkl\u0131 abonelik seviyeleri, organizasyonlar\u0131, projeleri ve bu yap\u0131lar i\u00e7indeki farkl\u0131 rolleri bulunuyor.<\/p>\n<h3>Senaryo: \"TaskForge\" Proje Y\u00f6netim Uygulamas\u0131<\/h3>\n<p>TaskForge'da a\u015fa\u011f\u0131daki varl\u0131klar ve ili\u015fkiler mevcut:<\/p>\n<ul>\n<li><strong>Kullan\u0131c\u0131lar (User):<\/strong> Sistemdeki bireyler.<\/li>\n<li><strong>Organizasyon (Organization):<\/strong> M\u00fc\u015fterilerin ana yap\u0131s\u0131 (\u00f6rne\u011fin, \"Acme Corp\").<\/li>\n<li><strong>Proje (Project):<\/strong> Organizasyon i\u00e7inde yer alan \u00e7al\u0131\u015fma birimleri (\u00f6rne\u011fin, \"Web Sitesi Lansman\u0131\").<\/li>\n<li><strong>G\u00f6rev (Task):<\/strong> Projeler i\u00e7inde yer alan k\u00fc\u00e7\u00fck i\u015f par\u00e7alar\u0131 (\u00f6rne\u011fin, \"Ana Sayfa Tasar\u0131m\u0131\").<\/li>\n<li><strong>Abonelik Plan\u0131 (SubscriptionPlan):<\/strong> Organizasyonlar\u0131n sahip oldu\u011fu planlar (Basic, Premium, Enterprise).<\/li>\n<\/ul>\n<p>Yetkilendirme gereksinimleri:<\/p>\n<ol>\n<li>Bir organizasyonun <strong>sahibi<\/strong>, o organizasyondaki t\u00fcm projeleri ve g\u00f6revleri y\u00f6netebilir, kullan\u0131c\u0131 ekleyebilir\/\u00e7\u0131karabilir.<\/li>\n<li>Bir projenin <strong>y\u00f6neticisi<\/strong>, sadece kendi projesi i\u00e7indeki g\u00f6revleri d\u00fczenleyebilir, yeni g\u00f6revler olu\u015fturabilir ve projeye \u00fcyeler ekleyebilir.<\/li>\n<li>Bir projenin <strong>\u00fcyesi<\/strong>, sadece kendi projesi i\u00e7indeki g\u00f6revleri g\u00f6r\u00fcnt\u00fcleyebilir ve kendi atand\u0131\u011f\u0131 g\u00f6revleri tamamlayabilir.<\/li>\n<li>Bir kullan\u0131c\u0131n\u0131n, g\u00f6rev \u00fczerinde \"atamal\u0131\" (assignee) ili\u015fkisi varsa, o g\u00f6revi \"tamamla\" eylemini ger\u00e7ekle\u015ftirebilir.<\/li>\n<li>\"Enterprise\" abonelik plan\u0131na sahip organizasyonlar\u0131n kullan\u0131c\u0131lar\u0131, \u00f6zel \"denet\u00e7i\" (auditor) rol\u00fcne sahip olabilir ve t\u00fcm projelere salt okunur eri\u015fime sahip olabilir.<\/li>\n<\/ol>\n<h3>Geleneksel RBAC Neden Yetersiz Kal\u0131rd\u0131?<\/h3>\n<p>Bu senaryoda, geleneksel RBAC ile ba\u015fa \u00e7\u0131kmak bir kabus olurdu:<\/p>\n<ul>\n<li>Her organizasyon i\u00e7in ayr\u0131 \"Organizasyon X Y\u00f6neticisi\" gibi roller tan\u0131mlamak rol patlamas\u0131na yol a\u00e7ar.<\/li>\n<li>Her proje i\u00e7in ayr\u0131 \"Proje Y Y\u00f6neticisi\" gibi roller tan\u0131mlamak, y\u00f6netimi imkans\u0131z k\u0131lard\u0131.<\/li>\n<li>Bir kullan\u0131c\u0131n\u0131n bir g\u00f6rev \u00fczerinde \"atamal\u0131\" olmas\u0131 gibi nesne d\u00fczeyindeki dinamik ili\u015fkileri RBAC ile modellemek imkans\u0131za yak\u0131n olurdu.<\/li>\n<li>Abonelik planlar\u0131na g\u00f6re yetkilerin de\u011fi\u015fmesi, karma\u015f\u0131k ko\u015fullu mant\u0131k gerektirirdi.<\/li>\n<\/ul>\n<h3>openFGA ile \u00c7\u00f6z\u00fcm<\/h3>\n<p>openFGA, bu senaryoyu ili\u015fkiler \u00fczerinden zarif\u00e7e \u00e7\u00f6zer. \u0130\u015fte basitle\u015ftirilmi\u015f bir openFGA DSL modeli:<\/p>\n<pre><code class=\"language-fga\">\n        schema 1.1\n\n        type user\n\n        type organization\n          relations\n            define owner: [user]\n            define member: [user] or owner\n\n        type project\n          relations\n            define manager: [user] or organization#owner \/\/ Proje y\u00f6neticisi veya organizasyon sahibi\n            define member: [user] or manager or organization#member\n            define parent: [organization]\n\n        type task\n          relations\n            define assignee: [user]\n            define editor: [user] or project#manager \/\/ G\u00f6revin editor'\u00fc, atanan ki\u015fi veya proje y\u00f6neticisi\n            define viewer: [user] or editor or project#member \/\/ G\u00f6revin g\u00f6r\u00fcnt\u00fcleyicisi\n            define complete_task: assignee \/\/ Sadece atanan ki\u015fi g\u00f6revi tamamlayabilir\n            define parent: [project]\n    <\/pre>\n<p><\/code><\/p>\n<p>Bu modelle:<\/p>\n<ul>\n<li><code>project#manager<\/code>: Bir proje, \u00fcst <code>organization<\/code>'\u0131n <code>owner<\/code>'\u0131 taraf\u0131ndan y\u00f6netilebilir.<\/li>\n<li><code>task#editor<\/code>: Bir g\u00f6revin edit\u00f6r\u00fc, do\u011frudan atanm\u0131\u015f bir kullan\u0131c\u0131 olabilece\u011fi gibi, o g\u00f6revin ait oldu\u011fu <code>project<\/code>'in <code>manager<\/code>'\u0131 da olabilir.<\/li>\n<li><code>task#complete_task<\/code>: Bu, sadece <code>assignee<\/code> ili\u015fkisine sahip kullan\u0131c\u0131lar\u0131n yapabilece\u011fi belirli bir eylemdir.<\/li>\n<\/ul>\n<h3>Go Sunucusunda Entegrasyon<\/h3>\n<p>Go backend'inizde, TaskForge'un API endpoint'lerinde bu yetkilendirme modelini kullan\u0131rs\u0131n\u0131z. \u00d6rne\u011fin, bir kullan\u0131c\u0131n\u0131n bir g\u00f6revi tamamlamaya \u00e7al\u0131\u015ft\u0131\u011f\u0131 bir API endpoint'i:<\/p>\n<pre><code>\n        package main\n\n        import (\n            \"context\"\n            \"log\"\n            \"net\/http\"\n\n            ofga \"github.com\/openfga\/go-sdk\/client\"\n            \"github.com\/openfga\/go-sdk\/credentials\"\n        )\n\n        \/\/ fgaClient global veya dependency injection ile y\u00f6netilebilir\n        var fgaClient *ofga.OpenFgaClient\n\n        func init() {\n            ctx := context.Background()\n            config := ofga.ClientConfiguration{\n                ApiUrl:  \"http:\/\/localhost:8080\",\n                StoreId: \"01H2144Y1J322A0H1Z0G6X85G3\", \/\/ Kendi Store ID'niz\n                Auth:    &credentials.Credentials{Method: credentials.None},\n            }\n            client, err := ofga.NewClient(config)\n            if err != nil {\n                log.Fatalf(\"openFGA istemcisi olu\u015fturulamad\u0131: %v\", err)\n            }\n            fgaClient = client\n\n            \/\/ Model y\u00fckleme ve ba\u015flang\u0131\u00e7 ili\u015fkilerini yazma init() fonksiyonunda yap\u0131labilir.\n            \/\/ Bu k\u0131s\u0131m tekrardan ka\u00e7\u0131nmak i\u00e7in makalede g\u00f6sterilmemi\u015ftir.\n        }\n\n        func completeTaskHandler(w http.ResponseWriter, r *http.Request) {\n            \/\/ Ger\u00e7ek uygulamada, kullan\u0131c\u0131 kimli\u011fi bir JWT token'dan veya session'dan al\u0131n\u0131r.\n            userID := \"user:john_doe\" \/\/ \u00d6rnek kullan\u0131c\u0131\n            taskID := \"task:feature_x\" \/\/ URL params veya request body'den al\u0131nan g\u00f6rev ID'si\n\n            checkRequest := ofga.ClientCheckRequest{\n                User:     userID,\n                Relation: \"complete_task\",\n                Object:   taskID,\n            }\n\n            checkResponse, err := fgaClient.Check(r.Context()).Body(checkRequest).Execute()\n            if err != nil {\n                http.Error(w, \"Yetkilendirme kontrol\u00fc ba\u015far\u0131s\u0131z: \"+err.Error(), http.StatusInternalServerError)\n                return\n            }\n\n            if !checkResponse.GetAllowed() {\n                http.Error(w, \"Yetkisiz eri\u015fim: G\u00f6revi tamamlama yetkiniz yok.\", http.StatusForbidden)\n                return\n            }\n\n            \/\/ Yetkilendirme ba\u015far\u0131l\u0131, g\u00f6revi tamamlama i\u015flemini ger\u00e7ekle\u015ftir\n            log.Printf(\"%s kullan\u0131c\u0131s\u0131 %s g\u00f6revini ba\u015far\u0131yla tamamlad\u0131.\", userID, taskID)\n            w.WriteHeader(http.StatusOK)\n            w.Write([]byte(\"G\u00f6rev ba\u015far\u0131yla tamamland\u0131.\"))\n        }\n\n        func main() {\n            http.HandleFunc(\"\/tasks\/{taskID}\/complete\", completeTaskHandler)\n            log.Fatal(http.ListenAndServe(\":8080\", nil))\n        }\n    <\/pre>\n<p><\/code><\/p>\n<p>Bu \u00f6rnekte, <code>completeTaskHandler<\/code> fonksiyonu, bir kullan\u0131c\u0131n\u0131n bir g\u00f6revi tamamlay\u0131p tamamlayamayaca\u011f\u0131n\u0131 belirlemek i\u00e7in openFGA'ya ba\u015fvurur. E\u011fer yetkilendirme motoru izin verirse, i\u015flem devam eder; aksi takdirde bir yetkisiz eri\u015fim hatas\u0131 d\u00f6nd\u00fcr\u00fcl\u00fcr.<\/p>\n<p>Bu vaka analizi, openFGA'n\u0131n \u00e7ok katmanl\u0131 ve dinamik bir SaaS uygulamas\u0131nda nas\u0131l g\u00fc\u00e7l\u00fc ve esnek bir yetkilendirme \u00e7\u00f6z\u00fcm\u00fc sundu\u011funu a\u00e7\u0131k\u00e7a g\u00f6stermektedir. Geli\u015ftiriciler, karma\u015f\u0131k yetkilendirme mant\u0131\u011f\u0131n\u0131 uygulaman\u0131n i\u015flevsel kodundan ay\u0131rarak, daha g\u00fcvenli, bak\u0131m\u0131 kolay ve \u00f6l\u00e7eklenebilir sistemler in\u015fa edebilirler.<\/p>\n<h2>Sonu\u00e7: Gelece\u011fin Yetkilendirme Stratejileri<\/h2>\n<p>Eri\u015fim kontrol\u00fc, modern uygulamalar\u0131n temel ta\u015flar\u0131ndan biridir ve uygulaman\u0131z\u0131n boyutu veya karma\u015f\u0131kl\u0131\u011f\u0131 ne olursa olsun, do\u011fru bir yetkilendirme stratejisi hayati \u00f6nem ta\u015f\u0131r. Geleneksel RBAC modelleri, ba\u015flang\u0131\u00e7ta cazip gelse de, dinamik ve ince taneli yetkilendirme gereksinimleriyle kar\u015f\u0131la\u015f\u0131ld\u0131\u011f\u0131nda h\u0131zla yetersiz kalabilir. Bu makalede g\u00f6rd\u00fc\u011f\u00fcm\u00fcz gibi, openFGA gibi ili\u015fki tabanl\u0131 yetkilendirme motorlar\u0131, bu zorluklar\u0131n \u00fcstesinden gelmek i\u00e7in g\u00fc\u00e7l\u00fc ve \u00f6l\u00e7eklenebilir bir \u00e7\u00f6z\u00fcm sunmaktad\u0131r.<\/p>\n<p>openFGA, Google'\u0131n Zanzibar prensiplerinden ilham alarak, \"kimin neye eri\u015fimi var?\" sorusunu merkezi ve tutarl\u0131 bir \u015fekilde cevaplama yetene\u011fi sa\u011flar. Go dilinin e\u015fzamanl\u0131l\u0131k ve performans avantajlar\u0131 ile birle\u015fti\u011finde, openFGA, mikroservis mimarilerinde veya b\u00fcy\u00fck \u00f6l\u00e7ekli SaaS uygulamalar\u0131nda bile h\u0131zl\u0131 ve g\u00fcvenilir yetkilendirme kararlar\u0131 alman\u0131z\u0131 m\u00fcmk\u00fcn k\u0131lar. Yetkilendirme mant\u0131\u011f\u0131n\u0131 uygulaman\u0131z\u0131n kod taban\u0131ndan ay\u0131rmak, geli\u015ftirici verimlili\u011fini art\u0131r\u0131rken, g\u00fcvenlik duru\u015funuzu g\u00fc\u00e7lendirir ve sisteminizin daha kolay denetlenebilir olmas\u0131n\u0131 sa\u011flar.<\/p>\n<p>openFGA'n\u0131n esnek DSL'i ve g\u00fc\u00e7l\u00fc API'leri sayesinde, statik rollere ba\u011fl\u0131 kalmaks\u0131z\u0131n, nesneler ve kullan\u0131c\u0131lar aras\u0131ndaki karma\u015f\u0131k ili\u015fkileri modelleyebilirsiniz. Bu da size, kullan\u0131c\u0131 gruplar\u0131, hiyerar\u015fik yap\u0131lar veya ko\u015fullu eri\u015fim gibi dinamik yetkilendirme senaryolar\u0131n\u0131 kolayca implemente etme \u00f6zg\u00fcrl\u00fc\u011f\u00fc verir. Performans ipu\u00e7lar\u0131yla birlikte, openFGA entegrasyonu Go sunucular\u0131n\u0131z\u0131n y\u00fck alt\u0131nda bile en iyi performans\u0131 g\u00f6stermesini sa\u011flayacakt\u0131r.<\/p>\n<p>Gelecekteki uygulama geli\u015ftirme projelerinizde yetkilendirmeyi d\u00fc\u015f\u00fcn\u00fcrken, openFGA ve Go kombinasyonunu de\u011ferlendirmek, \u015f\u00fcphesiz size daha g\u00fcvenli, daha esnek ve daha bak\u0131m\u0131 kolay bir sistem kurma yolunda \u00f6nemli avantajlar sa\u011flayacakt\u0131r. Art\u0131k yetkilendirme kabus olmaktan \u00e7\u0131k\u0131p, uygulaman\u0131z\u0131n g\u00fc\u00e7l\u00fc ve entegre bir par\u00e7as\u0131 haline gelebilir.<\/p>\n<h3>S\u0131k\u00e7a Sorulan Sorular (SSS)<\/h3>\n<dl>\n<dt>openFGA sadece RBAC i\u00e7in mi kullan\u0131l\u0131r?<\/dt>\n<dd>Hay\u0131r, openFGA \u00f6zellikle ReBAC (Relationship-Based Access Control) i\u00e7in tasarlanm\u0131\u015ft\u0131r. Ancak, RBAC asl\u0131nda ReBAC'\u0131n bir alt k\u00fcmesidir; \"kullan\u0131c\u0131, rol\u00fcn \u00fcyesidir\" gibi ili\u015fkiler tan\u0131mlayarak RBAC modelini kolayca uygulayabilirsiniz. openFGA, ayr\u0131ca ABAC (Attribute-Based Access Control) ve CBAC (Context-Based Access Control) gibi daha karma\u015f\u0131k yetkilendirme modellerini de ili\u015fkiler arac\u0131l\u0131\u011f\u0131yla modellemenize olanak tan\u0131r. Yani, RBAC yeteneklerini de kapsayan \u00e7ok daha esnek bir \u00e7\u00f6z\u00fcmd\u00fcr.<\/dd>\n<dt>openFGA'n\u0131n performans a\u00e7\u0131s\u0131ndan durumu nedir?<\/dt>\n<dd>openFGA, Google Zanzibar'dan ilham alan ve y\u00fcksek performans, d\u00fc\u015f\u00fck gecikme ve \u00f6l\u00e7eklenebilirlik i\u00e7in tasarlanm\u0131\u015f bir yetkilendirme motorudur. Da\u011f\u0131t\u0131k bir mimariye sahip olup, milyarlarca yetkilendirme sorgusunu saniyeler i\u00e7inde i\u015fleyebilme kapasitesine sahiptir. Optimize edilmi\u015f veri yap\u0131lar\u0131 ve sorgu mekanizmalar\u0131 sayesinde, b\u00fcy\u00fck \u00f6l\u00e7ekli ve y\u00fcksek trafikli uygulamalar i\u00e7in uygundur. Do\u011fru modelleme ve istemci taraf\u0131 \u00f6nbellekleme stratejileriyle performans\u0131 daha da art\u0131rabilirsiniz.<\/dd>\n<dt>openFGA di\u011fer yetkilendirme \u00e7\u00f6z\u00fcmlerinden fark\u0131 nedir?<\/dt>\n<dd>openFGA'y\u0131 di\u011fer \u00e7\u00f6z\u00fcmlerden ay\u0131ran temel \u00f6zellikler \u015funlard\u0131r: \u0130li\u015fki tabanl\u0131 model (ReBAC), Google Zanzibar'dan ilham alan kan\u0131tlanm\u0131\u015f bir mimari, a\u00e7\u0131k kaynakl\u0131 olmas\u0131, esnek ve anla\u015f\u0131l\u0131r DSL'i, da\u011f\u0131t\u0131k sistemler i\u00e7in tasarlanm\u0131\u015f \u00f6l\u00e7eklenebilirlik ve y\u00fcksek performans. Geleneksel RBAC \u00e7\u00f6z\u00fcmlerine k\u0131yasla daha ince taneli yetkilendirme ve dinamik ili\u015fki y\u00f6netimi sunar. Di\u011fer genel ama\u00e7l\u0131 yetkilendirme motorlar\u0131na k\u0131yasla ise, \u00f6zellikle ili\u015fkiler \u00fczerine odaklanarak daha basit ve g\u00fc\u00e7l\u00fc bir modelleme yakla\u015f\u0131m\u0131 sunar.<\/dd>\n<dt>Go d\u0131\u015f\u0131nda hangi dillerle openFGA kullanabilirim?<\/dt>\n<dd>openFGA, dil ba\u011f\u0131ms\u0131z bir yetkilendirme motorudur ve RESTful API ile gRPC aray\u00fczleri sunar. Bu sayede HTTP veya gRPC destekleyen herhangi bir programlama diliyle (Python, Java, Node.js, Ruby, C#, PHP vb.) entegre edilebilirsiniz. openFGA ekibi, Go, Node.js, .NET ve Python gibi pop\u00fcler diller i\u00e7in resmi SDK'lar sa\u011flamaktad\u0131r, bu da entegrasyonu olduk\u00e7a kolayla\u015ft\u0131r\u0131r.<\/dd>\n<dt>Kendi yetkilendirme sistemimi yazmak yerine neden openFGA kullanmal\u0131y\u0131m?<\/dt>\n<dd>Kendi yetkilendirme sisteminizi yazmak, genellikle g\u00f6r\u00fcnd\u00fc\u011f\u00fcnden \u00e7ok daha karma\u015f\u0131k ve riskli bir i\u015ftir. G\u00fcvenlik, performans, \u00f6l\u00e7eklenebilirlik, tutarl\u0131l\u0131k ve denetlenebilirlik gibi bir\u00e7ok boyutu vard\u0131r. openFGA gibi uzmanla\u015fm\u0131\u015f bir \u00e7\u00f6z\u00fcm kullanmak:<\/dd>\n<ul>\n<li><strong>G\u00fcvenlik Risklerini Azalt\u0131r:<\/strong> Kendi sisteminizi yazarken g\u00fcvenlik a\u00e7\u0131klar\u0131n\u0131 g\u00f6zden ka\u00e7\u0131rma olas\u0131l\u0131\u011f\u0131n\u0131z y\u00fcksektir. openFGA, g\u00fcvenlik uzmanlar\u0131 taraf\u0131ndan tasarlanm\u0131\u015f ve test edilmi\u015ftir.<\/li>\n<li><strong>Geli\u015ftirme S\u00fcresini K\u0131salt\u0131r:<\/strong> Yetkilendirme mant\u0131\u011f\u0131n\u0131 s\u0131f\u0131rdan yazmak yerine, openFGA'n\u0131n haz\u0131r \u00e7\u00f6z\u00fcmlerini kullanarak uygulaman\u0131z\u0131n temel i\u015f mant\u0131\u011f\u0131na odaklanabilirsiniz.<\/li>\n<li><strong>\u00d6l\u00e7eklenebilirlik Sa\u011flar:<\/strong> openFGA, y\u00fcksek y\u00fck alt\u0131nda bile performans\u0131 koruyacak \u015fekilde tasarlanm\u0131\u015ft\u0131r. Kendi \u00e7\u00f6z\u00fcm\u00fcn\u00fcz\u00fc bu \u00f6l\u00e7ekte test etmek ve optimize etmek \u00e7ok zaman alabilir.<\/li>\n<li><strong>Bak\u0131m Y\u00fck\u00fcn\u00fc Azalt\u0131r:<\/strong> Yetkilendirme mant\u0131\u011f\u0131n\u0131 merkezi bir servise devretmek, uygulaman\u0131z\u0131n kod taban\u0131n\u0131 basitle\u015ftirir ve bak\u0131m maliyetlerini d\u00fc\u015f\u00fcr\u00fcr.<\/li>\n<li><strong>Esneklik Sunar:<\/strong> openFGA'n\u0131n ili\u015fki tabanl\u0131 modeli, gelecekteki yetkilendirme gereksinimlerinize kolayca adapte olman\u0131z\u0131 sa\u011flar, bu da kendi statik \u00e7\u00f6z\u00fcm\u00fcn\u00fczle m\u00fcmk\u00fcn olmayabilir.<\/li>\n<\/ul>\n<\/dl>\n<p><\/body><\/p>\n","protected":false},"excerpt":{"rendered":"Modern uygulama geli\u015ftirme d\u00fcnyas\u0131nda, kullan\u0131c\u0131lar\u0131n sistem \u00fczerindeki yetkilerini y\u00f6netmek giderek daha karma\u015f\u0131k bir hal al\u0131yor. \u00d6zellikle mikroservis mimarileri&hellip;","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"csco_page_header_type":"","csco_page_load_nextpost":"","csco_page_subscribe_form":"","csco_page_contact_form":"","footnotes":""},"categories":[1],"tags":[],"class_list":{"0":"post-31881","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-genel","7":"cs-entry","8":"cs-video-wrap"},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.5 (Yoast SEO v25.3.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>openFGA ve Go Sunucular\u0131nda RBAC: Eri\u015fim Kontrol\u00fcn\u00fc Yeniden Tan\u0131mlamak<\/title>\n<meta name=\"description\" content=\"Modern uygulama geli\u015ftirme d\u00fcnyas\u0131nda, kullan\u0131c\u0131lar\u0131n sistem \u00fczerindeki yetkilerini y\u00f6netmek giderek daha karma\u015f\u0131k bir hal al\u0131yor. \u00d6zellikle mikroservis mimarileri ve da\u011f\u0131t\u0131k sistemlerin yayg\u0131nla\u015fmas\u0131yla birlikte, eri\u015fim kontrol\u00fc art\u0131k basit if-else bloklar\u0131yla halledilebilecek bir konu olmaktan \u00e7\u0131kt\u0131. Peki, bu karma\u015f\u0131kl\u0131\u011f\u0131n \u00fcstesinden nas\u0131l gelebiliriz? openFGA ve Go dilinin g\u00fcc\u00fcn\u00fc birle\u015ftirerek, dinamik ve \u00f6l\u00e7eklenebilir bir Role-Based Access Control (RBAC) sistemi kurman\u0131n yollar\u0131n\u0131 ke\u015ffedece\u011fiz. Bu makale, yetkilendirme konusundaki temel kavramlardan ba\u015flayarak, ger\u00e7ek d\u00fcnya senaryolar\u0131yla ad\u0131m ad\u0131m openFGA entegrasyonunu Go sunucular\u0131nda nas\u0131l ger\u00e7ekle\u015ftirece\u011finizi a\u00e7\u0131klayacak.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/fatihsoysal.com\/blog\/openfga-ve-go-sunucularinda-rbac-erisim-kontrolunu-yeniden-tanimlamak\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"openFGA ve Go Sunucular\u0131nda RBAC: Eri\u015fim Kontrol\u00fcn\u00fc Yeniden Tan\u0131mlamak\" \/>\n<meta property=\"og:description\" content=\"Modern uygulama geli\u015ftirme d\u00fcnyas\u0131nda, kullan\u0131c\u0131lar\u0131n sistem \u00fczerindeki yetkilerini y\u00f6netmek giderek daha karma\u015f\u0131k bir hal al\u0131yor. \u00d6zellikle mikroservis mimarileri ve da\u011f\u0131t\u0131k sistemlerin yayg\u0131nla\u015fmas\u0131yla birlikte, eri\u015fim kontrol\u00fc art\u0131k basit if-else bloklar\u0131yla halledilebilecek bir konu olmaktan \u00e7\u0131kt\u0131. Peki, bu karma\u015f\u0131kl\u0131\u011f\u0131n \u00fcstesinden nas\u0131l gelebiliriz? openFGA ve Go dilinin g\u00fcc\u00fcn\u00fc birle\u015ftirerek, dinamik ve \u00f6l\u00e7eklenebilir bir Role-Based Access Control (RBAC) sistemi kurman\u0131n yollar\u0131n\u0131 ke\u015ffedece\u011fiz. Bu makale, yetkilendirme konusundaki temel kavramlardan ba\u015flayarak, ger\u00e7ek d\u00fcnya senaryolar\u0131yla ad\u0131m ad\u0131m openFGA entegrasyonunu Go sunucular\u0131nda nas\u0131l ger\u00e7ekle\u015ftirece\u011finizi a\u00e7\u0131klayacak.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/openfga-ve-go-sunucularinda-rbac-erisim-kontrolunu-yeniden-tanimlamak\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-10-15T02:31:37+00:00\" \/>\n<meta name=\"author\" content=\"Fatih Soysal\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"Fatih Soysal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"29 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/openfga-ve-go-sunucularinda-rbac-erisim-kontrolunu-yeniden-tanimlamak\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/openfga-ve-go-sunucularinda-rbac-erisim-kontrolunu-yeniden-tanimlamak\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"openFGA ve Go Sunucular\u0131nda RBAC: Eri\u015fim Kontrol\u00fcn\u00fc Yeniden Tan\u0131mlamak\",\"datePublished\":\"2025-10-15T02:31:37+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/openfga-ve-go-sunucularinda-rbac-erisim-kontrolunu-yeniden-tanimlamak\/\"},\"wordCount\":4661,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/openfga-ve-go-sunucularinda-rbac-erisim-kontrolunu-yeniden-tanimlamak\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/openfga-ve-go-sunucularinda-rbac-erisim-kontrolunu-yeniden-tanimlamak\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/openfga-ve-go-sunucularinda-rbac-erisim-kontrolunu-yeniden-tanimlamak\/\",\"name\":\"openFGA ve Go Sunucular\u0131nda RBAC: Eri\u015fim Kontrol\u00fcn\u00fc Yeniden Tan\u0131mlamak\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-10-15T02:31:37+00:00\",\"description\":\"Modern uygulama geli\u015ftirme d\u00fcnyas\u0131nda, kullan\u0131c\u0131lar\u0131n sistem \u00fczerindeki yetkilerini y\u00f6netmek giderek daha karma\u015f\u0131k bir hal al\u0131yor. \u00d6zellikle mikroservis mimarileri ve da\u011f\u0131t\u0131k sistemlerin yayg\u0131nla\u015fmas\u0131yla birlikte, eri\u015fim kontrol\u00fc art\u0131k basit if-else bloklar\u0131yla halledilebilecek bir konu olmaktan \u00e7\u0131kt\u0131. Peki, bu karma\u015f\u0131kl\u0131\u011f\u0131n \u00fcstesinden nas\u0131l gelebiliriz? openFGA ve Go dilinin g\u00fcc\u00fcn\u00fc birle\u015ftirerek, dinamik ve \u00f6l\u00e7eklenebilir bir Role-Based Access Control (RBAC) sistemi kurman\u0131n yollar\u0131n\u0131 ke\u015ffedece\u011fiz. Bu makale, yetkilendirme konusundaki temel kavramlardan ba\u015flayarak, ger\u00e7ek d\u00fcnya senaryolar\u0131yla ad\u0131m ad\u0131m openFGA entegrasyonunu Go sunucular\u0131nda nas\u0131l ger\u00e7ekle\u015ftirece\u011finizi a\u00e7\u0131klayacak.\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/openfga-ve-go-sunucularinda-rbac-erisim-kontrolunu-yeniden-tanimlamak\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/openfga-ve-go-sunucularinda-rbac-erisim-kontrolunu-yeniden-tanimlamak\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/openfga-ve-go-sunucularinda-rbac-erisim-kontrolunu-yeniden-tanimlamak\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"openFGA ve Go Sunucular\u0131nda RBAC: Eri\u015fim Kontrol\u00fcn\u00fc Yeniden Tan\u0131mlamak\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/\",\"name\":\"Fatihsoysal.com\",\"description\":\"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim\",\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\",\"name\":\"Fatih Soysal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"contentUrl\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"width\":512,\"height\":512,\"caption\":\"Fatih Soysal\"},\"logo\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\"},\"description\":\"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"openFGA ve Go Sunucular\u0131nda RBAC: Eri\u015fim Kontrol\u00fcn\u00fc Yeniden Tan\u0131mlamak","description":"Modern uygulama geli\u015ftirme d\u00fcnyas\u0131nda, kullan\u0131c\u0131lar\u0131n sistem \u00fczerindeki yetkilerini y\u00f6netmek giderek daha karma\u015f\u0131k bir hal al\u0131yor. \u00d6zellikle mikroservis mimarileri ve da\u011f\u0131t\u0131k sistemlerin yayg\u0131nla\u015fmas\u0131yla birlikte, eri\u015fim kontrol\u00fc art\u0131k basit if-else bloklar\u0131yla halledilebilecek bir konu olmaktan \u00e7\u0131kt\u0131. Peki, bu karma\u015f\u0131kl\u0131\u011f\u0131n \u00fcstesinden nas\u0131l gelebiliriz? openFGA ve Go dilinin g\u00fcc\u00fcn\u00fc birle\u015ftirerek, dinamik ve \u00f6l\u00e7eklenebilir bir Role-Based Access Control (RBAC) sistemi kurman\u0131n yollar\u0131n\u0131 ke\u015ffedece\u011fiz. Bu makale, yetkilendirme konusundaki temel kavramlardan ba\u015flayarak, ger\u00e7ek d\u00fcnya senaryolar\u0131yla ad\u0131m ad\u0131m openFGA entegrasyonunu Go sunucular\u0131nda nas\u0131l ger\u00e7ekle\u015ftirece\u011finizi a\u00e7\u0131klayacak.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/fatihsoysal.com\/blog\/openfga-ve-go-sunucularinda-rbac-erisim-kontrolunu-yeniden-tanimlamak\/","og_locale":"tr_TR","og_type":"article","og_title":"openFGA ve Go Sunucular\u0131nda RBAC: Eri\u015fim Kontrol\u00fcn\u00fc Yeniden Tan\u0131mlamak","og_description":"Modern uygulama geli\u015ftirme d\u00fcnyas\u0131nda, kullan\u0131c\u0131lar\u0131n sistem \u00fczerindeki yetkilerini y\u00f6netmek giderek daha karma\u015f\u0131k bir hal al\u0131yor. \u00d6zellikle mikroservis mimarileri ve da\u011f\u0131t\u0131k sistemlerin yayg\u0131nla\u015fmas\u0131yla birlikte, eri\u015fim kontrol\u00fc art\u0131k basit if-else bloklar\u0131yla halledilebilecek bir konu olmaktan \u00e7\u0131kt\u0131. Peki, bu karma\u015f\u0131kl\u0131\u011f\u0131n \u00fcstesinden nas\u0131l gelebiliriz? openFGA ve Go dilinin g\u00fcc\u00fcn\u00fc birle\u015ftirerek, dinamik ve \u00f6l\u00e7eklenebilir bir Role-Based Access Control (RBAC) sistemi kurman\u0131n yollar\u0131n\u0131 ke\u015ffedece\u011fiz. Bu makale, yetkilendirme konusundaki temel kavramlardan ba\u015flayarak, ger\u00e7ek d\u00fcnya senaryolar\u0131yla ad\u0131m ad\u0131m openFGA entegrasyonunu Go sunucular\u0131nda nas\u0131l ger\u00e7ekle\u015ftirece\u011finizi a\u00e7\u0131klayacak.","og_url":"https:\/\/fatihsoysal.com\/blog\/openfga-ve-go-sunucularinda-rbac-erisim-kontrolunu-yeniden-tanimlamak\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-10-15T02:31:37+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"29 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/openfga-ve-go-sunucularinda-rbac-erisim-kontrolunu-yeniden-tanimlamak\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/openfga-ve-go-sunucularinda-rbac-erisim-kontrolunu-yeniden-tanimlamak\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"openFGA ve Go Sunucular\u0131nda RBAC: Eri\u015fim Kontrol\u00fcn\u00fc Yeniden Tan\u0131mlamak","datePublished":"2025-10-15T02:31:37+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/openfga-ve-go-sunucularinda-rbac-erisim-kontrolunu-yeniden-tanimlamak\/"},"wordCount":4661,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/openfga-ve-go-sunucularinda-rbac-erisim-kontrolunu-yeniden-tanimlamak\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/openfga-ve-go-sunucularinda-rbac-erisim-kontrolunu-yeniden-tanimlamak\/","url":"https:\/\/fatihsoysal.com\/blog\/openfga-ve-go-sunucularinda-rbac-erisim-kontrolunu-yeniden-tanimlamak\/","name":"openFGA ve Go Sunucular\u0131nda RBAC: Eri\u015fim Kontrol\u00fcn\u00fc Yeniden Tan\u0131mlamak","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-10-15T02:31:37+00:00","description":"Modern uygulama geli\u015ftirme d\u00fcnyas\u0131nda, kullan\u0131c\u0131lar\u0131n sistem \u00fczerindeki yetkilerini y\u00f6netmek giderek daha karma\u015f\u0131k bir hal al\u0131yor. \u00d6zellikle mikroservis mimarileri ve da\u011f\u0131t\u0131k sistemlerin yayg\u0131nla\u015fmas\u0131yla birlikte, eri\u015fim kontrol\u00fc art\u0131k basit if-else bloklar\u0131yla halledilebilecek bir konu olmaktan \u00e7\u0131kt\u0131. Peki, bu karma\u015f\u0131kl\u0131\u011f\u0131n \u00fcstesinden nas\u0131l gelebiliriz? openFGA ve Go dilinin g\u00fcc\u00fcn\u00fc birle\u015ftirerek, dinamik ve \u00f6l\u00e7eklenebilir bir Role-Based Access Control (RBAC) sistemi kurman\u0131n yollar\u0131n\u0131 ke\u015ffedece\u011fiz. Bu makale, yetkilendirme konusundaki temel kavramlardan ba\u015flayarak, ger\u00e7ek d\u00fcnya senaryolar\u0131yla ad\u0131m ad\u0131m openFGA entegrasyonunu Go sunucular\u0131nda nas\u0131l ger\u00e7ekle\u015ftirece\u011finizi a\u00e7\u0131klayacak.","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/openfga-ve-go-sunucularinda-rbac-erisim-kontrolunu-yeniden-tanimlamak\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/openfga-ve-go-sunucularinda-rbac-erisim-kontrolunu-yeniden-tanimlamak\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/openfga-ve-go-sunucularinda-rbac-erisim-kontrolunu-yeniden-tanimlamak\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"openFGA ve Go Sunucular\u0131nda RBAC: Eri\u015fim Kontrol\u00fcn\u00fc Yeniden Tan\u0131mlamak"}]},{"@type":"WebSite","@id":"https:\/\/fatihsoysal.com\/blog\/#website","url":"https:\/\/fatihsoysal.com\/blog\/","name":"Fatihsoysal.com","description":"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim","publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1","name":"Fatih Soysal","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","contentUrl":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","width":512,"height":512,"caption":"Fatih Soysal"},"logo":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/"},"description":"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.","url":"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/"}]}},"yoast_meta":{"yoast_wpseo_title":"","yoast_wpseo_metadesc":"","yoast_wpseo_canonical":""},"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/31881","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/comments?post=31881"}],"version-history":[{"count":0,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/31881\/revisions"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=31881"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=31881"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=31881"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}