用户权限管理 #
一、用户管理概述 #
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密码 #
- 停止ArangoDB服务
- 修改配置文件禁用认证:
conf
[server]
authentication = false
- 启动服务
- 重置密码:
javascript
require("@arangodb/users").update("root", "newPassword");
- 恢复认证配置
9.2 权限不生效 #
javascript
require("@arangodb/users").reload();
9.3 查看当前用户 #
javascript
db._currentUser();
十、总结 #
用户权限管理要点:
- 用户操作:创建、修改、删除用户
- 数据库权限:grantDatabase、revokeDatabase
- 集合权限:grantCollection、revokeCollection
- 安全配置:认证、SSL、密码策略
- 最佳实践:最小权限、强密码、定期审计
下一步,让我们学习备份与恢复!
最后更新:2026-03-27