pinclub/pinclub

View on GitHub
middlewares/auth.js

Summary

Maintainability
A
2 hrs
Test Coverage
var mongoose = require('mongoose');
var UserModel = mongoose.model('User');
var Message = require('../proxy').Message;
var config = require('../config');
var EventProxy = require('eventproxy');
var UserProxy = require('../proxy').User;

/**
 * 需要管理员权限
 */
exports.adminRequired = function (req, res, next) {
    if (!req.session.user) {
        return res.render('notify/notify', {error: '你还没有登录。'});
    }

    if (!req.session.user.is_admin) {
        return res.render('notify/notify', {error: '需要管理员权限。'});
    }

    next();
};

/**
 * 需要登录
 */
exports.userRequired = function (req, res, next) {
    if (!req.session || !req.session.user || !req.session.user._id) {
        return res.status(403).send('forbidden!');
    }

    next();
};

/**
 * 需要登录,弹出登录框
 */
exports.userSigninRequired = function (req, res, next) {
    if (!req.session || !req.session.user || !req.session.user._id) {
        req.session._loginReferer = req.headers.referer || req.url;
        res.render('sign/signin', {page: 'signin'});
        return;
    }

    next();
};

exports.blockUser = function () {
    return function (req, res, next) {
        if (req.path === '/signout') {
            return next();
        }

        if (req.session.user && req.session.user.is_block && req.method !== 'GET') {
            return res.status(403).send({success: false, msg: '您已被管理员屏蔽了。有疑问请联系管理员。'});
        }
        next();
    };
};


function gen_session(user, res) {
    var auth_token = user._id + '$$$$'; // 以后可能会存储更多信息,用 $$$$ 来分隔
    var opts = {
        path: '/',
        maxAge: 1000 * 60 * 60 * 24 * 30,
        signed: true,
        httpOnly: true
    };
    res.cookie(config.auth_cookie_name, auth_token, opts); //cookie 有效期30天
}

exports.gen_session = gen_session;

// 验证用户是否登录
exports.authUser = function (req, res, next) {
    var ep = new EventProxy();
    ep.fail(next);

    // Ensure current_user always has defined.
    res.locals.current_user = null;

    if (config.debug && req.cookies['mock_user']) {
        var mockUser = JSON.parse(req.cookies['mock_user']);
        req.session.user = new UserModel(mockUser);
        if (mockUser.is_admin) {
            req.session.user.is_admin = true;
        }
        return next();
    }

    ep.all('get_user', function (user) {
        if (!user) {
            return next();
        }
        user = res.locals.current_user = req.session.user = new UserModel(user);

        if (config.admins.hasOwnProperty(user.loginname)) {
            user.is_admin = true;
        }

        Message.getMessagesCount(user._id, ep.done(function (count) {
            user.messages_count = count;
            next();
        }));
    });

    if (req.session.user) {
        ep.emit('get_user', req.session.user);
    } else {
        var auth_token = req.signedCookies[config.auth_cookie_name];
        if (!auth_token) {
            return next();
        }

        var auth = auth_token.split('$$$$');
        var user_id = auth[0];
        UserProxy.getUserById(user_id, ep.done('get_user'));
    }
};