Phân quyền, thiết lập các quyền truy cập tài khoản là một điều hết sức cần thiết khi làm việc với bất cứ cơ sở dữ liêu nào. Với Mongodb cũng không phải ngoại lệ. Có thể khi bạn phát triển tại local cục bộ của mình thì điều đó là không cần thiết. Tuy nhiên bạn cũng phải nghĩ tới các trường hợp khi xây dựng với một sản phẩm thương mại. Ok trong phạm vi bài viết này mình sẽ đề cập tới một số quyền cơ bản hay sử dụng, ít nhất là nó hữu ích khi bạn làm việc với 1 product sử dụng mongodb community. Để xem nhiều hơn các thiết lập bạn có thể xem chi tiết thêm tại đây .
Bài viết này mình sẽ đi qua danh mục dưới đây- Một số kiến thức cơ bản
- Thiết lập role
- Tự tạo role và thiết lập đặc quyền riêng
1. Một số kiến thức cơ bản:
- use db_name: truy cập vào db có tên db_name
- use admin: Truy cập vào cơ sở dữ liệu admin. Mình muốn nói riêng tới database này bởi vì database này có một số thiết lập đặc quyền cao nhât mà ở một số cơ sở dữ liệu khác không có được. Đương nhiên nó cũng là cơ sở dữ liệu khởi tạo mặc định khi cài đặt cơ sở dữ liệu
- db.auth(‘username’, ‘password’): thực hiện xác thực db mà bạn vừa truy cập bằng lệnh use db_name. Nếu bạn không truy cập vào db chỉ định thì sử dụng câu lệnh này là vô nghĩa vì nó không xác định được tên database xác thực
- db.createUser({‘user’: ‘set_user_db’, ‘pwd’: ‘set_password_db’, roles : [ { ‘setting_provider_pemission’ } ] }) thực hiện tạo và phần quyền tài khoản cho cơ sở dữ liệu chỉ định. Đây cũng là câu lệnh chính mà ta sẽ làm việc trong bài viết này.
Chú ý: Bạn cần biết khi truy cập vào csdl mongodb ta sẽ sử dụng lệnh mongo (sử dụng trên các hệ điều hành ubuntu/linux hay mac). Vì vậy bạn khi tạo user cho database mongodb sẽ xảy ra 2 trường hợp
TH1. Không chỉ định db sử dụng quyền. Với trường hợp này mongodb sẽ tự động detect chính cơ sở dữ liệu mà bạn đang truy cập để thiết lập role. Ví dụ:
use phone_solution
db.createUser({user: ’admin_phone’, pwd: ‘admin123’, roles: [‘readWrite’]})
- Tạo user cho db đang sử dụng (trong trường hợp này là phone_solution). Và thiết lập quyền đọc ghi cho nó
TH2: Chỉ định db khi tạo. Trường hợp này hay được sử dụng nhất và cũng rất rõ ràng, tường minh. Đoạn lệnh:
db.createUser({user: ‘admin_phone’, pwd: ‘admin123’, roles: [ {‘role’: ‘readWrite’, ‘db’: ‘phone_solution’ } ]})
Trước khi sang đọc tiếp phân 2 mình cần bạn chạy script này trong mongo để tạo 3 cơ sở dữ liệu để thuận tiện cho việc test trong bài viết bạn nhé. Tất nhiên bạn có thể thay đổi tùy thích với csdl của mình. Ở đây mình chỉ tạo theo ý mình để thuận tiện cho bài hướng dẫn:
2. Thiết lập role
Tài nguồn dữ liệu trang chủ phần thiết lập role, bạn có thể thấy rất nhiều role trong này. Tuy nhiên khi xem xét lại thì mình thấy cơ bản nó được chia ra làm 2 cụm to nhất là databaseRole (thiết lập role cho một cơ sở dữ liệu chỉ định) và allRole (thiết lập role cho tất cả các cơ sở dữ liệu). Đây là ý kiến chủ quan của mình và cung chỉ là cách mình viết vui thôi chứ thực ra cũng không có 2 cái role này đâu!!!. Mình cũng chưa tìm hiểu hết về một số role cho cluster vì chưa có điều kiện nên rất mong các cao nhân đón đọc chia giúp mình thêm một nhóm đặc biết nào đó nữa chăng hạn :#. Ở phần dưới này mình sẽ đề cập từng nhóm role đương nhiên không phải 2 cái nhóm role mà mình nói đâu nhé 😂
a. Nhóm Database User Role
- Nhóm này là thiết lập cho riêng database chỉ định. (nhớ là database được chỉ định thôi bạn nhé). nhóm này chỉ thao tác trên table thôi chứ không thêm hay sửa xóa các user truy cập vào hệ thống
- read: chỉ được phép đọc dữ liệu của db chỉ định
- readWrite: được phép đọc ghi, thực hiện các thao tác thêm, sửa, xóa trên các collection (table)
b. Database Administration Roles
- Bọn mẻo nói chỗ này rất khó hiểu 🙄. Nghe thì như là chỉ giành riêng thiết lập cho db admin vậy. Qua tìm hiểu mình mới biết là nó cũng chỉ là thiết lập trên một db được chỉ định. Có điều nó là được cấp một số quyền quản trị nhất định trên cơ sở dữ liệu chỉ định đó. Hi vọng là mình nói dê hiểu hơn mấy thánh mẻo 😆. Tương tự dưới đây là các quyền tưng ứng
- dbAdmin: quyền này cho phép bạn có quyền quản trị với database hiện tại. Nghe là quản trị nhưng nó chỉ được cấp phép quản trị một số thao tác nhất dịnh mà thôi. Có thể kể đến như lập lược đồ, chỉ mục, thu thập thống kê... Xem thêm các đặc quyền cụ thể tại mục
dbAdmin
. - userAdmin: Cung cấp các tạo và thay đổi quyền cho một user trên một cơ sở dữ liệu chỉ định. Tuy nhiên không chỉ thiết lập cho role user mà khi mình thực hiện thao tác với các collection thì thấy vẫn oke (tức là nó có thêm cả quyền readWrite bao gồm trong đó). Các đặc quyền của nó xem thêm tại
userAdmin
. - dbOwner: là sự kế hợp của 3 quyền dbAdmin, userAdmin và readWrite
c. All Database Roles
- Đây là quyền thiết lập chỉ dành cho database admin. Danh sách của nó bao gồm
- readAnyDatabase: giống quyền read ở trên tuy nhiên nó ko chỉ định 1 dabase mà là có thể đọc toàn bộ
- readWriteAnyDatabase: giống readAnyDatabase tuy nhiên nó có thêm và quyền write nữa (<=> Thêm, sửa, xóa ..)
- userAdminAnyDatabase: giống như userAdmin ở trên, có điều nó áp dụng trên toàn bộ db được cài đặt
- dbAdminAnyDatabase: giống như dbAdmin, có điều áp dụng được trên toàn bộ db được cài đặt.
d. Supperuser Roles
- Nó chỉ có duy nhất 1 quyền là quyền root . Đây cũng là quyền hạn cao nhất trong cơ sở dữ liệu mongodb. Người dùng được phép thêm, sửa, xóa các role user, add thêm user. Ngoài ra bạn có thể làm mọi thao tác thêm, sửa, xóa, đọc ghi với tất cả các cơ sở dữ liệu được cài đặt
Chú ý là: Chỉ sử dụng quyền root cho người quản trị có quyền tối cao nhất hệ thống. Như kiểu Barack Obama vậy 😎
Ngoài ra còn một số thiết lập quyền cho cluster. Trường hợp này mình chưa có cơ hội được sử dụng vì nó là một bài toàn rất lớn và phức tạp. Hi vọng sau này có cơ hội tiếp xúc với 1 dự án enterprise nào đó và được tham gia một dự án liên quan sẽ có cơ hội chia sẻ thêm mọi người về phần này.
3. Tự tạo role và thiết lập đặc quyền riêng
- Ngoài các thiết lập quyền mặc định mà mongodb cung cấp như mình đã đề cập ở trên thì chúng ta cũng có thể tự tạo một quyền riêng và tự thiết lập các quyền hạn nhất định. Nó sẽ là rất hữu ích khi bạn cần thiết lập 1 quyền riêng đặc thù cho các truy cập từ xa.
- Để có cài nhìn trực quan tốt nhất mình sẽ lấy 2 ví dụ đơn giản. 1 ví dụ đơn giản với thiết lập quyền tự tạo có tên 'develop' và 1 ví dụ phức tạp hơn chút với quyền tự tạo có tên 'promaster'. Dưới đây là là lập luận và mã code của 2 ví dụ
- Quyền 'develop': quyền này có khả năng
- readWrite database ‘phone_solution’.
- Đọc collection users trong database ‘company’.
- Cú pháp của nó như dưới đây:
- Quyền 'promaster': quyền này có tất cả các khả năng giống như quyền của develop ngoài ra nó còn có thêm các quyền khác như dưới đây
- Chỉ update được bảng chat trong database demo
- Có thêm khả năng truy cập db demo với quyền read.
- Cú pháp của nó trông giống như thế này:
- Để có cái nhìn trực quan hơn thì ngay khi tạo xong thiết lập trên bạn hay login vào db admin với các thông tin user và pass như 2 ví dụ trên và thực hiện các thao tác crud đơn giản xem sao nhé!
- Qua 2 ví dụ trên mình chỉ có một điều lưu ý là bạn cần nhớ cho mình 2 từ khóa chính này khi tạo một custom role cho user. Ví 2 từ khóa này cũng là cội nguồn của việc tạo nên các đặc quyền riêng
- roles : từ khóa này có ý nghĩa cung cấp lấy các role có sẵn trong mongodb (bao gồm cả các custom role đã tạo trước đó). Xem thêm các role mặc định mongodb cung cập tại mục Built-in Roles trên trang chủ
- privileges: từ khóa này có ý nghĩ cung cấp các đặc quyền riêng biệt mà như bạn đã nhìn thấy ở 2 ví dụ trên nó được thiết lập các action như 'find' hay 'update', nó còn có thể là remove, insert ... Ngoài ra còn có rất nhiều đặc quyền riêng khác mà bạn có thể tham khảo thêm tại mục privilege trên trang chủ.
Oke vậy là mình đã giới thiệu với các bạn cách thiết lập quyền cơ bản để làm việc với cơ sở dữ liệu Mongodb. Hi vọng nó hữu ích với các bạn khi tiến hành bắt đầu làm việc hay triển khai một hệ thống có sử dụng tới mongodb trên server. Chia sẻ bài viết và quan điểm của mình để mình và bạn cùng thêm học hỏi nhé! Hẹn gặp lại trong các bài viết tiếp theo 😉
Tham khảo