2017-03-07 21 views
1

我一直在阅读文档,但我似乎无法做到正确。如何在FeathersJS中构造条件钩子?

我想通过包装一些提供的钩子来实现自定义条件钩子。它应该限制访问服务(该方法并不重要)是:

1)首先检查用户是否使用具有adminsuper-admin角色:

auth.restrictToRoles({ 
    roles: ['admin', 'super-admin'] 
}), 

如果用户有需要的角色,挂钩应该允许访问。否则..

2)使用限制访问业主:

auth.restrictToOwner({ ownerField: 'id' }), 

我想不通的是如何获取和检查auth.restrictToRoles结果,所以如果需要,我可以运行auth.restrictToOwner

任何帮助将不胜感激!

回答

2

有两种选择。更容易的是不使用预先构建的钩子。几乎每个预先构建的钩子都可以通过几行代码自行实现。它看起来是这样的:

app.service('myservice').before({ 
    find(hook) { 
    const { user } = hook.params; 
    const {roles } = user; 

    if(roles.indexOf('admin') !== -1 && roles.indexOf('super-admin') !== -1) { 
     hook.params.query.userId = user._id; 
    } 
    } 
}); 

另一种方法是创建一个包装挂钩,首先调用restrictToRoles然后catches任何错误(请注意,它不是完全实现它自己的基本上更多的代码):

const restrictToRoles = auth.restrictToRoles({ 
    roles: ['admin', 'super-admin'] 
}); 
const restrictToOwner = auth.restrictToOwner({ ownerField: 'id' }); 

app.service('myservice').before({ 
    find(hook) { 
    return restrictToRoles(hook).catch(() => restrictToOwner(hook)); 
    } 
}); 
+0

太棒了,谢谢。我最终选择了两种组合,并且运行良好。 – forgot