在現代的 Web 應用中,許可權管理是必不可少的一部分。但是在實現許可權管理時,我們需要處理各種各樣的問題,例如用戶與角色、角色與許可權之間的關係,如何在前端和後端保持同步,如何實現細粒度的許可權控制,以及如何應對變化和擴展等等。這些問題對於開發者來說是非常繁瑣且難以解決的。
在這個問題上,sudosu- 來解救我們!sudosu- 是一款輕量級、簡單易用的許可權管理框架,提供了強大的 ACL(訪問控制列表)功能和易於擴展的架構。它可以幫助你更快捷、更可靠地實現許可權管理,並幫你應對變化和擴展。
一、快速入門
首先讓我們來看一個最簡單的入門示例。假設我們有一個用戶表和一個文檔表,我們想要限制用戶只能查看、修改和刪除自己的文檔。我們可以用 sudosu- 來實現這個功能,示例代碼如下:
const sudosu = require('sudosu');
// 首先定義一個 ACL 對象
const acl = sudosu.createAcl();
// 添加角色和許可權
acl.allow('user', 'document', ['view', 'edit', 'delete']);
// 下面是一個用戶查看、修改和刪除文檔的例子
const user = { id: 123 };
const document = { id: 456, owner: 123 };
// 用戶查看文檔
if (acl.isAllowed(user.id, 'document', 'view')) {
console.log('用戶可以查看文檔');
} else {
console.log('用戶無權查看文檔');
}
// 用戶修改文檔
if (acl.isAllowed(user.id, 'document', 'edit', { owner: document.owner })) {
console.log('用戶可以修改文檔');
} else {
console.log('用戶無權修改文檔');
}
// 用戶刪除文檔
if (acl.isAllowed(user.id, 'document', 'delete', { owner: document.owner })) {
console.log('用戶可以刪除文檔');
} else {
console.log('用戶無權刪除文檔');
}
這個示例中,我們定義了一個 ACL 對象,並為角色 user 添加了許可權 document:view、document:edit 和 document:delete。然後我們模擬了一個用戶查看、修改和刪除文檔的場景,使用 acl.isAllowed() 方法來檢查用戶是否有權執行相應的操作。
二、ACL 與角色
在 sudosu- 中,我們可以通過 Allow 和 Deny 方式為角色設置許可權。例如,我們可以為管理員和普通用戶設置不同的訪問許可權:
const acl = sudosu.createAcl();
// 添加管理員角色和許可權
acl.allow('admin', 'users', ['view', 'edit', 'delete']);
acl.allow('admin', 'documents', ['view', 'edit', 'delete']);
// 添加普通用戶角色和許可權
acl.allow('user', 'users', ['view', 'edit profile']);
acl.allow('user', 'documents', ['view', 'create own', 'edit own', 'delete own']);
// 檢查用戶是否有權查看某個文檔
if (acl.isAllowed(user.id, 'documents', 'view', { owner: document.owner })) {
console.log('用戶可以查看該文檔');
} else {
console.log('用戶無權查看該文檔');
}
// 檢查用戶是否有權編輯某個文檔
if (acl.isAllowed(user.id, 'documents', 'edit own', { owner: document.owner })) {
console.log('用戶可以編輯該文檔');
} else {
console.log('用戶無權編輯該文檔');
}
在上面的示例中,我們為管理員和普通用戶定義了不同的許可權。管理員可以訪問和編輯用戶和文檔,而普通用戶只能編輯自己的文檔和資料。我們使用 acl.isAllowed() 方法來檢查用戶是否有權執行相應的操作。注意,我們使用了 `edit own` 來限制用戶只能編輯自己的文檔。
三、ACL 與資源
在 sudosu- 中,許可權控制是針對資源的,資源可以是一個頁面、一個文件、一個數據集合等等。在實現許可權控制時,我們需要明確資源的概念,以便對其進行 ACL 配置。例如,我們可以為用戶、文章和評論設置不同的許可權:
const acl = sudosu.createAcl();
// 添加用戶角色和許可權
acl.allow('user', 'comments', ['view own', 'edit own', 'delete own']);
acl.allow('user', 'articles', ['view', 'edit own', 'delete own', 'comment']);
// 添加管理員角色和許可權
acl.allow('admin', 'comments', ['view', 'edit any', 'delete any']);
acl.allow('admin', 'articles', ['view any', 'edit any', 'delete any', 'comment']);
// 定義兩個示例用戶
const user1 = { id: '123', is_admin: false };
const user2 = { id: '456', is_admin: true };
// 檢查用戶 1 是否有權刪除自己的評論
if (acl.isAllowed(user1.id, 'comments', 'delete own', { user_id: user1.id })) {
console.log('用戶 1 可以刪除自己的評論');
} else {
console.log('用戶 1 無權刪除自己的評論');
}
// 檢查用戶 1 是否有權編輯文章
if (acl.isAllowed(user1.id, 'articles', 'edit', { author_id: user1.id })) {
console.log('用戶 1 可以編輯自己的文章');
} else {
console.log('用戶 1 無權編輯自己的文章');
}
// 檢查用戶 2 是否有權刪除評論
if (acl.isAllowed(user2.id, 'comments', 'delete any')) {
console.log('用戶 2 可以刪除任何評論');
} else {
console.log('用戶 2 無權刪除任何評論');
}
在這個示例中,我們定義了兩個角色(user 和 admin)和兩個資源(comments 和 articles),並為它們設置了不同的許可權。我們使用 `view own` 和 `delete own` 來限制用戶只能查看和刪除自己的評論,而使用 `view any`、`edit any` 等來允許管理員查看和編輯任何資源。
四、構建自定義驗證函數
sudosu- 為我們提供了許多常用的驗證函數,但如果我們需要更複雜的驗證邏輯,可以通過構建自定義函數來實現。例如,我們可以針對用戶的角色、等級、是否關注等因素進行驗證。
const acl = sudosu.createAcl();
const db = require('./database');
// 定義一個自定義驗證函數
function checkFollower(user, author, cb) {
db.isFollowing(user.id, author.id, (err, isFollowing) => {
if (err) return cb(err);
if (isFollowing) {
cb(null, true); // 驗證通過
} else {
cb(null, false); // 驗證未通過
}
});
}
// 添加一個許可權規則
acl.allow('user', 'articles', 'edit', checkFollower);
// 檢查用戶是否能夠編輯文章
if (acl.isAllowed(user.id, 'articles', 'edit', { author_id: author.id })) {
console.log('用戶可以編輯文章');
} else {
console.log('用戶無權編輯文章');
}
在這個示例中,我們定義了一個自定義驗證函數 checkFollower,它會在用戶編輯文章時檢查該用戶是否關注了作者。我們使用 acl.allow() 方法來為角色添加許可權,其中第四個參數是一個自定義驗證函數。然後我們使用 acl.isAllowed() 方法來檢查用戶是否有權執行相應的操作。
五、結語
在上面的幾個例子中,我們演示了如何使用 sudosu- 實現簡單、複雜的許可權管理。sudosu- 提供了一套強大的 ACL 功能和易於擴展的架構,可以幫助我們更快、更可靠地實現許可權管理。
如果你想了解更多關於 sudosu- 的使用方法和內部原理,請參考官方文檔。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/271747.html