LoopBack操作钩子过滤数据

来源:互联网 发布:淘宝图片护盾入口 编辑:程序博客网 时间:2024/06/05 14:33

最近项目使用node.js+LoopBack+mongdb+mysql框架。在权限控制时候需要根据用户的权限去加载其能看到的数据。因此对loopback的操作钩子进行了研究处理。

代码如下:首先在server.js中使用中间件进行用户权限设置的操作。包括其能看到某些id的数据。此处必须在中间件中定义,否则在LoopBack的上下文对象中是得不到req和res数据的。

app.use(function setCurrentUser(req, res, next) {
    var loopbackContext = loopback.getCurrentContext();
    var adminlogined = req.session.adminlogined || false;
    if (adminlogined) {
        loopbackContext.set('parkinglotIds', (req.session.adminUserInfo && req.session.adminUserInfo.parkinglotIds));
        loopbackContext.set('isadmin', req.session.isadmin || false);
    }
    else {
        loopbackContext.set('parkinglotIds', ["lebo"]);
        loopbackContext.set('isadmin', false);
    }
    next();
});

然后在common中的需要控制数据的表结构的js文件中做如下修改:

var loopback = require('loopback');
module.exports = function (Parkinglot) {
    Parkinglot.observe('access', function logQuery(ctx, next) {
        var lctx = loopback.getCurrentContext();//此处获得设置的数据
        var parkinglotIds = lctx && lctx.get("parkinglotIds");
        var isadmin = lctx && lctx.get("isadmin");

//以下代码根据自己需要进行修改
        if ((!parkinglotIds) || isadmin || ctx.options.charging) {
            next();
        }
        else {
            var i = 0;
            var original = null;
            for (var name in ctx.query.where) {
                i++;
                original = ctx.query.where;
            }
            if (i > 0) {
                if (ctx.query.where.and) {
                    ctx.query.where.and.push({ id: { inq: parkinglotIds } });//如果限制了当前表只能查看某些id的数据。则在此处增加查询条件即可。
                }
                else {
                    ctx.query.where = {};
                    ctx.query.where.and = [];
                    ctx.query.where.and.push({ id: { inq: parkinglotIds } });
                    if (original) {
                        ctx.query.where.and.push(original);
                    }
                }
            }
            else {
                ctx.query.where = {};
                ctx.query.where.and = [];
                ctx.query.where.and.push({ id: { inq: parkinglotIds } });
            }
            next();
        }
    });
};

0 0