Какой самый лучший RBAC для очень простого приложения Ruby On Rails? - PullRequest
0 голосов
/ 06 ноября 2019

Я делаю свое первое приложение на 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

Итак, мои вопросыявляются:

  1. Каков наилучший способ структурировать всю часть RBAC для простого приложения? Будет ли User => Role => Rignts абсолютно необходим или это ненужное усложнение простого приложения?
  2. В моем случае, я должен создать таблицы: роли, права и затем RBAC? Создать реляционную таблицу между пользователями и ролями?

ИЛИ

я должен сохранить это, как я уже сделал. Назначить роль каждому пользователю в модели User, пропустить таблицы Roles and Rights и иметь только реляционную таблицу RBAC? Существуют ли какие-либо риски, связанные с упрощением ролевого доступа таким образом?

...