You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
vue-shop-admin-work/dao/PermissionAPIDAO.js

64 lines
3.6 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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