手记

egg开发权限管理系统(2)验证

    编写中间件验证登录和用户的访问权限

登录验证:

  • 配置

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开发后台权限管理系统项目源码

0人推荐
随时随地看视频
慕课网APP