Страницы

Поиск по вопросам

воскресенье, 12 января 2020 г.

Назначение ролей для прав доступа

#ruby_on_rails


Добрый день.

class Ability

can :manage, Company do |company|
  user.available_roles.include?(company.role)
end


class User

belongs_to :company
delegate :admin?, :operator?, :agent?, :sales?, :visitor?, :available_roles, :role,
to: :company


class Company

has_many :users

  def admin?
    role == 'admin'
  end

  def operator?
    role == 'operator'
  end

  def agent?
    role == 'agent'
  end

  def sales?
    role == 'sales'
  end

  def visitor?
    role == 'visitor'
  end

  def available_roles
    case role
      when 'admin'
        %w[visitor sales agent operator admin]
      when 'operator'
        %w[visitor sales agent]
      else
        []
    end
  end


class CompaniesController

  authorize_resource

  def new
    @company = Company.new
    respond_with @company
  end

  def create
    @company = Company.create(company_params)
    respond_with @company
  end


При создании Компаний, Админ может определить роль компаний %w[visitor sales agent
operator admin]

При создании Компаний, Оператор может определить роль компаний только [visitor sales
agent]

Через консоль:
User.last это user с правами operator

» Ability.new(User.last).can? :manage, Company.new(role: :admin, name: 'Company Administrator')
              User Load (1.5ms)  SELECT  "users".* FROM "users"  ORDER BY "users"."id"
DESC LIMIT 1
              Company Load (0.8ms)  SELECT  "companies".* FROM "companies" WHERE
"companies"."id" = $1 LIMIT 1  [["id", 4]]
# false

» Ability.new(User.last).can? :manage, Company.new(role: :agent, name: 'Company Agent')
          User Load (1.4ms)  SELECT  "users".* FROM "users"  ORDER BY "users"."id"
DESC LIMIT 1
          Company Load (0.5ms)  SELECT  "companies".* FROM "companies" WHERE "companies"."id"
= $1 LIMIT 1  [["id", 4]]
# true


Но через веб интерфейс оператор может создать компанию с ролью admin и operator,

Подскажите пожалуйста, что не так?
    


Ответы

Ответ 1



Помогло в class CompaniesController authorize_resource заменил на load_and_authorize_resource

Ответ 2



user.rb attr_accessor :current_user А в UsersController нужно в параметры добавить current_user: User.new user_params.merge(current_user: current_user) ... User.update user_params.merge(current_user: current_user) Но это не самое лучшее решение, лучше давать право создавать в контроллере или сервисе

Комментариев нет:

Отправить комментарий