AdilA
@AdilA
Нравится кодить, изучаю go c echo

Как организовать систему авторизации?

Привет всем! Завело меня в тупик! Прошу помощи!
Не знаю как разграничить права доступа для пользователей в разных организациях!
Ситуация следующая. Есть множество организаций и пользователей, пользователь может принадлежат нескольким организациям, у пользователя может быть много организаций

User.rb

class User < ActiveRecord::Base
  has_many :companies, through: :users_companies
  has_many :users_companies
end


Company.rb

class Company < ActiveRecord::Base
  has_many :users_companies
  has_many :users, through: :users_companies
end


Создал модель Role

Role.rb
class Role < ActiveRecord::Base
  has_many :users_roles
  has_many :users, through: :users_roles
end

с помощью gem'a cancancan распределил права(думаю неправильно решение под такую задачу), но никак не хватает мозгов как правильно проверять компанию. Добавил в join table users_roles колонку company_id но при action update UsersController колонка company_id становиться Null
Роли следующие пользователь может быть администратором, секретарем и директором
Один и тот же пользователь может быть в одной организации администратором а в другой секретарем.
Вся соль в том что если Вася Пупкин является в компании Рога и Копыта администратором то и в других компаниях он является администратором, Гугл по таким вопросам молчит, подскажите как правильно организовать базу данных с данной задачей?
  • Вопрос задан
  • 149 просмотров
Пригласить эксперта
Ответы на вопрос 1
@eoffsock
Кодер (Rails)
Можно сделать вот как: нужно, чтобы из Company можно было получить список ролей для нее. Например, в Role добавьте референс на Company, а в Company has_many :roles.
Еще в Role нужна колонка с видом роли - админ, секретарь, директор. Что-нибудь в виде admin, secretary, director. Пусть колонка будет role.

Затем распишите abilities примерно так:
Companies.each do |company|
    role = company.roles.where(user: user).first
    can role.role.to_sym, company, id: company.id if role.present?
end


И проверяем где нужно:
if can? :admin, @company
# do smth
end


Поэкспериментируйте, должно сработать по документации.
Кстати, можно has_many through заменить на has_and_belongs_to_many, если в связующей таблице только id обеих таблиц и нет других данных.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы