{"id":42961,"date":"2026-06-30T21:13:55","date_gmt":"2026-06-30T18:13:55","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/go-ile-rol-tabanli-erisim-kontrolu-rbac-nasil-uygulanir\/"},"modified":"2026-06-30T21:14:22","modified_gmt":"2026-06-30T18:14:22","slug":"go-ile-rol-tabanli-erisim-kontrolu-rbac-nasil-uygulanir","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/go-ile-rol-tabanli-erisim-kontrolu-rbac-nasil-uygulanir\/","title":{"rendered":"Go ile Rol Tabanl\u0131 Eri\u015fim Kontrol\u00fc (RBAC) Nas\u0131l Uygulan\u0131r?"},"content":{"rendered":"<h2>Go ile Rol Tabanl\u0131 Eri\u015fim Kontrol\u00fc (RBAC) Nas\u0131l Uygulan\u0131r?<\/h2>\n<p>Modern web uygulamalar\u0131, kullan\u0131c\u0131lar\u0131na \u00e7e\u015fitli i\u015flevsellikler sunarken, ayn\u0131 zamanda hassas verilere ve kritik i\u015flemlere eri\u015fimi s\u0131k\u0131 bir \u015fekilde kontrol etmek zorundad\u0131r. Kullan\u0131c\u0131lar\u0131n yetkileri karma\u015f\u0131kla\u015ft\u0131k\u00e7a, her bir kullan\u0131c\u0131n\u0131n tek tek yetkilendirilmesi y\u00f6netilemez bir hal al\u0131r. Peki, uygulaman\u0131z\u0131n g\u00fcvenli\u011fini ve y\u00f6netilebilirli\u011fini art\u0131rmak i\u00e7in hangi yetkilendirme modelini tercih etmelisiniz? \u0130\u015fte bu noktada Rol Tabanl\u0131 Eri\u015fim Kontrol\u00fc (RBAC), g\u00fc\u00e7l\u00fc ve esnek bir \u00e7\u00f6z\u00fcm olarak kar\u015f\u0131m\u0131za \u00e7\u0131k\u0131yor. Go dilinin performans ve basitlik avantajlar\u0131yla birle\u015fti\u011finde, sa\u011flam ve \u00f6l\u00e7eklenebilir bir RBAC sistemi kurmak m\u00fcmk\u00fcn hale gelir. Bu makalede, Go ile ad\u0131m ad\u0131m RBAC uygulamalar\u0131n\u0131, temel kavramlardan ileri seviye entegrasyonlara kadar derinlemesine inceleyece\u011fiz.<\/p>\n<h3>Neden Uygulamalar\u0131m\u0131zda Sa\u011flam Bir Yetkilendirme Mekanizmas\u0131na \u0130htiya\u00e7 Duyar\u0131z?<\/h3>\n<p>G\u00fcn\u00fcm\u00fcz\u00fcn dijital d\u00fcnyas\u0131nda, veri g\u00fcvenli\u011fi ve gizlili\u011fi her zamankinden daha kritik bir \u00f6neme sahiptir. E-ticaret sitelerinden bankac\u0131l\u0131k uygulamalar\u0131na, sa\u011fl\u0131k platformlar\u0131ndan kurumsal y\u00f6netim sistemlerine kadar her alanda, kullan\u0131c\u0131lar\u0131n sadece yetkili olduklar\u0131 kaynaklara eri\u015fmesi ve belirli eylemleri ger\u00e7ekle\u015ftirmesi esast\u0131r. Yanl\u0131\u015f yap\u0131land\u0131r\u0131lm\u0131\u015f bir yetkilendirme sistemi, hassas verilerin a\u00e7\u0131\u011fa \u00e7\u0131kmas\u0131na, yetkisiz i\u015flemlerin yap\u0131lmas\u0131na ve hatta ciddi g\u00fcvenlik ihlallerine yol a\u00e7abilir. \u00d6rne\u011fin, bir e-ticaret platformunda, sadece y\u00f6neticilerin \u00fcr\u00fcn fiyatlar\u0131n\u0131 de\u011fi\u015ftirebilmesi, sat\u0131\u015f temsilcilerinin sipari\u015fleri g\u00f6rebilmesi ancak fatura d\u00fczenleyememesi, m\u00fc\u015fterilerin ise sadece kendi sipari\u015f ge\u00e7mi\u015flerini g\u00f6r\u00fcnt\u00fcleyebilmesi gerekir. Bu t\u00fcr senaryolarda, her bir kullan\u0131c\u0131ya \u00f6zel yetkiler tan\u0131mlamak yerine, benzer yetkilere sahip kullan\u0131c\u0131lar\u0131 grupland\u0131rarak y\u00f6netmek \u00e7ok daha pratik ve g\u00fcvenlidir.<\/p>\n<p>Yetkilendirme mekanizmalar\u0131n\u0131n temel amac\u0131, kimlik do\u011frulama (authentication) sonras\u0131, bir kullan\u0131c\u0131n\u0131n veya sistemin belirli bir kayna\u011fa (resource) veya i\u015fleme (action) eri\u015fim izninin olup olmad\u0131\u011f\u0131n\u0131 belirlemektir. Bu, &#8220;Kimsin?&#8221; sorusundan sonra gelen &#8220;Neler yapabilirsin?&#8221; sorusunun cevab\u0131d\u0131r. Go gibi modern, performans odakl\u0131 bir dilde bu mekanizmalar\u0131 uygulamak, uygulaman\u0131z\u0131n hem h\u0131zl\u0131 hem de g\u00fcvenli olmas\u0131n\u0131 sa\u011flar. Do\u011fru bir yetkilendirme sistemi, geli\u015ftirme s\u00fcrecini basitle\u015ftirir, g\u00fcvenlik a\u00e7\u0131klar\u0131n\u0131 azalt\u0131r ve uygulaman\u0131n uzun vadeli bak\u0131m\u0131n\u0131 kolayla\u015ft\u0131r\u0131r. Ayr\u0131ca, uygulaman\u0131n b\u00fcy\u00fcmesi ve yeni \u00f6zelliklerin eklenmesiyle birlikte ortaya \u00e7\u0131kabilecek yetki karma\u015fas\u0131n\u0131n \u00f6n\u00fcne ge\u00e7erek, \u00f6l\u00e7eklenebilir bir yap\u0131 sunar. Bu ba\u011flamda, Rol Tabanl\u0131 Eri\u015fim Kontrol\u00fc (RBAC), bu ihtiya\u00e7lar\u0131 kar\u015f\u0131lamak i\u00e7in en yayg\u0131n ve etkili modellerden biri olarak \u00f6ne \u00e7\u0131kar.<\/p>\n<h3>Rol Tabanl\u0131 Eri\u015fim Kontrol\u00fc (RBAC) Nedir ve Temel Kavramlar\u0131 Nelerdir?<\/h3>\n<p>Rol Tabanl\u0131 Eri\u015fim Kontrol\u00fc (RBAC), yetkilendirme y\u00f6netimini basitle\u015ftiren ve daha esnek hale getiren bir g\u00fcvenlik modelidir. Temel prensibi, bireysel kullan\u0131c\u0131lar yerine rollere yetkiler atamak ve ard\u0131ndan bu rolleri kullan\u0131c\u0131lara atamakt\u0131r. Bu sayede, bir kullan\u0131c\u0131n\u0131n yetkileri, sahip oldu\u011fu rollere g\u00f6re belirlenir. RBAC, \u00f6zellikle orta ve b\u00fcy\u00fck \u00f6l\u00e7ekli uygulamalarda, y\u00fczlerce veya binlerce kullan\u0131c\u0131n\u0131n ve y\u00fczlerce farkl\u0131 yetkinin oldu\u011fu durumlarda y\u00f6netim y\u00fck\u00fcn\u00fc \u00f6nemli \u00f6l\u00e7\u00fcde azalt\u0131r. \u00d6rne\u011fin, bir \u015firkette &#8220;\u0130nsan Kaynaklar\u0131 Uzman\u0131&#8221; rol\u00fcne sahip bir ki\u015fi, otomatik olarak \u0130K mod\u00fcl\u00fcndeki \u00e7al\u0131\u015fan bilgilerini g\u00f6r\u00fcnt\u00fcleme, d\u00fczenleme ve silme yetkilerine sahip olur. Yeni bir \u0130K uzman\u0131 i\u015fe al\u0131nd\u0131\u011f\u0131nda, ona sadece &#8220;\u0130nsan Kaynaklar\u0131 Uzman\u0131&#8221; rol\u00fc atan\u0131r ve t\u00fcm ilgili yetkiler otomatik olarak devredilmi\u015f olur.<\/p>\n<p>RBAC modelinin temel bile\u015fenleri \u015funlard\u0131r:<\/p>\n<ul>\n<li><strong>Kullan\u0131c\u0131lar (Users):<\/strong> Uygulamay\u0131 kullanan bireyler veya sistemler. Her kullan\u0131c\u0131, bir veya birden fazla role atanabilir.<\/li>\n<li><strong>Roller (Roles):<\/strong> Belirli bir i\u015f fonksiyonunu veya sorumluluk k\u00fcmesini temsil eden mant\u0131ksal gruplard\u0131r. \u00d6rne\u011fin, &#8220;Y\u00f6netici&#8221;, &#8220;Edit\u00f6r&#8221;, &#8220;M\u00fc\u015fteri&#8221;, &#8220;Destek Personeli&#8221; gibi roller tan\u0131mlanabilir. Roller, do\u011frudan yetkilere sahiptir.<\/li>\n<li><strong>Yetkiler\/\u0130zinler (Permissions):<\/strong> Bir kullan\u0131c\u0131n\u0131n belirli bir kaynak \u00fczerinde ger\u00e7ekle\u015ftirebilece\u011fi eylemleri tan\u0131mlar. \u00d6rne\u011fin, &#8220;\u00fcr\u00fcnleri g\u00f6r\u00fcnt\u00fcle&#8221;, &#8220;sipari\u015fleri d\u00fczenle&#8221;, &#8220;kullan\u0131c\u0131 olu\u015ftur&#8221; gibi yetkiler olabilir. Yetkiler genellikle bir kaynak (\u00f6rne\u011fin, <code>\/api\/v1\/products<\/code>) ve bir eylem (\u00f6rne\u011fin, <code>GET<\/code>, <code>POST<\/code>, <code>PUT<\/code>, <code>DELETE<\/code>) kombinasyonu olarak ifade edilir.<\/li>\n<li><strong>Oturumlar (Sessions):<\/strong> Bir kullan\u0131c\u0131n\u0131n uygulamaya giri\u015f yapt\u0131\u011f\u0131nda aktif olan rolleri ve dolay\u0131s\u0131yla yetkilerini ifade eder. \u00c7o\u011fu RBAC uygulamas\u0131nda bu kavram \u00f6rt\u00fck olarak y\u00f6netilir.<\/li>\n<\/ul>\n<p>RBAC&#8217;\u0131n en b\u00fcy\u00fck avantajlar\u0131ndan biri, y\u00f6netim kolayl\u0131\u011f\u0131d\u0131r. Bir kullan\u0131c\u0131n\u0131n yetkileri de\u011fi\u015fti\u011finde, sadece kullan\u0131c\u0131n\u0131n rolleri g\u00fcncellenir. Bir yetki k\u00fcmesi de\u011fi\u015fti\u011finde ise, sadece ilgili rol\u00fcn yetkileri g\u00fcncellenir ve bu de\u011fi\u015fiklik o role sahip t\u00fcm kullan\u0131c\u0131lar\u0131 etkiler. Bu, Eri\u015fim Kontrol Listeleri (ACL) gibi daha eski modellere k\u0131yasla \u00e7ok daha verimli bir yakla\u015f\u0131md\u0131r. ACL&#8217;de, her bir kaynak i\u00e7in hangi kullan\u0131c\u0131lar\u0131n hangi eylemleri yapabilece\u011fi tek tek listelenir, bu da b\u00fcy\u00fck sistemlerde karma\u015f\u0131kl\u0131\u011fa yol a\u00e7ar. RBAC, bu karma\u015f\u0131kl\u0131\u011f\u0131 soyutlama (abstraction) yoluyla giderir, b\u00f6ylece g\u00fcvenlik politikalar\u0131 daha anla\u015f\u0131l\u0131r ve y\u00f6netilebilir hale gelir. Go ile RBAC uygularken bu temel kavramlar\u0131 iyi anlamak, sa\u011flam bir temel olu\u015fturman\u0131za yard\u0131mc\u0131 olacakt\u0131r.<\/p>\n<h3>Go ile Basit Bir RBAC Sistemi Nas\u0131l Tasarlan\u0131r ve Uygulan\u0131r?<\/h3>\n<p>Go ile bir RBAC sistemi tasarlarken, \u00f6ncelikle temel bile\u015fenleri (Kullan\u0131c\u0131, Rol, Yetki) Go&#8217;nun <code>struct<\/code> yap\u0131lar\u0131yla modellememiz gerekir. Basit bir ba\u015flang\u0131\u00e7 i\u00e7in, yetkileri ve rolleri bellekte tutabiliriz. Daha sonra bu yap\u0131y\u0131 veritaban\u0131 entegrasyonu ile kal\u0131c\u0131 hale getirece\u011fiz. \u0130lk ad\u0131m olarak, yetki ve rol tan\u0131mlar\u0131m\u0131z\u0131 yapal\u0131m. Yetkileri genellikle bir dize (string) olarak ifade ederiz, \u00f6rne\u011fin &#8220;\u00fcr\u00fcnleri_g\u00f6r\u00fcnt\u00fcle&#8221; veya &#8220;sipari\u015fleri_d\u00fczenle&#8221;. Roller ise bu yetkilerin bir koleksiyonudur.<\/p>\n<div class=\"code-container\">\n<pre><code>package rbac\n\nimport (\n    \"sync\"\n)\n\n\/\/ Permission tipi, bir yetkiyi temsil eder.\ntype Permission string\n\n\/\/ Role struct'\u0131, bir rol\u00fc ve sahip oldu\u011fu yetkileri tutar.\ntype Role struct {\n    Name        string\n    Permissions map[Permission]bool \/\/ H\u0131zl\u0131 arama i\u00e7in map kullan\u0131yoruz\n}\n\n\/\/ User struct'\u0131, bir kullan\u0131c\u0131y\u0131 ve sahip oldu\u011fu rolleri tutar.\ntype User struct {\n    ID    string\n    Roles []*Role\n}\n\n\/\/ RBACManager, t\u00fcm rolleri ve kullan\u0131c\u0131lar\u0131 y\u00f6neten ana yap\u0131d\u0131r.\ntype RBACManager struct {\n    roles map[string]*Role \/\/ Rol isimlerine g\u00f6re rolleri tutar\n    mu    sync.RWMutex     \/\/ E\u015fzamanl\u0131 eri\u015fim i\u00e7in mutex\n}\n\n\/\/ NewRBACManager yeni bir RBAC y\u00f6neticisi olu\u015fturur.\nfunc NewRBACManager() *RBACManager {\n    return &RBACManager{\n        roles: make(map[string]*Role),\n    }\n}\n\n\/\/ AddRole yeni bir rol ekler.\nfunc (m *RBACManager) AddRole(roleName string, permissions []Permission) *Role {\n    m.mu.Lock()\n    defer m.mu.Unlock()\n\n    if _, exists := m.roles[roleName]; exists {\n        return m.roles[roleName] \/\/ Rol zaten varsa, mevcut rol\u00fc d\u00f6nd\u00fcr\n    }\n\n    permsMap := make(map[Permission]bool)\n    for _, p := range permissions {\n        permsMap[p] = true\n    }\n\n    newRole := &Role{\n        Name:        roleName,\n        Permissions: permsMap,\n    }\n    m.roles[roleName] = newRole\n    return newRole\n}\n\n\/\/ GetRole bir rol\u00fc ismine g\u00f6re getirir.\nfunc (m *RBACManager) GetRole(roleName string) *Role {\n    m.mu.RLock()\n    defer m.mu.RUnlock()\n    return m.roles[roleName]\n}\n\n\/\/ HasPermission, bir kullan\u0131c\u0131n\u0131n belirli bir yetkiye sahip olup olmad\u0131\u011f\u0131n\u0131 kontrol eder.\nfunc (u *User) HasPermission(permission Permission) bool {\n    for _, role := range u.Roles {\n        if role != nil && role.Permissions[permission] {\n            return true\n        }\n    }\n    return false\n}\n\n\/\/ AssignRoleToUser, bir kullan\u0131c\u0131ya rol atar.\nfunc (u *User) AssignRole(role *Role) {\n    if role == nil {\n        return\n    }\n    \/\/ Rol\u00fcn zaten atan\u0131p atanmad\u0131\u011f\u0131n\u0131 kontrol et\n    for _, existingRole := range u.Roles {\n        if existingRole.Name == role.Name {\n            return\n        }\n    }\n    u.Roles = append(u.Roles, role)\n}\n\n\/\/ RevokeRoleFromUser, bir kullan\u0131c\u0131n\u0131n rol\u00fcn\u00fc geri al\u0131r.\nfunc (u *User) RevokeRole(roleName string) {\n    var updatedRoles []*Role\n    for _, role := range u.Roles {\n        if role.Name != roleName {\n            updatedRoles = append(updatedRoles, role)\n        }\n    }\n    u.Roles = updatedRoles\n}\n<\/code><\/pre>\n<\/p><\/div>\n<p>Yukar\u0131daki kod blo\u011funda, <code>Permission<\/code>, <code>Role<\/code>, <code>User<\/code> ve <code>RBACManager<\/code> yap\u0131lar\u0131n\u0131 tan\u0131mlad\u0131k. <code>RBACManager<\/code>, t\u00fcm rolleri y\u00f6netirken, <code>User<\/code> yap\u0131s\u0131 atanm\u0131\u015f rolleri tutar. <code>HasPermission<\/code> metodu, bir kullan\u0131c\u0131n\u0131n belirli bir yetkiye sahip olup olmad\u0131\u011f\u0131n\u0131 kontrol etmenin ana mant\u0131\u011f\u0131n\u0131 i\u00e7erir. Bu metot, kullan\u0131c\u0131n\u0131n sahip oldu\u011fu t\u00fcm rolleri iter ve herhangi bir rol\u00fcn istenen yetkiye sahip olup olmad\u0131\u011f\u0131n\u0131 kontrol eder. E\u015fzamanl\u0131 eri\u015fim i\u00e7in <code>sync.RWMutex<\/code> kullanarak <code>RBACManager<\/code> \u00fczerindeki okuma\/yazma i\u015flemlerini g\u00fcvence alt\u0131na ald\u0131k. Bu basit yap\u0131, Go ile RBAC&#8217;\u0131n temelini olu\u015fturur ve uygulaman\u0131z\u0131n yetkilendirme ihtiya\u00e7lar\u0131n\u0131 kar\u015f\u0131lamak i\u00e7in bir ba\u015flang\u0131\u00e7 noktas\u0131 sa\u011flar. Bu in-memory (bellek i\u00e7i) \u00e7\u00f6z\u00fcm, k\u00fc\u00e7\u00fck \u00f6l\u00e7ekli uygulamalar veya test ortamlar\u0131 i\u00e7in yeterli olabilir, ancak ger\u00e7ek d\u00fcnya senaryolar\u0131nda verilerin kal\u0131c\u0131 olmas\u0131 gerekir.<\/p>\n<h3>RBAC Verilerini Kal\u0131c\u0131 Hale Getirme ve Veritaban\u0131 Entegrasyonu Nas\u0131l Yap\u0131l\u0131r?<\/h3>\n<p>Ger\u00e7ek d\u00fcnya uygulamalar\u0131nda, RBAC verilerinin (kullan\u0131c\u0131lar, roller, yetkiler ve bu aras\u0131ndaki ili\u015fkiler) uygulaman\u0131n yeniden ba\u015flat\u0131lmas\u0131 durumunda kaybolmamas\u0131 i\u00e7in kal\u0131c\u0131 bir depolama alan\u0131na ihtiya\u00e7 duyar\u0131z. Genellikle bu, bir ili\u015fkisel veritaban\u0131 (PostgreSQL, MySQL vb.) veya NoSQL veritaban\u0131 (MongoDB, Redis vb.) kullan\u0131larak sa\u011flan\u0131r. \u0130li\u015fkisel veritabanlar\u0131, RBAC&#8217;\u0131n hiyerar\u015fik ve ili\u015fkisel yap\u0131s\u0131n\u0131 modellemek i\u00e7in olduk\u00e7a uygundur. Go&#8217;da veritaban\u0131 i\u015flemleri i\u00e7in <code>database\/sql<\/code> paketi veya ORM (Object-Relational Mapping) k\u00fct\u00fcphaneleri (\u00f6rne\u011fin, GORM) kullan\u0131labilir. Bu b\u00f6l\u00fcmde, GORM kullanarak temel bir veritaban\u0131 \u015femas\u0131n\u0131 ve entegrasyonunu ele alaca\u011f\u0131z.<\/p>\n<p>\u00d6ncelikle, veritaban\u0131nda saklayaca\u011f\u0131m\u0131z modelleri tan\u0131mlayal\u0131m:<\/p>\n<div class=\"code-container\">\n<pre><code>package models\n\nimport (\n    \"gorm.io\/gorm\"\n)\n\n\/\/ Permission modeli\ntype Permission struct {\n    gorm.Model\n    Name string <code>gorm:&quot;uniqueIndex&quot;<\/code>\n}\n\n\/\/ Role modeli\ntype Role struct {\n    gorm.Model\n    Name        string         <code>gorm:&quot;uniqueIndex&quot;<\/code>\n    Permissions []Permission <code>gorm:&quot;many2many:role_permissions;&quot;<\/code>\n}\n\n\/\/ User modeli\ntype User struct {\n    gorm.Model\n    Username string <code>gorm:&quot;uniqueIndex&quot;<\/code>\n    Password string\n    Roles    []Role <code>gorm:&quot;many2many:user_roles;&quot;<\/code>\n}\n<\/code><\/pre>\n<\/p><\/div>\n<p>Yukar\u0131daki GORM modelleri, RBAC&#8217;\u0131n temel bile\u015fenlerini temsil eder. <code>gorm.Model<\/code>, her tablo i\u00e7in otomatik olarak <code>ID<\/code>, <code>CreatedAt<\/code>, <code>UpdatedAt<\/code> ve <code>DeletedAt<\/code> alanlar\u0131n\u0131 ekler. <code>many2many<\/code> etiketleri, Go&#8217;da GORM&#8217;un ara tablolar (pivot tables) olu\u015fturarak \u00e7oktan \u00e7o\u011fa ili\u015fkileri y\u00f6netmesini sa\u011flar. \u00d6rne\u011fin, bir kullan\u0131c\u0131n\u0131n birden fazla rol\u00fc olabilir ve bir rol birden fazla kullan\u0131c\u0131ya atanabilir (<code>user_roles<\/code> tablosu). Ayn\u0131 \u015fekilde, bir rol\u00fcn birden fazla yetkisi olabilir ve bir yetki birden fazla role atanabilir (<code>role_permissions<\/code> tablosu).<\/p>\n<p>Veritaban\u0131 ba\u011flant\u0131s\u0131 ve migrasyon (ge\u00e7i\u015f) i\u015flemleri ise \u015fu \u015fekilde yap\u0131labilir:<\/p>\n<div class=\"code-container\">\n<pre><code>package database\n\nimport (\n    \"fmt\"\n    \"log\"\n    \"rbactutorial\/models\" \/\/ Kendi modellerinizi import edin\n\n    \"gorm.io\/driver\/postgres\" \/\/ PostgreSQL i\u00e7in\n    \"gorm.io\/gorm\"\n)\n\nvar DB *gorm.DB\n\nfunc InitDB() {\n    dsn := \"host=localhost user=gorm password=gorm dbname=gorm port=5432 sslmode=disable TimeZone=Asia\/Istanbul\"\n    var err error\n    DB, err = gorm.Open(postgres.Open(dsn), &gorm.Config{})\n    if err != nil {\n        log.Fatalf(\"Veritaban\u0131 ba\u011flant\u0131s\u0131 kurulamad\u0131: %v\", err)\n    }\n\n    fmt.Println(\"Veritaban\u0131 ba\u011flant\u0131s\u0131 ba\u015far\u0131l\u0131!\")\n\n    \/\/ Otomatik migrasyon\n    err = DB.AutoMigrate(&models.User{}, &models.Role{}, &models.Permission{})\n    if err != nil {\n        log.Fatalf(\"Veritaban\u0131 migrasyonu ba\u015far\u0131s\u0131z: %v\", err)\n    }\n    fmt.Println(\"Veritaban\u0131 migrasyonu tamamland\u0131.\")\n\n    \/\/ \u00d6rnek veriler (opsiyonel)\n    seedData()\n}\n\nfunc seedData() {\n    \/\/ Yetkiler\n    viewProducts := models.Permission{Name: \"view_products\"}\n    createProducts := models.Permission{Name: \"create_products\"}\n    editProducts := models.Permission{Name: \"edit_products\"}\n    deleteProducts := models.Permission{Name: \"delete_products\"}\n    manageUsers := models.Permission{Name: \"manage_users\"}\n\n    DB.FirstOrCreate(&viewProducts, models.Permission{Name: \"view_products\"})\n    DB.FirstOrCreate(&createProducts, models.Permission{Name: \"create_products\"})\n    DB.FirstOrCreate(&editProducts, models.Permission{Name: \"edit_products\"})\n    DB.FirstOrCreate(&deleteProducts, models.Permission{Name: \"delete_products\"})\n    DB.FirstOrCreate(&manageUsers, models.Permission{Name: \"manage_users\"})\n\n    \/\/ Roller\n    adminRole := models.Role{Name: \"admin\", Permissions: []models.Permission{viewProducts, createProducts, editProducts, deleteProducts, manageUsers}}\n    editorRole := models.Role{Name: \"editor\", Permissions: []models.Permission{viewProducts, createProducts, editProducts}}\n    viewerRole := models.Role{Name: \"viewer\", Permissions: []models.Permission{viewProducts}}\n\n    DB.FirstOrCreate(&adminRole, models.Role{Name: \"admin\"})\n    DB.Model(&adminRole).Association(\"Permissions\").Replace(&adminRole.Permissions)\n\n    DB.FirstOrCreate(&editorRole, models.Role{Name: \"editor\"})\n    DB.Model(&editorRole).Association(\"Permissions\").Replace(&editorRole.Permissions)\n\n    DB.FirstOrCreate(&viewerRole, models.Role{Name: \"viewer\"})\n    DB.Model(&viewerRole).Association(\"Permissions\").Replace(&viewerRole.Permissions)\n\n    \/\/ Kullan\u0131c\u0131lar\n    adminUser := models.User{Username: \"admin\", Password: \"hashedpassword\", Roles: []models.Role{adminRole}}\n    editorUser := models.User{Username: \"editor\", Password: \"hashedpassword\", Roles: []models.Role{editorRole}}\n    viewerUser := models.User{Username: \"viewer\", Password: \"hashedpassword\", Roles: []models.Role{viewerRole}}\n\n    DB.FirstOrCreate(&adminUser, models.User{Username: \"admin\"})\n    DB.Model(&adminUser).Association(\"Roles\").Replace(&adminUser.Roles)\n\n    DB.FirstOrCreate(&editorUser, models.User{Username: \"editor\"})\n    DB.Model(&editorUser).Association(\"Roles\").Replace(&editorUser.Roles)\n\n    DB.FirstOrCreate(&viewerUser, models.User{Username: \"viewer\"})\n    DB.Model(&viewerUser).Association(\"Roles\").Replace(&viewerUser.Roles)\n}\n<\/code><\/pre>\n<\/p><\/div>\n<p>Bu <code>InitDB<\/code> fonksiyonu, veritaban\u0131na ba\u011flan\u0131r, modelleri otomatik olarak migre eder (tablolar\u0131 olu\u015fturur) ve iste\u011fe ba\u011fl\u0131 olarak ba\u015flang\u0131\u00e7 verilerini (roller, yetkiler, kullan\u0131c\u0131lar) ekler. Ger\u00e7ek bir uygulamada, \u015fifrelerin hashlenmesi gerekti\u011fini unutmay\u0131n (\u00f6rne\u011fin, <code>bcrypt<\/code> kullanarak). Bu yap\u0131 sayesinde, uygulaman\u0131z her ba\u015flad\u0131\u011f\u0131nda RBAC verileri veritaban\u0131ndan y\u00fcklenebilir ve kal\u0131c\u0131 olarak saklanabilir. Art\u0131k Go uygulamam\u0131z, kullan\u0131c\u0131lar\u0131n rollerini ve yetkilerini veritaban\u0131ndan dinamik olarak \u00e7ekebilir. Bu, daha \u00f6nce bellekte tuttu\u011fumuz RBACManager mant\u0131\u011f\u0131n\u0131 veritaban\u0131 \u00fczerinde \u00e7al\u0131\u015facak \u015fekilde geni\u015fletmemiz gerekti\u011fi anlam\u0131na gelir. Sonraki ad\u0131mda, bu yetkilendirme kontrol\u00fcn\u00fc web uygulamam\u0131z\u0131n HTTP isteklerine nas\u0131l entegre edece\u011fimize bakaca\u011f\u0131z.<\/p>\n<h3>Go Web Uygulamalar\u0131nda RBAC Middleware Entegrasyonu ve Ger\u00e7ek D\u00fcnya Senaryolar\u0131<\/h3>\n<p>RBAC sistemimizi veritaban\u0131 ile kal\u0131c\u0131 hale getirdikten sonra, bu yetkilendirme kontrol\u00fcn\u00fc Go web uygulamam\u0131z\u0131n HTTP isteklerine entegre etmemiz gerekir. Bu genellikle bir &#8220;middleware&#8221; (ara yaz\u0131l\u0131m) kullan\u0131larak yap\u0131l\u0131r. Middleware, bir HTTP iste\u011fi hedef i\u015fleyiciye ula\u015fmadan \u00f6nce veya ula\u015ft\u0131ktan sonra belirli i\u015flemleri ger\u00e7ekle\u015ftiren bir yaz\u0131l\u0131m katman\u0131d\u0131r. Go&#8217;da pop\u00fcler web framework&#8217;leri (Gin, Echo, Fiber vb.) middleware deste\u011fi sunar. Bu b\u00f6l\u00fcmde, Gin framework&#8217;\u00fcn\u00fc kullanarak bir RBAC middleware&#8217;\u0131 nas\u0131l olu\u015fturaca\u011f\u0131m\u0131z\u0131 ve ger\u00e7ek d\u00fcnya senaryolar\u0131nda nas\u0131l kullanaca\u011f\u0131m\u0131z\u0131 inceleyece\u011fiz.<\/p>\n<p>\u00d6ncelikle, bir kullan\u0131c\u0131n\u0131n belirli bir yetkiye sahip olup olmad\u0131\u011f\u0131n\u0131 kontrol eden bir yard\u0131mc\u0131 fonksiyona ihtiyac\u0131m\u0131z var. Bu fonksiyon, veritaban\u0131ndan kullan\u0131c\u0131n\u0131n rollerini ve bu rollerin yetkilerini \u00e7ekerek kontrol\u00fc yapacakt\u0131r:<\/p>\n<div class=\"code-container\">\n<pre><code>package rbac\n\nimport (\n    \"rbactutorial\/database\"\n    \"rbactutorial\/models\"\n\n    \"gorm.io\/gorm\"\n)\n\n\/\/ CheckPermission, bir kullan\u0131c\u0131n\u0131n belirli bir yetkiye sahip olup olmad\u0131\u011f\u0131n\u0131 kontrol eder.\nfunc CheckPermission(userID uint, requiredPermission string) (bool, error) {\n    var user models.User\n    \/\/ Kullan\u0131c\u0131y\u0131 rolleri ve rollerin yetkileriyle birlikte y\u00fckle\n    err := database.DB.Preload(\"Roles.Permissions\").First(&user, userID).Error\n    if err != nil {\n        if err == gorm.ErrRecordNotFound {\n            return false, nil \/\/ Kullan\u0131c\u0131 bulunamad\u0131\n        }\n        return false, err\n    }\n\n    for _, role := range user.Roles {\n        for _, perm := range role.Permissions {\n            if perm.Name == requiredPermission {\n                return true, nil\n            }\n        }\n    }\n    return false, nil\n}\n<\/code><\/pre>\n<\/p><\/div>\n<p>\u015eimdi, bu <code>CheckPermission<\/code> fonksiyonunu kullanan bir Gin middleware&#8217;\u0131 olu\u015ftural\u0131m:<\/p>\n<div class=\"code-container\">\n<pre><code>package middleware\n\nimport (\n    \"net\/http\"\n    \"rbactutorial\/rbac\" \/\/ RBAC kontrol fonksiyonumuzu import edin\n\n    \"github.com\/gin-gonic\/gin\"\n)\n\n\/\/ Authorize, belirli bir yetkiyi gerektiren bir middleware olu\u015fturur.\nfunc Authorize(requiredPermission string) gin.HandlerFunc {\n    return func(c *gin.Context) {\n        \/\/ Genellikle, kimlik do\u011frulama middleware'\u0131 burada \u00e7al\u0131\u015f\u0131r ve\n        \/\/ kullan\u0131c\u0131 ID'sini c.Set(\"userID\", userID) ile ba\u011flamda saklar.\n        \/\/ Bu \u00f6rnekte, basitlik ad\u0131na userID'yi do\u011frudan alaca\u011f\u0131z veya mock edece\u011fiz.\n        \n        \/\/ Ger\u00e7ek uygulamada, JWT token'dan veya session'dan kullan\u0131c\u0131 ID'sini al\u0131n.\n        \/\/ \u00d6rne\u011fin: userID, exists := c.Get(\"userID\").(uint)\n        \/\/ if !exists {\n        \/\/     c.JSON(http.StatusUnauthorized, gin.H{\"error\": \"Yetkilendirme gerekli.\"})\n        \/\/     c.Abort()\n        \/\/     return\n        \/\/ }\n\n        \/\/ \u015eimdilik varsay\u0131lan bir kullan\u0131c\u0131 ID kullanal\u0131m (\u00f6rne\u011fin, 1 admin, 2 editor, 3 viewer)\n        \/\/ NOT: Bu k\u0131sm\u0131 ger\u00e7ek JWT\/session entegrasyonu ile de\u011fi\u015ftirin!\n        userID := uint(1) \/\/ \u00d6rnek olarak admin kullan\u0131c\u0131s\u0131\n\n        hasPerm, err := rbac.CheckPermission(userID, requiredPermission)\n        if err != nil {\n            c.JSON(http.StatusInternalServerError, gin.H{\"error\": \"Yetkilendirme kontrol\u00fcnde hata.\"})\n            c.Abort()\n            return\n        }\n\n        if !hasPerm {\n            c.JSON(http.StatusForbidden, gin.H{\"error\": \"Bu eylemi ger\u00e7ekle\u015ftirmek i\u00e7in yetkiniz yok.\"})\n            c.Abort()\n            return\n        }\n\n        c.Next() \/\/ Bir sonraki handler'a ge\u00e7\n    }\n}\n<\/code><\/pre>\n<\/p><\/div>\n<p>Bu <code>Authorize<\/code> middleware&#8217;\u0131, kendisine verilen <code>requiredPermission<\/code> (gerekli yetki) dizesini kullanarak kullan\u0131c\u0131n\u0131n yetkisini kontrol eder. E\u011fer kullan\u0131c\u0131 yetkili de\u011filse, <code>403 Forbidden<\/code> HTTP durum koduyla bir hata mesaj\u0131 d\u00f6ner ve iste\u011fi durdurur (<code>c.Abort()<\/code>). Aksi takdirde, iste\u011fin bir sonraki i\u015fleyiciye ge\u00e7mesine izin verir (<code>c.Next()<\/code>).<\/p>\n<p>Ger\u00e7ek d\u00fcnya senaryosu olarak bir e-ticaret uygulamas\u0131n\u0131 ele alal\u0131m:<\/p>\n<div class=\"code-container\">\n<pre><code>package main\n\nimport (\n    \"net\/http\"\n    \"rbactutorial\/database\"\n    \"rbactutorial\/middleware\" \/\/ Kendi middleware'\u0131n\u0131z\u0131 import edin\n\n    \"github.com\/gin-gonic\/gin\"\n)\n\nfunc main() {\n    database.InitDB() \/\/ Veritaban\u0131 ba\u011flant\u0131s\u0131n\u0131 ve migrasyonu ba\u015flat\n\n    r := gin.Default()\n\n    \/\/ \u00dcr\u00fcn API'leri\n    productRoutes := r.Group(\"\/products\")\n    {\n        productRoutes.GET(\"\/\", func(c *gin.Context) {\n            c.JSON(http.StatusOK, gin.H{\"message\": \"T\u00fcm \u00fcr\u00fcnleri listele\"})\n        })\n        productRoutes.POST(\"\/\", middleware.Authorize(\"create_products\"), func(c *gin.Context) {\n            c.JSON(http.StatusOK, gin.H{\"message\": \"Yeni \u00fcr\u00fcn olu\u015fturuldu\"})\n        })\n        productRoutes.PUT(\"\/:id\", middleware.Authorize(\"edit_products\"), func(c *gin.Context) {\n            c.JSON(http.StatusOK, gin.H{\"message\": \"\u00dcr\u00fcn g\u00fcncellendi\"})\n        })\n        productRoutes.DELETE(\"\/:id\", middleware.Authorize(\"delete_products\"), func(c *gin.Context) {\n            c.JSON(http.StatusOK, gin.H{\"message\": \"\u00dcr\u00fcn silindi\"})\n        })\n    }\n\n    \/\/ Y\u00f6netim API'leri (\u00f6rne\u011fin, kullan\u0131c\u0131 y\u00f6netimi)\n    adminRoutes := r.Group(\"\/admin\")\n    adminRoutes.Use(middleware.Authorize(\"manage_users\")) \/\/ T\u00fcm admin rotalar\u0131 i\u00e7in genel yetki\n    {\n        adminRoutes.GET(\"\/users\", func(c *gin.Context) {\n            c.JSON(http.StatusOK, gin.H{\"message\": \"T\u00fcm kullan\u0131c\u0131lar\u0131 listele\"})\n        })\n        adminRoutes.POST(\"\/users\", func(c *gin.Context) {\n            c.JSON(http.StatusOK, gin.H{\"message\": \"Yeni kullan\u0131c\u0131 olu\u015fturuldu\"})\n        })\n    }\n\n    r.Run(\":8080\")\n}\n<\/code><\/pre>\n<\/p><\/div>\n<p>Bu \u00f6rnekte, <code>\/products<\/code> endpoint&#8217;leri i\u00e7in farkl\u0131 HTTP metotlar\u0131na farkl\u0131 yetkiler atad\u0131k. \u00d6rne\u011fin, <code>POST \/products<\/code> iste\u011fi i\u00e7in kullan\u0131c\u0131n\u0131n <code>create_products<\/code> yetkisine sahip olmas\u0131 gerekirken, <code>PUT \/products\/:id<\/code> i\u00e7in <code>edit_products<\/code> yetkisi gereklidir. <code>\/admin<\/code> grubu i\u00e7in ise, t\u00fcm rotalar i\u00e7in ge\u00e7erli olan <code>manage_users<\/code> yetkisini kulland\u0131k. Bu yakla\u015f\u0131m, yetkilendirme mant\u0131\u011f\u0131n\u0131 i\u015fleyici fonksiyonlar\u0131ndan ay\u0131rarak kodun daha temiz ve s\u00fcrd\u00fcr\u00fclebilir olmas\u0131n\u0131 sa\u011flar. Kullan\u0131c\u0131 kimlik do\u011frulamas\u0131ndan sonra elde edilen <code>userID<\/code> bilgisinin middleware&#8217;a g\u00fcvenli bir \u015fekilde aktar\u0131lmas\u0131, ger\u00e7ek uygulamalarda JWT (JSON Web Token) veya session y\u00f6netimi gibi y\u00f6ntemlerle yap\u0131l\u0131r.<\/p>\n<h3>\u0130leri D\u00fczey RBAC Uygulamalar\u0131 ve Performans Optimizasyonlar\u0131<\/h3>\n<p>Basit bir RBAC sistemini Go ile uygulad\u0131ktan sonra, daha karma\u015f\u0131k ve performans odakl\u0131 senaryolar i\u00e7in baz\u0131 ileri d\u00fczey konular\u0131 ve optimizasyon tekniklerini g\u00f6z \u00f6n\u00fcnde bulundurmak \u00f6nemlidir. B\u00fcy\u00fck \u00f6l\u00e7ekli uygulamalarda, her istekte veritaban\u0131na sorgu g\u00f6ndermek performans darbo\u011fazlar\u0131na yol a\u00e7abilir. Ayr\u0131ca, RBAC&#8217;\u0131n dinamik olarak g\u00fcncellenmesi ve farkl\u0131 yetkilendirme modelleriyle entegrasyonu da \u00f6nemli konulard\u0131r.<\/p>\n<h4>Dinamik RBAC ve Y\u00f6netim Aray\u00fczleri<\/h4>\n<p>RBAC verilerinin (roller, yetkiler, kullan\u0131c\u0131-rol atamalar\u0131) yaln\u0131zca kod i\u00e7inde de\u011fil, ayn\u0131 zamanda bir y\u00f6netim paneli veya API arac\u0131l\u0131\u011f\u0131yla dinamik olarak g\u00fcncellenebilmesi gerekir. Bu, y\u00f6neticilerin kullan\u0131c\u0131 yetkilerini, rollerini ve hatta yeni yetki tan\u0131mlar\u0131n\u0131 uygulama yeniden ba\u015flatmaya gerek kalmadan de\u011fi\u015ftirebilmesini sa\u011flar. Go&#8217;da, bu t\u00fcr bir y\u00f6netim aray\u00fcz\u00fc i\u00e7in RESTful API&#8217;ler olu\u015fturabilir ve bu API&#8217;ler arac\u0131l\u0131\u011f\u0131yla veritaban\u0131ndaki RBAC tablolar\u0131n\u0131 g\u00fcncelleyebilirsiniz. \u00d6rne\u011fin, <code>\/api\/roles<\/code>, <code>\/api\/permissions<\/code> ve <code>\/api\/users\/:id\/roles<\/code> gibi endpoint&#8217;ler tan\u0131mlayarak RBAC y\u00f6netimini d\u0131\u015far\u0131ya a\u00e7abilirsiniz. Bu sayede, g\u00fcvenlik politikalar\u0131n\u0131z i\u015f ihtiya\u00e7lar\u0131 do\u011frultusunda h\u0131zla adapte edilebilir.<\/p>\n<h4>RBAC Kararlar\u0131n\u0131 \u00d6nbelle\u011fe Alma (Caching)<\/h4>\n<p>Her yetki kontrol\u00fc i\u00e7in veritaban\u0131na gitmek, \u00f6zellikle y\u00fcksek trafikli uygulamalarda performans\u0131 olumsuz etkiler. Bu sorunu \u00e7\u00f6zmek i\u00e7in RBAC kararlar\u0131n\u0131 \u00f6nbelle\u011fe alabiliriz. Redis gibi bir bellek i\u00e7i veri deposu, kullan\u0131c\u0131lar\u0131n sahip oldu\u011fu rolleri ve bu rollerin yetkilerini \u00f6nbelle\u011fe almak i\u00e7in idealdir. Bir kullan\u0131c\u0131 giri\u015f yapt\u0131\u011f\u0131nda veya rol\u00fc g\u00fcncellendi\u011finde, ilgili yetki bilgileri Redis&#8217;e yaz\u0131labilir. Sonraki yetki kontrollerinde, \u00f6nce \u00f6nbelle\u011fe bak\u0131l\u0131r; e\u011fer bilgi orada yoksa veritaban\u0131ndan \u00e7ekilir ve \u00f6nbelle\u011fe yaz\u0131l\u0131r. \u00d6nbelle\u011fe alma stratejileri (\u00f6rne\u011fin, TTL (Time-To-Live) ile belirli bir s\u00fcre sonra \u00f6nbelle\u011fi ge\u00e7ersiz k\u0131lma veya bir rol\/yetki g\u00fcncellendi\u011finde ilgili \u00f6nbelle\u011fi do\u011frudan temizleme) do\u011fru \u015fekilde uygulanmal\u0131d\u0131r. Go&#8217;da <code>go-redis<\/code> gibi k\u00fct\u00fcphaneler bu entegrasyonu kolayla\u015ft\u0131r\u0131r.<\/p>\n<div class=\"code-container\">\n<pre><code>\/\/ \u00d6nbelle\u011fe al\u0131nm\u0131\u015f yetki kontrol\u00fc \u00f6rne\u011fi\nfunc CheckPermissionCached(userID uint, requiredPermission string) (bool, error) {\n    cacheKey := fmt.Sprintf(\"user_permissions:%d:%s\", userID, requiredPermission)\n    \n    \/\/ Redis'ten kontrol et\n    val, err := redisClient.Get(ctx, cacheKey).Result()\n    if err == nil { \/\/ \u00d6nbellekte bulundu\n        return val == \"true\", nil\n    }\n    if err != redis.Nil { \/\/ Di\u011fer Redis hatalar\u0131\n        log.Printf(\"Redis hatas\u0131: %v\", err)\n        \/\/ Hata durumunda veritaban\u0131na d\u00fc\u015febiliriz veya hata d\u00f6nd\u00fcrebiliriz\n    }\n\n    \/\/ \u00d6nbellekte yoksa, veritaban\u0131ndan \u00e7ek\n    hasPerm, dbErr := CheckPermission(userID, requiredPermission)\n    if dbErr != nil {\n        return false, dbErr\n    }\n\n    \/\/ Sonucu \u00f6nbelle\u011fe yaz (\u00f6rne\u011fin 1 saatlik TTL ile)\n    redisClient.Set(ctx, cacheKey, strconv.FormatBool(hasPerm), time.Hour)\n    return hasPerm, nil\n}\n<\/code><\/pre>\n<\/p><\/div>\n<h4>Harici RBAC K\u00fct\u00fcphaneleri ve \u00c7er\u00e7eveleri<\/h4>\n<p>Go ekosisteminde, RBAC veya daha genel eri\u015fim kontrol\u00fc i\u00e7in geli\u015ftirilmi\u015f g\u00fc\u00e7l\u00fc k\u00fct\u00fcphaneler bulunmaktad\u0131r. Bunlardan en pop\u00fcler olanlar\u0131ndan biri Casbin&#8217;dir. Casbin, ABAC (Attribute-Based Access Control &#8211; Nitelik Tabanl\u0131 Eri\u015fim Kontrol\u00fc) ve RBAC dahil olmak \u00fczere \u00e7e\u015fitli eri\u015fim kontrol modellerini destekler. Esnek bir politika motoruna sahiptir ve Go uygulamalar\u0131n\u0131za kolayca entegre edilebilir. Casbin, politikalar\u0131 modellemek i\u00e7in \u00f6zel bir s\u00f6zdizimi kullan\u0131r ve adapt\u00f6rler (adapter) arac\u0131l\u0131\u011f\u0131yla \u00e7e\u015fitli veritabanlar\u0131 veya dosya sistemleriyle \u00e7al\u0131\u015fabilir. E\u011fer karma\u015f\u0131k yetkilendirme ihtiya\u00e7lar\u0131n\u0131z varsa ve kendi RBAC sisteminizi s\u0131f\u0131rdan yazmak istemiyorsan\u0131z, Casbin gibi bir k\u00fct\u00fcphane kullanmak geli\u015ftirme s\u00fcresini \u00f6nemli \u00f6l\u00e7\u00fcde k\u0131saltabilir ve daha g\u00fcvenilir bir \u00e7\u00f6z\u00fcm sunabilir.<\/p>\n<h4>Test Edilebilirlik<\/h4>\n<p>RBAC mant\u0131\u011f\u0131n\u0131n do\u011fru \u00e7al\u0131\u015ft\u0131\u011f\u0131ndan emin olmak i\u00e7in kapsaml\u0131 birim (unit) ve entegrasyon (integration) testleri yazmak \u00e7ok \u00f6nemlidir. Testler, farkl\u0131 kullan\u0131c\u0131 rollerinin belirli yetkilere sahip olup olmad\u0131\u011f\u0131n\u0131, yetkisiz kullan\u0131c\u0131lar\u0131n eri\u015fiminin engellenip engellenmedi\u011fini ve rol atamalar\u0131n\u0131n do\u011fru yap\u0131l\u0131p yap\u0131lmad\u0131\u011f\u0131n\u0131 do\u011frulamal\u0131d\u0131r. Go&#8217;nun yerle\u015fik test ara\u00e7lar\u0131 (<code>go test<\/code>) ve tablolu test yakla\u015f\u0131mlar\u0131, RBAC mant\u0131\u011f\u0131n\u0131z\u0131 test etmenizi kolayla\u015ft\u0131r\u0131r.<\/p>\n<p>Bu ileri d\u00fczey konular\u0131 dikkate alarak, Go ile uygulad\u0131\u011f\u0131n\u0131z RBAC sistemini daha sa\u011flam, performansl\u0131 ve y\u00f6netilebilir hale getirebilirsiniz. \u00d6zellikle b\u00fcy\u00fck ve karma\u015f\u0131k uygulamalarda, bu optimizasyonlar uygulaman\u0131z\u0131n uzun vadeli ba\u015far\u0131s\u0131 i\u00e7in hayati \u00f6neme sahiptir.<\/p>\n<h3>Sonu\u00e7 ve S\u0131k\u00e7a Sorulan Sorular: RBAC Uygulaman\u0131z\u0131 Gelece\u011fe Nas\u0131l Haz\u0131rlars\u0131n\u0131z?<\/h3>\n<p>Bu makalede, Go ile Rol Tabanl\u0131 Eri\u015fim Kontrol\u00fc (RBAC) sisteminin nas\u0131l uygulanaca\u011f\u0131n\u0131 ad\u0131m ad\u0131m inceledik. \u0130lk olarak, modern uygulamalarda sa\u011flam bir yetkilendirme mekanizmas\u0131n\u0131n neden gerekli oldu\u011funu tart\u0131\u015ft\u0131k ve RBAC&#8217;\u0131n temel kavramlar\u0131n\u0131 a\u00e7\u0131klad\u0131k. Ard\u0131ndan, Go&#8217;nun yerle\u015fik yap\u0131lar\u0131n\u0131 kullanarak basit bir in-memory RBAC sistemi tasarlad\u0131k ve bunu GORM ile veritaban\u0131na entegre ederek kal\u0131c\u0131 hale getirdik. Son olarak, Gin framework&#8217;\u00fc \u00fczerinde bir RBAC middleware&#8217;\u0131 olu\u015fturarak web uygulamalar\u0131na nas\u0131l entegre edilece\u011fini ve ger\u00e7ek d\u00fcnya senaryolar\u0131nda nas\u0131l kullan\u0131laca\u011f\u0131n\u0131 g\u00f6sterdik. Ayr\u0131ca, performans optimizasyonlar\u0131, dinamik y\u00f6netim ve harici k\u00fct\u00fcphaneler gibi ileri d\u00fczey konulara da de\u011findik.<\/p>\n<p>RBAC, uygulaman\u0131z\u0131n g\u00fcvenlik duru\u015funu g\u00fc\u00e7lendirmenin yan\u0131 s\u0131ra, yetkilendirme y\u00f6netimini basitle\u015ftirir ve \u00f6l\u00e7eklenebilirli\u011fi art\u0131r\u0131r. Go&#8217;nun performans\u0131 ve temiz s\u00f6zdizimi, bu t\u00fcr kritik sistem bile\u015fenlerini geli\u015ftirmek i\u00e7in onu ideal bir dil haline getirir. Unutmay\u0131n ki, herhangi bir g\u00fcvenlik sistemi gibi, RBAC uygulaman\u0131z da d\u00fczenli olarak g\u00f6zden ge\u00e7irilmeli, test edilmeli ve i\u015f ihtiya\u00e7lar\u0131n\u0131za g\u00f6re adapte edilmelidir. Do\u011fru bir planlama ve uygulama ile, Go tabanl\u0131 uygulamalar\u0131n\u0131zda g\u00fcvenli ve y\u00f6netilebilir bir eri\u015fim kontrol\u00fc sa\u011flayabilirsiniz.<\/p>\n<h4>S\u0131k\u00e7a Sorulan Sorular<\/h4>\n<ul>\n<li>\n            <strong>RBAC ile ACL (Eri\u015fim Kontrol Listeleri) aras\u0131ndaki temel fark nedir?<\/strong><\/p>\n<p>RBAC, yetkileri rollere atar ve kullan\u0131c\u0131lar\u0131 bu rollere ba\u011flar. Bu, yetki y\u00f6netimini basitle\u015ftirir, \u00e7\u00fcnk\u00fc bir kullan\u0131c\u0131n\u0131n yetkileri de\u011fi\u015fti\u011finde sadece rol atamas\u0131 g\u00fcncellenir. ACL ise, her bir kayna\u011fa hangi kullan\u0131c\u0131lar\u0131n veya gruplar\u0131n do\u011frudan eri\u015febilece\u011fini belirten listeler kullan\u0131r. B\u00fcy\u00fck sistemlerde ACL&#8217;ler karma\u015f\u0131k ve y\u00f6netilmesi zor hale gelebilirken, RBAC daha esnek ve \u00f6l\u00e7eklenebilir bir yap\u0131 sunar.<\/p>\n<\/li>\n<li>\n            <strong>Go&#8217;da RBAC i\u00e7in hangi \u00fc\u00e7\u00fcnc\u00fc taraf k\u00fct\u00fcphaneleri \u00f6nerilir?<\/strong><\/p>\n<p>E\u011fer daha geli\u015fmi\u015f ve esnek bir yetkilendirme sistemi ar\u0131yorsan\u0131z, Casbin Go i\u00e7in pop\u00fcler ve g\u00fc\u00e7l\u00fc bir k\u00fct\u00fcphanedir. Casbin, RBAC&#8217;\u0131n yan\u0131 s\u0131ra ABAC, ACL gibi \u00e7e\u015fitli eri\u015fim kontrol modellerini destekler ve farkl\u0131 depolama adapt\u00f6rleriyle \u00e7al\u0131\u015fabilir. E\u011fer daha basit bir \u00e7\u00f6z\u00fcm ar\u0131yorsan\u0131z, kendi in-memory veya veritaban\u0131 tabanl\u0131 \u00e7\u00f6z\u00fcm\u00fcn\u00fcz\u00fc yukar\u0131daki \u00f6rneklerdeki gibi geli\u015ftirmek de m\u00fcmk\u00fcnd\u00fcr.<\/p>\n<\/li>\n<li>\n            <strong>RBAC uygulamak uygulaman\u0131n performans\u0131n\u0131 nas\u0131l etkiler?<\/strong><\/p>\n<p>Her yetki kontrol\u00fc i\u00e7in veritaban\u0131na yap\u0131lan sorgular, \u00f6zellikle y\u00fcksek trafikli uygulamalarda performans darbo\u011fazlar\u0131na yol a\u00e7abilir. Bu nedenle, RBAC kararlar\u0131n\u0131 Redis gibi bellek i\u00e7i bir \u00f6nbelle\u011fe almak kritik \u00f6neme sahiptir. Do\u011fru \u00f6nbellekleme stratejileri (TTL, cache invalidation) ile performans \u00fczerindeki etki minimize edilebilir ve hatta genel uygulama performans\u0131 art\u0131r\u0131labilir.<\/p>\n<\/li>\n<li>\n            <strong>RBAC&#8217;\u0131 mikroservis mimarisinde nas\u0131l uygulayabilirim?<\/strong><\/p>\n<p>Mikroservis mimarisinde RBAC, genellikle merkezi bir yetkilendirme servisi (Authorization Service) arac\u0131l\u0131\u011f\u0131yla uygulan\u0131r. Kullan\u0131c\u0131 kimlik do\u011fruland\u0131ktan sonra, bir JWT token&#8217;\u0131 olu\u015fturulur ve bu token&#8217;a kullan\u0131c\u0131n\u0131n rolleri veya yetkileri eklenebilir. Her mikroservis, gelen iste\u011fin JWT token&#8217;\u0131n\u0131 do\u011frulayarak ve i\u00e7erdi\u011fi yetki bilgilerini kontrol ederek kendi RBAC karar\u0131n\u0131 verebilir. Daha karma\u015f\u0131k senaryolarda, mikroservisler merkezi yetkilendirme servisine bir RPC (Remote Procedure Call) veya HTTP iste\u011fi g\u00f6ndererek yetki kontrol\u00fc yapabilir.<\/p>\n<\/li>\n<\/ul>\n<p>#GoLang #RBAC #Eri\u015fimKontrol\u00fc #Yetkilendirme #G\u00fcvenlik #WebGeli\u015ftirme #Go<\/p>\n<div class=\"github-example-link\"><strong>\u00d6rnek kod:<\/strong> <a href=\"https:\/\/github.com\/fatihsoysalcom\/go-role-based-access-control-example\" target=\"_blank\" rel=\"noopener noreferrer\">github.com\/fatihsoysalcom\/go-role-based-access-control-example<\/a><\/div>\n","protected":false},"excerpt":{"rendered":"Modern web uygulamalar\u0131, kullan\u0131c\u0131lar\u0131na \u00e7e\u015fitli i\u015flevsellikler sunarken, ayn\u0131 zamanda hassas verilere ve kritik i\u015flemlere eri\u015fimi s\u0131k\u0131 bir \u015fekilde kontrol etmek zorundad\u0131r.","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-42961","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>Go ile Rol Tabanl\u0131 Eri\u015fim Kontrol\u00fc (RBAC) Nas\u0131l Uygulan\u0131r? - Kodlar\u0131n Gizemli D\u00fcnyas\u0131<\/title>\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\/go-ile-rol-tabanli-erisim-kontrolu-rbac-nasil-uygulanir\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Go ile Rol Tabanl\u0131 Eri\u015fim Kontrol\u00fc (RBAC) Nas\u0131l Uygulan\u0131r?\" \/>\n<meta property=\"og:description\" content=\"Modern web uygulamalar\u0131, kullan\u0131c\u0131lar\u0131na \u00e7e\u015fitli i\u015flevsellikler sunarken, ayn\u0131 zamanda hassas verilere ve kritik i\u015flemlere eri\u015fimi s\u0131k\u0131 bir \u015fekilde kontrol etmek zorundad\u0131r.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/go-ile-rol-tabanli-erisim-kontrolu-rbac-nasil-uygulanir\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2026-06-30T18:13:55+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-06-30T18:14:22+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=\"22 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/go-ile-rol-tabanli-erisim-kontrolu-rbac-nasil-uygulanir\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/go-ile-rol-tabanli-erisim-kontrolu-rbac-nasil-uygulanir\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Go ile Rol Tabanl\u0131 Eri\u015fim Kontrol\u00fc (RBAC) Nas\u0131l Uygulan\u0131r?\",\"datePublished\":\"2026-06-30T18:13:55+00:00\",\"dateModified\":\"2026-06-30T18:14:22+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/go-ile-rol-tabanli-erisim-kontrolu-rbac-nasil-uygulanir\/\"},\"wordCount\":3126,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/go-ile-rol-tabanli-erisim-kontrolu-rbac-nasil-uygulanir\/#respond\"]}],\"copyrightYear\":\"2026\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/go-ile-rol-tabanli-erisim-kontrolu-rbac-nasil-uygulanir\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/go-ile-rol-tabanli-erisim-kontrolu-rbac-nasil-uygulanir\/\",\"name\":\"Go ile Rol Tabanl\u0131 Eri\u015fim Kontrol\u00fc (RBAC) Nas\u0131l Uygulan\u0131r? - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2026-06-30T18:13:55+00:00\",\"dateModified\":\"2026-06-30T18:14:22+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/go-ile-rol-tabanli-erisim-kontrolu-rbac-nasil-uygulanir\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/go-ile-rol-tabanli-erisim-kontrolu-rbac-nasil-uygulanir\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/go-ile-rol-tabanli-erisim-kontrolu-rbac-nasil-uygulanir\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Go ile Rol Tabanl\u0131 Eri\u015fim Kontrol\u00fc (RBAC) Nas\u0131l Uygulan\u0131r?\"}]},{\"@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":"Go ile Rol Tabanl\u0131 Eri\u015fim Kontrol\u00fc (RBAC) Nas\u0131l Uygulan\u0131r? - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","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\/go-ile-rol-tabanli-erisim-kontrolu-rbac-nasil-uygulanir\/","og_locale":"tr_TR","og_type":"article","og_title":"Go ile Rol Tabanl\u0131 Eri\u015fim Kontrol\u00fc (RBAC) Nas\u0131l Uygulan\u0131r?","og_description":"Modern web uygulamalar\u0131, kullan\u0131c\u0131lar\u0131na \u00e7e\u015fitli i\u015flevsellikler sunarken, ayn\u0131 zamanda hassas verilere ve kritik i\u015flemlere eri\u015fimi s\u0131k\u0131 bir \u015fekilde kontrol etmek zorundad\u0131r.","og_url":"https:\/\/fatihsoysal.com\/blog\/go-ile-rol-tabanli-erisim-kontrolu-rbac-nasil-uygulanir\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2026-06-30T18:13:55+00:00","article_modified_time":"2026-06-30T18:14:22+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"22 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/go-ile-rol-tabanli-erisim-kontrolu-rbac-nasil-uygulanir\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/go-ile-rol-tabanli-erisim-kontrolu-rbac-nasil-uygulanir\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Go ile Rol Tabanl\u0131 Eri\u015fim Kontrol\u00fc (RBAC) Nas\u0131l Uygulan\u0131r?","datePublished":"2026-06-30T18:13:55+00:00","dateModified":"2026-06-30T18:14:22+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/go-ile-rol-tabanli-erisim-kontrolu-rbac-nasil-uygulanir\/"},"wordCount":3126,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/go-ile-rol-tabanli-erisim-kontrolu-rbac-nasil-uygulanir\/#respond"]}],"copyrightYear":"2026","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/go-ile-rol-tabanli-erisim-kontrolu-rbac-nasil-uygulanir\/","url":"https:\/\/fatihsoysal.com\/blog\/go-ile-rol-tabanli-erisim-kontrolu-rbac-nasil-uygulanir\/","name":"Go ile Rol Tabanl\u0131 Eri\u015fim Kontrol\u00fc (RBAC) Nas\u0131l Uygulan\u0131r? - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2026-06-30T18:13:55+00:00","dateModified":"2026-06-30T18:14:22+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/go-ile-rol-tabanli-erisim-kontrolu-rbac-nasil-uygulanir\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/go-ile-rol-tabanli-erisim-kontrolu-rbac-nasil-uygulanir\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/go-ile-rol-tabanli-erisim-kontrolu-rbac-nasil-uygulanir\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Go ile Rol Tabanl\u0131 Eri\u015fim Kontrol\u00fc (RBAC) Nas\u0131l Uygulan\u0131r?"}]},{"@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\/42961","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=42961"}],"version-history":[{"count":1,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/42961\/revisions"}],"predecessor-version":[{"id":42962,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/42961\/revisions\/42962"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=42961"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=42961"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=42961"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}