Я пытаюсь реализовать управление доступом на основе ролей в приложении node.js, используя bookshelf.js как ORM для Postgresql. У меня есть следующая схема:Множественные отношения в bookshelf.js
USERS <- USERS_ROLES -> ROLES <- ROLES_RIGHTS -> RIGHTS
Я хотел бы иметь возможность получить все права, принадлежащие пользователю. В SQL Server, я бы просто сделать это:
SELECT rights.*
FROM rights
INNER JOIN roles_rights ON roles_rights.right_id=rights.id
INNER JOIN users_roles ON users_roles.role_id = roles_rights.role_id
WHERE users_roles.user_id=1
GROUP BY rights.id
Будучи относительно новым Bookshelf.js, у меня возникают некоторые проблемы, выяснить, как установить связь. Здесь была моя первая попытка:
const User = bookshelf.Model.extend({
tableName: 'users',
roles: function() {
return this.belongsToMany(Role, 'users_roles', 'user_id', 'role_id')
},
rights: function() {
return this.belongsToMany(Right, 'users_roles', 'user_id', 'role_id')
.query(qb => qb
.innerJoin('roles_rights', 'roles_rights.right_id', 'rights.id')
)
}
})
const Role = bookshelf.Model.extend({
tableName: 'roles',
rights: function() {
return this.belongsToMany(Right, 'roles_rights', 'role_id', 'right_id')
},
users: function() {
return this.belongsToMany(User, 'users_roles', 'user_id', 'role_id')
}
})
const Right = bookshelf.Model.extend({
tableName: 'rights',
roles: function() {
return this.belongsToMany(Role, 'users_roles', 'user_id', 'role_id')
}
})
Это не сработало ... :-(
В конце концов, я хочу, чтобы сделать эту работу запроса:
User.where({ id: req.user.get('id') })
.fetch({ withRelated: ['rights'] })
.then(user => {
...
})
})
Любая помощь будет высоко оценен !