Sẽ không có vấn đề gì với sản phẩm đó.
Hãy nói rằng bạn có một cơ sở dữ liệu "thử nghiệm", và có một tài khoản quản trị đã:
curl -X PUT http://localhost:5984/test -u "admin:123"
Bây giờ bạn có thể tạo một tài liệu _security cho nó:
curl -X PUT http://localhost:5984/test/_security -u "admin:123" -d '{"admins":{"names":[], "roles":[]}, "readers":{"names":["joe"],"roles":[]}}'
Them chỉ có người dùng " joe "sẽ có thể đọc cơ sở dữ liệu. Để tạo người dùng đã bạn phải có sha1 băm mật khẩu:
curl -X POST http://localhost:5984/_users -d '{"_id":"org.couchdb.user:joe","type":"user","name":"joe","roles":[],"password_sha":"c348c1794df04a0473a11234389e74a236833822", "salt":"1"}' -H "Content-Type: application/json"
Thành viên này có mật khẩu "123" băm sử dụng sha1 với muối "1" (sha1 ("123" + "1")), vì vậy anh ấy có thể đọc cơ sở dữ liệu:
curl -X GET http://localhost:5984/test -u "joe:123"
Hiện tại, anh ấy có thể đọc bất kỳ tài liệu nào trên cơ sở dữ liệu đó và không có người dùng nào khác (nhưng anh ấy và quản trị viên) có thể.
CẬP NHẬT: Writer an ninh
Các phương pháp trên vấn đề vấn đề người đọc, nhưng cho phép người đọc ở đây thực sự có nghĩa là "đọc/viết tài liệu phổ biến", do đó nó cho phép để viết tài liệu ngoại trừ thiết kế tài liệu. Các "admin" s trong doc _security được phép viết các tài liệu thiết kế trong cơ sở dữ liệu này.
Cách tiếp cận khác, như được lấy từ câu trả lời của riêng bạn, là "validate_doc_update", bạn có thể có một validate_doc_update như sau trong một tập tin:
function(new_doc, old_doc, userCtx) {
if(!userCtx || userCtx.name != "joe") {
throw({forbidden: "Bad user"});
}
}
Và đẩy nó vào một thiết kế couchdb:
curl -X PUT http://localhost:5984/test/_design/security -d "{ \"validate_doc_update\": \"function(new_doc,doc,userCtx) { if(userCtx || userCtx.name != 'joe') {throw({forbidden: 'Bad user'})}}\"}" --user 'admin:123'
Them "joe" có thể ghi vào cơ sở dữ liệu sử dụng Basic Authentication:
curl -X PUT http://localhost:5984/test/foobar -d '{"foo":"bar"}' -u 'joe:123'
Như bạn cũng giải quyết bạn có thể sử dụng api _SESSION để có được một cookie để xác thực:
curl http://localhost:5984/_session -v -X POST -d 'name=joe&password=123' -H "Content-Type: application/x-www-form-urlencodeddata"
này sẽ trả về một tiêu đề như:
Set-Cookie: AuthSession=am9lOjRDRDE1NzQ1Oj_xIexerFtLI6EWrBN8IWYWoDRz; Version=1; Path=/; HttpOnly
Vì vậy, bạn có thể bao gồm cookie "AuthSession = am9lOjRDRDE1NzQ1Oj_xIexerFtLI6EWrBN8IWYWoDRz" trong các yêu cầu tiếp theo của bạn và chúng sẽ được xác thực.
Hey Aaron, làm thế nào bạn thực hiện việc tạo ra một cơ sở dữ liệu mới mỗi khi người dùng đã đăng ký? Bạn có sử dụng một tầng khác, như php, nút, ruby không? Hay bạn đã tìm ra cách đi văng tinh khiết? – Costa