如何用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制作授权系统?的主要内容,如果未能解决你的问题,请参考以下文章

如何用制作python操作系统,怎么做引导?

如何用老毛桃制作UEFI版U盘启动盘

如何用U盘制作Ubuntu 14.10启动盘

如何用ultraiso制作u盘启动盘win10

如何用U盘制作Ubuntu 14.10启动盘

如何用U盘安装CentOS7系统