2013-03-15 25 views
6

Tôi đang triển khai API RESTful với Express in Node và tôi mới sử dụng cả hai. Tôi muốn sử dụng xác thực cơ bản để kiểm soát quyền truy cập.Có thể áp dụng xác thực cơ bản/phần mềm trung gian trên các tuyến với danh sách trắng trong Express không?

Tôi muốn áp dụng nó bằng cách sử dụng một cái gì đó như một danh sách trắng nhưng tôi không chắc chắn làm thế nào để làm điều đó.

Blacklisting rất dễ dàng, tôi có thể chỉ tiêu của tôi #VERB cuộc gọi với đối số thứ hai:

app.get('/', asyncAuth, requestHandler); 

Tôi có thể đi mà thậm chí xa hơn và danh sách đen tất cả mọi thứ với:

app.all('*', asyncAuth, requestHandler); 

Nhưng tôi muốn áp dụng basicAuth của tôi cho mỗi tuyến đường duy nhất, ngoại trừ cho POST /users. Có cách nào thanh lịch để làm điều đó không? Tôi có thể sử dụng cách tiếp cận 'danh sách đen' sau đó chọn lọc loại bỏ nó khỏi các tuyến đường tôi muốn không? Tôi không thể hiểu được làm thế nào.

+1

câu hỏi thú vị, tôi đoán câu hỏi của bạn là chi tiết của "Làm thế nào để chọn một tuyến đường phủ định ", nghĩa là, phù hợp với mọi tuyến đường ngoại trừ một số tuyến đường tốc hành - duyên dáng. Bạn có thể thử kết hợp các tuyến đường với regex và phủ nhận "/ người dùng", một cái gì đó như http://stackoverflow.com/questions/6586197/expressjs-bind-all-routes-except-2-folders? –

+0

Cảm ơn bạn! Tôi đã gặp rắc rối từ ngữ nó. Chọn một tuyến đường tiêu cực là những gì tôi muốn làm. Tôi đã xem xét sử dụng regex, nó sẽ hoạt động, nhưng nó có cảm giác hơi giống một hack. Nó có vẻ như phải có một cách đẹp hơn. – Terraflubb

Trả lời

8

Xác định tuyến đường của bạn cho POST /users trước khi các tuyến đường danh sách đen:

app.post('/users', function(req, res) { 
    ... 
}); 

app.all('*', asyncAuth, requestHandler); 
+0

Tôi không thể tin rằng điều này đơn giản và nó không xảy ra với tôi! Cảm ơn bạn Tôi đã thực hiện thay đổi này và tất cả các bài kiểm tra của tôi là màu xanh lá cây. – Terraflubb

2

Bạn có thể duy trì một danh sách các regexps được danh sách trắng, và phù hợp với url chống lại từng url trong danh sách, nếu nó phù hợp với bất kỳ sau đó tiến hành, nếu không đòi hỏi auth

app.all('*', asyncAuth); 

function asyncAuth(req, res, next) { 
    var done = false; 
    whitelist.forEach(function(regexp) { 
     if (req.url.match(regexp)) { 
      done = true; 
      next(); 
     } 
    }); 
    if (!done) requireAuth(next); 
} 

Something dọc theo những đường

+0

Có! Rằng sẽ làm việc. Tôi đã sử dụng 'express.basicAuth (chức năng (tên người dùng, mật khẩu) {...} 'độc quyền, vì vậy tôi nghĩ tôi sẽ không truy cập được' req'. Đó là một mẹo nhỏ gọn. Tôi sẽ đánh dấu điều này là – Terraflubb

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