如何用rails制作授权系统?
Posted
技术标签:
【中文标题】如何用rails制作授权系统?【英文标题】:How to make authorization system with rails? 【发布时间】:2015-09-26 11:27:21 【问题描述】:在我的应用中,用户可以属于很多公司,公司可能有很多用户,一个用户可以在两个或多个公司中操作,在公司中可以有不同的角色,例如在公司 1 中的用户可能是管理员,在公司 2 中可能是秘书.我创建模型公司用户和角色
公司.rb
class Company < ActiveRecord::Base
has_many :users_companies
has_many :users, through: :users_companies
end
用户.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
角色.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 列将为空。我认为这是一个坏主意,并且这个问题有一个正确的解决方案。
这是我的看法
<%= 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】:我不知道为什么当您更新角色时,company_id 变为空,但在您的概念模型中,用户可以在同一家公司拥有多个角色,我认为这是错误的。此外,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
我想你知道如何处理迁移。
【讨论】:
以上是关于如何用rails制作授权系统?的主要内容,如果未能解决你的问题,请参考以下文章