2016-01-15 21 views
7

Geçmiş:Bir GraphQL sunucusunda erişim denetimi uygulamak için iyi bir desen nedir?

Bir kullanıcı referanslar içerebilir bazıları bir kullanıcı ve çeşitli diğer modelleri de dahil olmak üzere bir dizi model var. Ben graffiti-mongoose adaptörü kullanarak bir Mongo veritabanı tarafından desteklenen Graffiti tarafından oluşturulan bir GraphQL API üzerinden sorgulama için bu modelleri açığa çıkıyorum. Geçerli REST API'm (GraphQL'e geçiş yapıyorum), kullanıcıların kimliğini doğrulamak için JSON Web Jetonlarını kullanır ve erişim denetimini ele almak için sunucu tarafında bazı özel izin mantığı vardır.

Sorun:

Geçerli giriş yapmış olan kullanıcı dayalı GraphQL nesnelere erişimi kısıtlamak istiyorum. Bazı modellerin kimliği doğrulanmamış çağrılar tarafından okunabilmesi için erişilebilir olmalıdır. Diğer modellerin çoğu, yalnızca bunları oluşturan Kullanıcı tarafından erişilebilir olmalıdır. Graffiti tarafından oluşturulan API ile nesnelerin erişim kontrolünü yönetmenin en iyi yolu nedir?

Genel olarak, GraphQL için erişim kontrolünün iyi örnekleri var mı? Ve özellikle, Graffiti ile yapmak için iyi örnekler veya kütüphaneler var mı?

Notlar:

Ben öncesi ve sonrası kanca grafiti firavunfaresi için been implemented olduğunu anlamak ve onlar can be used kimlik doğrulaması için temel ikili kontrolleri yapmak o. Daha detaylı bir erişim kontrol mantığının GraphQL API'sinde nasıl çalışılacağını görmek isterim. Gelecekte, belirli bir Kullanıcı Grubu tarafından oluşturulan model örneklerine erişimi olan Yöneticiler gibi şeyleri desteklemeyi isteyeceğiz (ör. Bağlı Kuruluşları, Yöneticinin içerdiği Kullanıcılar).

+0

GraphQL ve diğer uygulamaların güvenliğini sağlamak için kullanabileceğiniz ince taneli özellik tabanlı erişim denetimi modellerinden XACML ve ABAC'ı incelemeniz gerekir. –

cevap

9

Genellikle GraphQL, erişim denetimini doğrudan gerçekleştirmez; bunun yerine, söz konusu sorumluluğu hangi arabirim sistemi ile etkileşime sokarsa onu aktarır. Durumunda Mongoose gibi geliyor.

Erişim denetimi mantığı genellikle keyfi bir mantık olduğundan (örneğin, bu kullanıcının bazı içeriklerden yasaklanması var mı? Bu içeriğin yayınlayıcısı, özel gizlilik ayarları ile kısıtlandı mı? Vb.) Ve durumunuza benziyor erişim kontrol mantığı aslında özeldir, bir GraphQL alanı için bir değer üreten "çöz" işlevinde yaşamalıdır. Örneğin

:

var UserType = new GraphQLObjectType({ 
    name: 'User', 
    fields: { 
    name: { type: GraphQLString }, 
    birthday: { 
     type: GraphQLString, 
     resolve(user, context) { 
     var auth = context.myLoggedInAuth; 
     if (myCanAuthSeeBirthday(auth, user)) { 
      return user.birthday; 
     } 
     } 
    } 
    } 
}); 
+2

Bu, projenizin kapsamına göre istenmeyen kodlara neden olabilir. Bu, çözücülerden koparma yetkisinin resmi bir duruşudur. Http://graphql.org/learn/authorization/ – medv

2

Bir kural tabanı erişim kontrolü oluşturmak GraphQL ile kullanılacak.

https://github.com/joonhocho/graphql-rule

Çok basit olup, birlikte veya GraphQL olmadan kullanılabileceğini unopionated.

Düz javascript nesneleriyle kullanabilirsiniz.

Bu, GraphQL yardımcı olur umarım!

+0

Şunlara bakmak isteyebilirsiniz: [Kişisel açık kaynaklı kütüphaneler nasıl sunuluyor?] (https://meta.stackexchange.com/q/229085) –

+0

Teşekkürler. Bu kuralları bile bilmiyordum. – Joon

İlgili konular