我真的迷路了,很想得到一些帮助,这使我很困惑。
我的数据库结构如下:
表->用户(具有role_id)
表->角色(具有role_id,role_name)
基于用户的role_id,我想使用role_id进行身份验证。
这是我的路线:
router.get('/.isadmin', jwtAuth, authorizedRoles('admin'), function(req, res) {
const { id, orgId, role_id } = req.user.attributes;
res.json({
success: true,
id,
orgId,
roleId: role_id
})
});
这是我的策略:
passport.use(new JwtStrategy(opts, function(jwt_payload, done) {
// User.where('id', jwt_payload.id).fetch({withRelated: 'roles'})
console.log('jwt_payload', jwt_payload)
User.where('id', jwt_payload.id).fetch({withRelated: 'roles'})
.then(user => user ? done(null, user) : done(null, false))
.catch(err => done(err, false));
}));
这是我的用户模型:
const Role = require('./role');
module.exports = bookshelf.Model.extend({
tableName: 'user',
roles() {
return this.hasMany(Role, 'role_id')
},
这是我的榜样:
module.exports = bookshelf.Model.extend({
tableName: 'roles'
});
这是我的authorizedRoles()函数(尚未完成)。我遇到的问题是,我希望能够传递authorizedRoles('admin'),并且从逻辑上讲,如果通过身份验证的用户的role_id = 2,则它应该与表匹配->角色条目,其中role_id = 2且与role_name =“管理员”
module.exports = function(...authorizedRoles) {
return function (req, res, next) {
const user = req.user.attributes;
const currentUserRole = req.user.attributes.role_id;
const validRoles = req.roles;
// const currentUserRoles = validRoles.find(currentUserRole);
const test = req.user.related('roles');
const currentUserRoles = req.user.related('roles').models.map(role => {
debugger;
// return role.attributes.role_id === currentUserRole;
return role.attributes.role_id
});
if (!_.intersection(currentUserRoles, authorizedRoles).length) {
res.status(403);
res.send('Not permitted');
return;
}
next();
}
};
对于我的问题:
req.user.related('roles').models.map(role => {
仅返回一个角色,该角色与用户表中用户的ID与表角色中的role_id相匹配。它应与表(用户) role_id -> 表(角色) role_id