Mikro hizmetlerin sınırlı izinlere sahip olmasını sağlarken, kullanıcıları bir mikro hizmet mimarisinde yetkilendirmenin en iyi yolunu belirlemeye çalışıyoruz. Mimarimiz, JWT jetonlarının yayınlanması için merkezi bir yetkilendirme hizmeti kullanmaktadır.
Aşağıdaki gereksinimlere sahibiz:
Kullanıcılar belirli rolleri yerine getirmekle sınırlı olmalıdır. örneğin bir kullanıcı yalnızca sahip olduğu içeriği oluşturabilmeli / değiştirebilmeli / okuyabilmelidir.
Mikro hizmetler yalnızca gereksinim duydukları izinlerle sınırlı olmalıdır. örneğin, yalnızca başka bir hizmetten veri okuması gereken bir mikro hizmetin, söz konusu hizmete veri yazması açıkça yasaklanmalıdır.
Örnek olarak, kullanıcıların bir resim deposu hizmetine resim yükleyebileceği bir sistemimiz olduğunu varsayalım. Resimleri otomatik olarak bir konumla etiketleyen bir etiketleme hizmetimiz var. Kullanıcılar sadece kendi resimlerini CRUD. Etiketleme hizmeti, resim deposu hizmetinden herhangi bir görüntüyü okuyabilir, ancak değiştiremez / silemez.
JWT jetonlarını kullanarak yukarıdakilere ulaşmanın iyi bir yolu nedir? Tartıştığımız bazı çözümler:
Resim saklama hizmeti, biri harici olarak kullanılabilen (kullanıcı CRUD erişimi veren) ve biri dahili olarak kullanılabilen (dahili salt okunur erişim sağlayan) 2 API sunar. Esnek görünmüyor - başka bir dahili hizmetin tüm görüntülere okuma / yazma erişimi gerektirmesi gerekiyorsa (örneğin, müstehcen görüntüleri otomatik olarak silen)?
Kullanıcının JWT'sinde, biri CRUD_OwnImages, diğeri READ_ForAnalysis olmak üzere iki izin ayarladık. Etiketleme hizmeti, kullanıcının READ_ForAnalysis izinlerine sahip olup olmadığını görebilir ve varsa uygun isteği yapabilir. Kullanıcının kendi resimlerinde CRUD işlemleri için CRUD_OwnImages olup olmadığını kontrol eden başka bir mikro hizmetimiz var. Bu, kullanıcının ihtiyaç duyduğu eylemlerle sınırlı olmasını sağlamak için her bir mikro hizmetin sorumluluğunu üstlenir. Görüntü deposunun bu mikroişlemi bu yaklaşımla kısıtlamanın bir yolu yoktur, bu nedenle potansiyel olarak kesintili ve hataya yatkındır.
Etiketleme mikro hizmetini, READ_ForAnalysis ile izin olarak kendi kullanıcısına veriyoruz. Daha sonra, etiketleme hizmeti resim deposundan resim istediğinde, bunlara erişim izni verilir, ancak bunların değiştirilmesi yasaktır. Kullanıcının kullanıcısı yalnızca CRUD_OwnImages iznine sahiptir, bu nedenle yalnızca ön ucundan resimlerini alabilir ve bunlara erişebilir. Başka bir hizmetin tüm verilere CRUD ihtiyacı varsa, ona CRUD_AllData veya benzeri bir şey verebiliriz. Her hizmetin artık kendi verilerinden (bu mantığın birden çok hizmette çoğaltılmasından ziyade) sorumlu olması nedeniyle bu yaklaşımı seviyoruz, ancak hizmet hem kullanıcı izinleri hem de mikro hizmet izinleri gerektiriyorsa ne olur? İki JWT jetonunu (hem kullanıcının hem de mikro hizmetin) güvenli bir şekilde gönderebilir miyiz? İzinleri güvenli bir şekilde birleştirmenin ve göndermenin bir yolu var mı? Örneğin
Kullanıcı bilgilerinin daha aşağı yönde (2 veya 3 mikro servis uzakta) gerekli olması durumunda sorun daha da kötüleşir. Kendilerini ihtiyaç duydukları eylemlerle sınırlamanın ve bunu açık hale getirmemenin bireysel mikro hizmetlere bağlı olduğunu varsayıyor muyuz?