簡體   English   中英

Rails 4用戶角色和權限

[英]Rails 4 user roles and permissions

我正在為組織編寫rails應用程序。 每個用戶可能有一個或多個角色,並且只能根據這些角色訪問某些控制器操作。

例如,只有管理員可以創建,銷毀和更新User的某些字段。 另外,還有一些Team S的每一個有一個團隊的領導者 ,只有隊長可以更新的某些信息Team (如成員列表,例如)。 但是, Admins是首先指派團隊負責人的人。

我的場景的具體細節並不重要,我只希望我描述了有許多不同角色和權限的情況。

我的問題是:使用什么寶石? 我的第一個想法是CanCan,但最近一次提交是差不多一年前的事情,並沒有提到Rails 4的兼容性。 目前有替代方案嗎?

你的第一個猜測是正確的,使用cancancan ,你會很好。

編輯2015年7月24日

我一直在使用cancancan很長一段時間,它總是很好用。 我最近開始研究Pundit用於授權的項目。

太棒了。 它會提示您為每個資源定義策略,並且感覺比一個膨脹的Ability類更自然。

對於更大的項目,我肯定會推薦Pundit。

為了控制對操作的訪問,我建議使用Action Access ,它歸結為:

class UsersController < ApplicationController
  let :admin, :all
  let :user, [:index, :show]

  # ...
end

這將自動鎖定控制器,允許管理員訪問每個操作,用戶只顯示或索引用戶,其他任何人將被拒絕並重定向到警報。

如果您需要更多控制權,可以使用not_authorized! 內部操作以檢查和拒絕訪問。

它完全獨立於身份驗證系統,無需User模型或預定義角色即可運行。 您所需要的只是設置當前請求的許可級別:

class ApplicationController < ActionController::Base
  def current_clearance_level
    session[:role] || :guest
  end
end

您可以在此處返回應用程序所需的任何內容,例如current_user.role

雖然它不是必需的,但它捆綁了一組方便的模型添加,允許執行以下操作:

<% if current_user.can? :edit, :team %>
  <%= link_to 'Edit team', edit_team_path(@team) %>
<% end %>

這里:team引用TeamsController ,因此只有當前用戶有權訪問TeamsControlleredit操作時TeamsController顯示該鏈接。 它還支持名稱空間

您可以默認鎖定控制器,自定義重定向路徑和警報消息等。

這非常簡單易行,我希望你覺得它很有用。

我們現在使用的建議是petergate gem。 易於使用,外觀非常干凈,具有良好的導軌感。

適用於設計

以下是自述文件中的一些示例。

如果您正在使用設計,那么您很幸運,否則您將不得不在項目中添加以下方法:

user_signed_in?
current_user
after_sign_in_path_for(current_user)
authenticate_user! 

這來自你的User.rb. 添加更多角色就像將它們添加到陣列一樣簡單。

petergate(roles: [:admin, :editor], multiple: false)

實例方法

user.role => :editor
user.roles => [:editor, :user]
user.roles=(v) #sets roles
user.available_roles => [:admin, :editor]
user.has_roles?(:admin, :editors) # returns true if user is any of roles passed in as params.

控制器訪問語法。

access all: [:show, :index], user: {except: [:destroy]}, company_admin: :all

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM