2015-06-23 26 views
8

API REST được viết bằng ExpressJs 4.x.x/NodeJS.ACL hoạt động như thế nào trong API REST?

Giả sử một giao diện:

app.delete('/api/v1/users/:uid', function (req, res, next) { 
... 
} 

Vì vậy, với người dùng giao diện có thể bị xóa.

Giả sử có 2 Khách hàng trong hệ thống và mỗi Khách hàng đều có Người dùng. Người dùng có thể có đặc quyền xóa người dùng khác bằng vai trò là Khách hàngAdmin. Nhưng Người dùng này chỉ có thể xóa Người dùng là Người dùng từ Công ty của anh ấy (Khách hàng).

Vì vậy, hãy đưa ACL vào hiện trường. Giả sử trong ACL của chúng tôi, chúng tôi có thể xác định vai trò, tài nguyên và quyền. (Mã được chấp nhận từ http://github.com/OptimalBits/node_acl#middlware.)

app.delete('/api/v1/users/:uid', acl.protect(), function (req, res, next) 
{ 
// ? Delete User with uid = uid or check 
// ? first if current user is in same company as user uid 
} 

Có hai điều cần xem xét. Một người đang bảo vệ lộ trình từ những người không được phép HTTP/DELETE trên tuyến đường đó (/ api/v1/users /: uid) và người kia là một Person with Role CustomersAdmin sẽ không được phép xóa Người dùng khỏi một Khách hàng khác.

ACL phải làm cả hai? Hoặc là nó phải bảo vệ route/api/v1/users?

Vì vậy, tôi sẽ sử dụng nó như

acl.allow([ 
{ 
    roles:'CustomersAdmin', 
    allows:[ 
    {resources:['/api/v1/users', '/api/v1/users'] permissions:'delete'} 
} 
app.delete('/api/v1/users/:uid',acl.middleware(3), function(req,res,next) 
{ 
Make sure uid is a User from same Customer as request is from(req.session.userid) 
} 

này sẽ cho phép mỗi người dùng với vai trò CustomersAdmin để xóa bất cứ người sử dụng anh ta muốn. Hoặc có nên định nghĩa từng tuyến đường Người dùng có thể là một Tài nguyên và xác định nhiều Vai trò có thể tương tác với chúng không?

acl.allow([ 
{ 
    roles:'CustomersAdminOne', 
    allows:[ 
    {resources:['/api/v1/users/1', '/api/v1/users/2'], permissions:'delete'}] 
}, 
{ 
    roles:'CustomersTwoAdmin', 
    allows:[ 
    {resources:['/api/v1/users/3','/api/v1/users/4'], permissions:'delete'} 
    ] 
} 
app.delete('/api/v1/users/:uid',acl.middleware(), function(req,res,next) 
{ 
no logic needed to be sure that request is from a user within the same customer 
} 
+0

Xin chào là có một hướng dẫn về cách triển khai node_acl, đã cố gắng sử dụng một trên nom nhưng mạng của nó cho tôi. Tôi sẽ đánh giá cao phản hồi của bạn –

Trả lời

2

Cách tôi giải quyết điều này là tạo vai trò cho mỗi người dùng. Tôi sử dụng bài mongoose tiết kiệm móc:

acl.addUserRole(user._id, ['user', user._id]); 

Sau đó, trong bài tiết kiệm móc cho một nguồn tài nguyên Tôi làm điều này:

acl.allow(['admin', doc.user._id], '/album/' + doc._id, ['*']); 
acl.allow(['guest', 'user'], '/album/' + doc._id, ['get']); 

Sau đó bạn có thể sử dụng phương pháp isAllowed để kiểm tra xem req.user có đủ quyền hạn.

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