|
|
var path = require("path");
|
|
|
// 引入自定义的 DAO 模块,可能包含了对数据库操作的相关函数
|
|
|
daoModule = require("./DAO");
|
|
|
// 引入位于 modules/database 目录下的数据库模块,使用 path.join 拼接当前工作目录和相对路径
|
|
|
databaseModule = require(path.join(process.cwd(), "modules/database"));
|
|
|
|
|
|
/**
|
|
|
* 获取权限列表
|
|
|
*
|
|
|
* @param {Function} cb 回调函数,用于处理获取权限列表的结果
|
|
|
* 当获取权限列表操作完成时调用此函数,若出现错误,第一个参数将包含错误信息,若成功,第一个参数为 null,第二个参数为权限列表结果
|
|
|
*/
|
|
|
module.exports.list = function (cb) {
|
|
|
// 从数据库模块中获取数据库对象
|
|
|
db = databaseModule.getDatabase();
|
|
|
// 定义 SQL 查询语句,使用 LEFT JOIN 连接 sp_permission_api 和 sp_permission 表
|
|
|
// 筛选出 sp_permission 表的 ps_id 不为空的记录
|
|
|
sql = "SELECT * FROM sp_permission_api as api LEFT JOIN sp_permission as main ON main.ps_id = api.ps_id WHERE main.ps_id is not null";
|
|
|
// 执行 SQL 查询操作
|
|
|
database.driver.execQuery(sql, function (err, result) {
|
|
|
if (err) return cb("获取权限列表失败", null);
|
|
|
cb(null, result);
|
|
|
});
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 权限验证
|
|
|
*
|
|
|
* @param {[type]} rid 角色 ID,用于标识用户的角色,可能是数字类型,不同角色拥有不同的权限
|
|
|
* @param {[type]} serviceName 服务名,可能是要访问的服务的名称,例如 API 服务的名称
|
|
|
* @param {[type]} actionName 动作名,可能是对服务的具体操作名称,例如 GET、POST 等操作
|
|
|
* @param {Function} cb 回调函数,用于处理权限验证的结果
|
|
|
* 当权限验证操作完成时调用此函数,若出现错误,第一个参数将包含错误信息,若验证通过,第一个参数为 null,第二个参数为 true;若验证不通过,第一个参数包含相应的错误信息,第二个参数为 false
|
|
|
*/
|
|
|
module.exports.authRight = function (rid, serviceName, actionName, cb) {
|
|
|
// 超级管理员权限验证,若角色 ID 为 0,则直接认为有权限
|
|
|
if (rid == 0) return cb(null, true);
|
|
|
// 权限验证过程
|
|
|
// 使用 daoModule 的 findOne 方法查找 PermissionAPIModel 类型的对象
|
|
|
daoModule.findOne("PermissionAPIModel", {"ps_api_service": serviceName, "ps_api_action": actionName}, function (err, permissionAPI) {
|
|
|
// 打印当前角色 ID、服务名和动作名,方便调试
|
|
|
console.log("rid => %s,serviceName => %s,actionName => %s", rid, serviceName, actionName);
|
|
|
// 若出现错误或未找到权限 API 对象,认为无权限
|
|
|
if (err ||!permissionAPI) return cb("无权限访问", false);
|
|
|
// 查找 RoleModel 类型的对象,获取角色信息
|
|
|
daoModule.findOne("RoleModel", {"role_id": rid}, function (err, role) {
|
|
|
console.log(role);
|
|
|
// 若出现错误或未找到角色对象,认为获取角色信息失败
|
|
|
if (err ||!role) return cb("获取角色信息失败", false);
|
|
|
// 将角色的 ps_ids 以逗号分隔存储在数组中
|
|
|
ps_ids = role.ps_ids.split(",");
|
|
|
// 遍历 ps_ids 数组
|
|
|
for (idx in ps_ids) {
|
|
|
ps_id = ps_ids[idx];
|
|
|
// 若权限 API 的 ps_id 与角色的某个 ps_id 相等,认为有权限
|
|
|
if (parseInt(permissionAPI.ps_id) == parseInt(ps_id)) {
|
|
|
return cb(null, true);
|
|
|
}
|
|
|
}
|
|
|
// 若遍历完都不满足条件,认为无权限
|
|
|
return cb("无权限访问", false);
|
|
|
});
|
|
|
});
|
|
|
} |