如何使用rails制作授权系统?

时间:2015-09-26 11:27:22

标签: ruby-on-rails ruby ruby-on-rails-4

在我的应用中,用户可以属于很多公司,公司可能有很多用户,一个用户可以在两个或更多公司中运营,公司可以有不同的角色,例如公司1用户可能是管理员,公司2可能是秘书。我创建模型公司用户和角色

Company.rb

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

User.rb

class User < ActiveRecord::Base
  has_many :companies, through: :users_companies
  has_many :users_companies
  has_many :users_roles, dependent: :destroy
  has_many :roles, through: :users_roles
end

Role.rb

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

然后我创建模型UsersCompany UsersRole

users_role.rb

class UsersRole < ActiveRecord::Base
  belongs_to :user
  belongs_to :role
  #belongs_to :company
end

Users_role.rb

class UsersRole < ActiveRecord::Base
  belongs_to :user
  belongs_to :role
  #belongs_to :company
end

并添加到users_roles db列company_id以确定用户的公司,但是当我更新用户模型以添加或删除角色时,company_id列将为null。我认为这是一个坏主意,并且有一个正确的解决方案来解决这个问题。

这在我的观点中

<%= form_for([@company, @user]) do |f| %>
<%= f.label :last_name %><br />
    <%= f.text_field :last_name %>

    <%= f.label :first_name %><br />
    <%= f.text_field :first_name, type: "text" %>

    <%= f.label :middle_name %><br />
    <%= f.text_field :middle_name, type: "text" %>

    <%= hidden_field_tag "user[role_ids][]", nil %>
    <% Role.all.each do |role| %>
      <%= check_box_tag "user[role_ids][]", role.id, @user.role_ids.include?(role.id), id: dom_id(role) %>
      <%= label_tag dom_id(role), role.second_name %><br>
      <% end %>
    <%= f.submit, class: "login loginmodal-submit", type: "submit"  %>
<% end %>

和用户控制器更新操作

def update
    @company = Company.find(params[:company_id])
    @user = User.find(params[:id])

    redirect_to :back if @user.update 
end 

如果用户同时可以在两个角色不同的公司工作,如何构建授权系统?

1 个答案:

答案 0 :(得分:0)

我不知道为什么当你更新角色时,company_id变为null,但在你的概念模型中,用户可以在同一家公司担任多个角色,我认为这是错误的。此外,似乎company_user(这是公司和用户之间的基本关系)不必对user_role做任何事情,这使得更新和跟踪哪个用户具有哪个公司的角色。

我想建议那些类模型,以获得用户,角色和公司之间的关系。

class User
  has_many :user_roles
  has_many :companies, through: :user_roles
end

class Company
  has_many :user_roles
  has_many :users, through: :user_roles
end

class UserRole
  belongs_to :user
  belongs_to :company
  belongs_to :role
end

class Role
  has_many :user_roles
end

我想您知道如何处理迁移。