Я делаю свое первое приложение на Ruby on Rails и пытаюсь применить таблицу RBAC в схеме приложения. Я сталкивался с несколькими вопросами и хотел бы услышать мнение кого-то более опытного. Приложение представляет собой простой веб-сайт, где у меня есть пользователи, которые могут войти в систему с помощью Devise. У каждого пользователя есть has_many: children, has_many: notes, которые они могут добавлять, редактировать и удалять. Для пользователей будут назначены роли «Член», «Администратор» и «Модератор». Вряд ли какие-либо другие роли будут добавлены. Я думал дать одну роль каждому пользователю. Я также думал использовать следующие методы для проверки прав пользователя в пользовательской модели:
class User < ApplicationRecord
ROLES = %w[member admin moderator].freeze
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :validatable
has_many :children
has_many :notes
validates :name, presence: true
validates :last_name, presence: true
validates :dob, presence: true
validates :email, presence: true, uniqueness: { case_sensitive: false }
validates :role, presence: true, inclusion: { in: ROLES }
validates :encrypted_password, presence: true, confirmation: true
def can? (right)
self.role.rights.include?(right)
end
def can_many? (rights)
rights.each do |right|
if !self.can?(right)
return false
end
return true
end
end
модель RBAC сейчас выглядит следующим образом:
class Rbac < ApplicationRecord
ROLES = %w[member admin moderator].freeze
RIGHTS = %w[edit_own_note remove_own_note edit_any_note remove_any_note remove_own_image remove_any_image create_own_child create_any_child edit_own_child edit_any_child remove_own_child remove_any_child remove_user].freeze
validate :role, presence: true, inclusion: { in: ROLES }
validate :rights, presence: true, inclusion: { in: RIGHTS }
end
Итак, мои вопросыявляются:
- Каков наилучший способ структурировать всю часть RBAC для простого приложения? Будет ли User => Role => Rignts абсолютно необходим или это ненужное усложнение простого приложения?
- В моем случае, я должен создать таблицы: роли, права и затем RBAC? Создать реляционную таблицу между пользователями и ролями?
ИЛИ
я должен сохранить это, как я уже сделал. Назначить роль каждому пользователю в модели User, пропустить таблицы Roles and Rights и иметь только реляционную таблицу RBAC? Существуют ли какие-либо риски, связанные с упрощением ролевого доступа таким образом?