编写中间件验证登录和用户的访问权限
登录验证:
配置
config.checklogin = { enable: true, match: /^\/(admin|member)/, // 开启的url allow_active: { admin: [ /^\/admin\/index\/(login|logout)/, /^\/admin\/captcha/ ], member: [ /^\/member\/index\/(login|logout)/, /^\/member\/captcha/ ], }, jump_login_url: { // 未登录时访问跳转链接 admin: '/admin/index/login', member: '/member/index/login', }, };
验证
// middleware/checklogin.js module.exports = (options, app) => { return async function checkLoginMiddleware(ctx, next) { const active_url = ctx.request.path; const active_res= active_url.split('/'); // 以'/'分隔路径 const module_name = active_res[1]; let login_id = 0; switch (module_name) { // 获取登录id case 'admin': login_id = ctx.session.admin_id; break; case 'member': login_id = ctx.session.member_id; break; default:break; } let flag = !!login_id; if (!flag) { const allow_active_list = options.allow_active[module_name]; for (let allow_active of allow_active_list) { const active_res = active_url.match(allow_active); // 判定是否允许访问 if (active_res) { flag = true; break; } } } flag ? await next() : ctx.redirect(options.jump_login_url[module_name]); }; };
权限验证:
配置
config.adminauth = { enable: true, // 是否开启权限验证 match: /^\/admin/, // 开启的url allow_active: [ /^\/admin\/index\/(index|login|logout)/, /^\/admin\/(captcha|upload)/, // 无需验证的路径 ], };
验证
// middleware/adminauth.js module.exports = (options, app) => { return async function adminAuthMiddleware(ctx, next) { const allow_active_list = options.allow_active; const active_url = ctx.request.path; const act_list = ctx.session.act_list || 0; let flag = false; // 未分配权限和总管理员用户无需验证 if (act_list !== 0 && act_list !== 'all') { for (let allow_active of allow_active_list) { // 判定是否是无需验证的路径 const active_res = active_url.match(allow_active); if (active_res) { flag = true; break; } } if (!flag) { const act_arr = act_list.split(','); const active_url_arr = active_url.split('/'); // ['','admin','index','index'] if (active_url_arr.length === 4) { // 此处直接查询数据库,也可先提前缓存全部数据,通过缓存获取mod_id const mod = await ctx.model.Systemmodule.find({ // 权限查询匹配 where: { ctl: active_url_arr[2], act: active_url_arr[3], }, attributes: [ 'mod_id' ], raw: true, }); if (mod && act_arr.includes('' + mod.mod_id)) flag = true; // 验证是否在权限列表内 } } } else { flag = true; } if (flag) { await next(); } else { await ctx.error('权限不足'); } }; };
主要就是验证这块,其他的就是对数据的增删改查然后在前端展示,这些就不做详细的描述,想了解的话可直接前往查看代码:egg.js开发后台权限管理系统项目源码