auth.js 1.64 KB
/**
 * 认证中间件
 * @author h1bomb
 */


var _= require('lodash');

var options=require('../staticConfig.js').staticDir;

/**
 * 不需要权限校验配置
 */
var guestAccessList = {
    "POST:/login":true,
    "GET:/logout":true
}

var NO_AUTH = '没有权限!';

/**
 * 认证中间件
 * @param  {Object} req  请求对象
 * @param  {Object} res  响应对象
 * @param  {Function} next 执行下个中间件
 * @return {void}       无返回
 */
module.exports = function(req, res, next) {

    //方法名称
    var method = req.method;

    
    //访问路由路径
    var path = req.route?req.route.path:'';
    if(req.session.user&&!checkPath(req.path,req)) {
        res.status(403);
        res.render('error/error_nolayout',{message:NO_AUTH,layout:false});
        return;
    }
    //进行白名单验证和session验证
    if(guestAccessList[method+":"+path]||req.session.user) {
        //判断是否已存在appendData
        if(!res.appendData) {
            res.appendData = req.session.user;
        } else {
            res.appendData = _.merge(res.appendData,req.session.user);
        }
        next();
    } else {
        console.info("CurentView:Login");
        //如果是登陆界面不加载布局
        res.render('pages/login',{layout:false});
    }
}

/**
 * 检查路径是否没有权限
 * @param  {String} path
 * @param {Object} req
 * @return {Boolean}
 */
function checkPath(path,req) {
    var right = req.session.user.noRight;
    var ret = true;
    _.forEach(right,function(v,k){
        if(path.indexOf(k)>-1) {
            console.log(k);
            ret = false;
            return;
        }
    });
    return ret;
}