编写中间件验证登录和用户的访问权限
登录验证:
配置
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开发后台权限管理系统项目源码
點擊查看更多內容
為 TA 點贊
評論
評論
共同學習,寫下你的評論
評論加載中...
作者其他優質文章
正在加載中
感謝您的支持,我會繼續努力的~
掃碼打賞,你說多少就多少
贊賞金額會直接到老師賬戶
支付方式
打開微信掃一掃,即可進行掃碼打賞哦