2016-01-15 21 views
7

Bối cảnh:Mô hình tốt để thực hiện kiểm soát truy cập trong máy chủ GraphQL là gì?

Tôi có một tập hợp các mô hình, trong đó có một tài khoản và các mô hình khác nhau, một số trong đó chứa tham chiếu đến một tài khoản. Tôi đang trưng bày các mô hình này để truy vấn thông qua API GraphQL được tạo bởi Graffiti, được hỗ trợ bởi cơ sở dữ liệu Mongo bằng bộ điều hợp graffiti-mongoose. API REST hiện tại của tôi (mà tôi đang chuyển sang GraphQL) sử dụng JSON Web Tokens để xác thực người dùng và có một số logic quyền tùy chỉnh ở phía máy chủ để xử lý kiểm soát truy cập.

Vấn đề:

Tôi muốn hạn chế quyền truy cập vào các đối tượng trong GraphQL dựa trên người dùng đăng nhập hiện hành. Một số mô hình có thể truy cập được để đọc bằng các cuộc gọi chưa được xác thực. Hầu hết các mô hình khác chỉ nên truy cập được đối với Người dùng đã tạo chúng. Cách tốt nhất để quản lý kiểm soát truy cập đối tượng thông qua API do Graffiti tạo ra là gì?

Nói chung, có các mẫu kiểm soát truy cập tốt cho GraphQL? Và đặc biệt, có bất kỳ ví dụ hay thư viện tốt nào để thực hiện nó với Graffiti không?

Ghi chú:

Tôi hiểu rằng móc trước và hậu có been implemented cho graffiti-cầy mangut, và rằng họ can be used để làm kiểm tra nhị phân cơ bản để xác thực. Tôi muốn xem cách một logic kiểm soát truy cập chi tiết hơn có thể được làm việc thành một API GraphQL. Trong tương lai, chúng tôi sẽ muốn hỗ trợ những thứ như Quản trị viên có quyền truy cập vào các trường hợp mô hình được tạo bởi một nhóm Người dùng nhất định (ví dụ: Người dùng có Chi nhánh bao gồm Quản trị viên).

+0

Bạn nên xem xét XACML và ABAC là các mô hình kiểm soát truy cập dựa trên thuộc tính tốt mà bạn có thể sử dụng để bảo mật GraphQL và các ứng dụng khác –

Trả lời

9

Thông thường GraphQL không xử lý điều khiển truy cập trực tiếp, thay vào đó ủy quyền trách nhiệm đó cho bất kỳ hệ thống dữ liệu nào mà nó giao tiếp. Trong trường hợp của bạn có vẻ như Mongoose.

Vì logic điều khiển truy cập thường là logic tùy ý (ví dụ, người dùng này đã bị cấm từ một số nội dung? Nhà xuất bản nội dung đó hạn chế nó với cài đặt bảo mật tùy chỉnh?), Và có vẻ như trong trường hợp của bạn logic điều khiển truy cập là trong thực tế tùy chỉnh, nó phải sống trong chức năng "giải quyết" trong đó tạo ra một giá trị cho một trường GraphQL.

Ví dụ:

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

Điều này có thể dẫn đến mã khó sử dụng tùy thuộc vào phạm vi dự án của bạn. Đây là quan điểm chính thức về ủy quyền de-coupling từ các trình tự giải quyết http://graphql.org/learn/authorization/ – medv

2

tôi tạo ra một quy tắc kiểm soát truy cập cơ sở được sử dụng với GraphQL.

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

Nó là đơn giản và unopionated rằng nó có thể được sử dụng có hoặc không có GraphQL.

Bạn có thể sử dụng nó với một đối tượng javascript đơn giản.

Hy vọng nó giúp GraphQLers!

+0

Bạn có thể muốn xem [Cách cung cấp các thư viện mã nguồn mở cá nhân?] (https://meta.stackexchange.com/q/229085) –

+0

Cảm ơn. Không biết các quy tắc như vậy thậm chí còn tồn tại. – Joon

Các vấn đề liên quan