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); }); }); }