用户权限管理 #

一、用户管理概述 #

ArangoDB提供完善的用户权限管理系统,支持数据库级别和集合级别的权限控制。

1.1 权限级别 #

权限 说明
none 无权限
ro 只读权限
rw 读写权限
admin 管理员权限

1.2 权限范围 #

text
权限范围:
├── 系统级:用户管理、数据库创建
├── 数据库级:数据库访问权限
└── 集合级:集合访问权限

二、用户操作 #

2.1 创建用户 #

JavaScript创建:

javascript
require("@arangodb/users").save("newuser", "password123");

带选项创建:

javascript
require("@arangodb/users").save("newuser", "password123", true, {
    name: "新用户",
    email: "newuser@example.com"
});

2.2 查看用户 #

查看所有用户:

javascript
require("@arangodb/users").all();

查看单个用户:

javascript
require("@arangodb/users").document("newuser");

2.3 修改用户 #

修改密码:

javascript
require("@arangodb/users").update("newuser", "newpassword123");

修改用户信息:

javascript
require("@arangodb/users").update("newuser", null, {
    name: "更新后的名称",
    email: "updated@example.com"
});

2.4 删除用户 #

javascript
require("@arangodb/users").remove("newuser");

2.5 验证用户 #

javascript
require("@arangodb/users").auth("newuser", "password123");

三、数据库权限 #

3.1 授予数据库权限 #

javascript
require("@arangodb/users").grantDatabase("newuser", "mydb", "rw");

3.2 撤销数据库权限 #

javascript
require("@arangodb/users").revokeDatabase("newuser", "mydb");

3.3 查看数据库权限 #

javascript
require("@arangodb/users").database("newuser", "mydb");

3.4 查看用户所有数据库权限 #

javascript
require("@arangodb/users").databases("newuser");

四、集合权限 #

4.1 授予集合权限 #

javascript
require("@arangodb/users").grantCollection("newuser", "mydb", "users", "rw");

4.2 撤销集合权限 #

javascript
require("@arangodb/users").revokeCollection("newuser", "mydb", "users");

4.3 查看集合权限 #

javascript
require("@arangodb/users").collection("newuser", "mydb", "users");

4.4 查看用户所有集合权限 #

javascript
require("@arangodb/users").collections("newuser", "mydb");

五、角色管理 #

5.1 内置角色 #

角色 说明
root 超级管理员
admin 数据库管理员
user 普通用户

5.2 创建角色 #

ArangoDB没有显式的角色概念,通过权限组合实现:

javascript
function createUserWithRole(username, password, role) {
    require("@arangodb/users").save(username, password);
    
    switch(role) {
        case "readonly":
            require("@arangodb/users").grantDatabase(username, "mydb", "ro");
            break;
        case "readwrite":
            require("@arangodb/users").grantDatabase(username, "mydb", "rw");
            break;
        case "admin":
            require("@arangodb/users").grantDatabase(username, "*", "rw");
            break;
    }
}

5.3 权限模板 #

javascript
var permissionTemplates = {
    readOnly: {
        mydb: "ro"
    },
    readWrite: {
        mydb: "rw"
    },
    admin: {
        "*": "rw"
    }
};

function applyPermissionTemplate(username, template) {
    var permissions = permissionTemplates[template];
    for (var db in permissions) {
        require("@arangodb/users").grantDatabase(username, db, permissions[db]);
    }
}

六、安全配置 #

6.1 启用认证 #

配置文件:

conf
[server]
authentication = true

6.2 修改root密码 #

javascript
require("@arangodb/users").update("root", "newStrongPassword");

6.3 密码策略 #

javascript
function validatePassword(password) {
    if (password.length < 8) {
        throw new Error("密码长度至少8位");
    }
    if (!/[A-Z]/.test(password)) {
        throw new Error("密码必须包含大写字母");
    }
    if (!/[a-z]/.test(password)) {
        throw new Error("密码必须包含小写字母");
    }
    if (!/[0-9]/.test(password)) {
        throw new Error("密码必须包含数字");
    }
    return true;
}

6.4 SSL配置 #

conf
[ssl]
keyfile = /path/to/server.pem

七、实战示例 #

7.1 创建应用用户 #

javascript
function createAppUser(appName, permissions) {
    var username = appName + "_app";
    var password = generateRandomPassword();
    
    require("@arangodb/users").save(username, password);
    
    for (var db in permissions) {
        require("@arangodb/users").grantDatabase(username, db, permissions[db]);
    }
    
    return {
        username: username,
        password: password
    };
}

var appUser = createAppUser("myapp", {
    mydb: "rw",
    logs: "ro"
});
print(appUser);

7.2 批量创建用户 #

javascript
var users = [
    { username: "user1", password: "pass1", databases: { mydb: "ro" } },
    { username: "user2", password: "pass2", databases: { mydb: "rw" } },
    { username: "user3", password: "pass3", databases: { mydb: "rw", logs: "ro" } }
];

users.forEach(function(user) {
    require("@arangodb/users").save(user.username, user.password);
    for (var db in user.databases) {
        require("@arangodb/users").grantDatabase(
            user.username, 
            db, 
            user.databases[db]
        );
    }
});

7.3 用户权限审计 #

javascript
function auditUserPermissions(username) {
    var user = require("@arangodb/users").document(username);
    var dbPermissions = require("@arangodb/users").databases(username);
    
    var result = {
        username: username,
        active: user.active,
        databases: {}
    };
    
    dbPermissions.forEach(function(db) {
        var dbName = db.database;
        var perm = db.grant;
        result.databases[dbName] = {
            permission: perm,
            collections: {}
        };
        
        try {
            var collections = require("@arangodb/users").collections(username, dbName);
            collections.forEach(function(coll) {
                result.databases[dbName].collections[coll.collection] = coll.grant;
            });
        } catch (e) {
            // 数据库可能不存在
        }
    });
    
    return result;
}

print(JSON.stringify(auditUserPermissions("newuser"), null, 2));

八、最佳实践 #

8.1 最小权限原则 #

text
原则:
├── 只授予必要的权限
├── 避免使用root账户
├── 应用使用专用账户
└── 定期审查权限

8.2 密码管理 #

text
建议:
├── 使用强密码
├── 定期更换密码
├── 不同环境使用不同密码
└── 使用密码管理器

8.3 用户命名规范 #

text
命名规范:
├── 应用用户:app_<应用名>
├── 只读用户:ro_<用途>
├── 管理用户:admin_<用途>
└── 服务用户:svc_<服务名>

九、常见问题 #

9.1 忘记root密码 #

  1. 停止ArangoDB服务
  2. 修改配置文件禁用认证:
conf
[server]
authentication = false
  1. 启动服务
  2. 重置密码:
javascript
require("@arangodb/users").update("root", "newPassword");
  1. 恢复认证配置

9.2 权限不生效 #

javascript
require("@arangodb/users").reload();

9.3 查看当前用户 #

javascript
db._currentUser();

十、总结 #

用户权限管理要点:

  1. 用户操作:创建、修改、删除用户
  2. 数据库权限:grantDatabase、revokeDatabase
  3. 集合权限:grantCollection、revokeCollection
  4. 安全配置:认证、SSL、密码策略
  5. 最佳实践:最小权限、强密码、定期审计

下一步,让我们学习备份与恢复!

最后更新:2026-03-27