MEAN js需要授权才能列出项目

时间:2014-12-30 13:00:43

标签: javascript angularjs node.js mean-stack

在我的意思是js app我有一个帐户模型和相应的路由和控制器。要删除特定帐户,我需要获得授权,我需要登录。

但是,所有用户都可以列出所有帐户,我只会列出特定用户创建的帐户。所以我需要将自动化添加到代码的列表部分。

我使用app.route('/accounts')users.requiresLogin更新accounts.hasAuthorization的路线,如下所示:

module.exports = function(app) {
    var users = require('../../app/controllers/users.server.controller');
    var accounts = require('../../app/controllers/accounts.server.controller');

    // Accounts Routes
    app.route('/accounts')
        .get(users.requiresLogin,accounts.hasAuthorization,accounts.list)
        .post(users.requiresLogin, accounts.create);

    app.route('/accounts/:accountId')
        .get(users.requiresLogin, accounts.hasAuthorization,accounts.read)
        .put(users.requiresLogin, accounts.hasAuthorization, accounts.update)
        .delete(users.requiresLogin, accounts.hasAuthorization, accounts.delete);

    // Finish by binding the Account middleware
    app.param('accountId', accounts.accountByID);
};

现在我得到一个错误,因为没有为用户提供req。

  

获取/modules/accounts/views/list-accounts.client.view.html 304 8.266   ms - - TypeError:无法读取属性' user'未定义的       at exports.hasAuthorization(/Users/david/Repositories/budget/app/controllers/accounts.server.controller.js:103:17)

所以我想我需要以某种方式更新accounts.server.controller。删除帐户确实在req中提供了一个帐户,因此只有创建者才能删除,如前所述。如何更新代码以便"帐户列表"部分工作并仅列出属于该特定用户的帐户?

/**
 * Delete an Account
 */
exports.delete = function(req, res) {
    var account = req.account ;

    account.remove(function(err) {
        if (err) {
            return res.status(400).send({
                message: errorHandler.getErrorMessage(err)
            });
        } else {
            res.jsonp(account);
        }
    });
};

/**
 * List of Accounts
 */
exports.list = function(req, res) {
    Account.find().sort('-created').populate('user', 'displayName').exec(function(err, accounts) {
        if (err) {
            return res.status(400).send({
                message: errorHandler.getErrorMessage(err)
            });
        } else {
            res.jsonp(accounts);
        }
    });
};

/**
 * Account middleware
 */
exports.accountByID = function(req, res, next, id) { 
    Account.findById(id).populate('user', 'displayName').exec(function(err, account) {
        if (err) return next(err);
        if (! account) return next(new Error('Failed to load Account ' + id));
        req.account = account ;
        next();
    });
};

/**
 * Account authorization middleware
 */
exports.hasAuthorization = function(req, res, next) {
    if (req.account.user.id !== req.user.id) {
        return res.status(403).send('User is not authorized');
    }
    next();
};

帐户客户端服务仅包含基本内容:

//Accounts service used to communicate Accounts REST endpoints
angular.module('accounts').factory('Accounts', ['$resource',
    function($resource) {
        return $resource('accounts/:accountId', { accountId: '@_id'
        }, {
            update: {
                method: 'PUT'
            }
        });
    }
]);

控制器中未提及用户对象。

1 个答案:

答案 0 :(得分:1)

accounts.hasAuthorization假设它在您的当前配置req.account上的accounts.accountById之后执行将是未定义的。

我想知道你的帐户模型中的某个地方:

user: {
    type: Schema.ObjectId,
    ref: 'User'
}

如果您希望用户只能访问他/她拥有的帐户:

  • 将accounts.list路由更改为仅需要登录,这样我们就可以访问req.user:

    app.route('/accounts')
             .get(users.requiresLogin,accounts.list)
    
  • 更改帐户控制器中的exports.list:

    exports.list = function(req, res) {
        Account.find({user: req.user._id}).sort('-created')
    .... //
    
    };