簡體   English   中英

每當用戶調用該操作時,如何在Ruby on Rails中的Cancancan中檢查授權?

[英]How can I check the authorization in Cancancan in Ruby on Rails each time the user calls that action?

我正在使用Ruby on Rails 5,並且我希望根據用戶的角色,該用戶可以發布5個帖子或10或15個帖子,而這只是我必須檢查授權的幾種可能情況的一部分(對於不是Posts的事情,例如,我還有其他情況會稍微復雜一些),所以幾天前我開始使用Cancancan(v 1.15.0),不要使User模型變得太大,所以我有了每個角色都有一個類,在capability.rb中,我只是根據角色合並這些類。

問題在於,使用Cancancan顯然只檢查一次授權。 例如,在創建帖子中,在帖子#create中,第一行代碼是:

authorize! :create, Post

在用戶的Role類中,我有以下代碼:

  if user.posts.size < 10
    Rails.logger.debug "If-size: #{user.posts.size}"
    can :create, Post
  else
    Rails.logger.debug "Else-size: #{user.posts.size}"
    cannot :create, Post
  end

我用RSpec進行了一些測試,我第一次看到current_user(具有該特定角色的用戶)使用控制器創建了一個Post(我的意思是,不是通過FactoryGirl或任何其他不使用控制器的方式),它出現在日志/測試日志:

If-size: 0

但是“其他”和“否”都不會再次出現在日志中,由控制器創建多少個帖子都沒有關系,它僅在第一次時評估此條件,並且用戶被授權創建所需數量的帖子,因為第一次,如果If中的條件為true,則每次調用控制器Post的方法創建方法時都不會評估該條件。

編輯 :由MarsAtomic建議的方法解決。 謝謝! :)

CanCanCan並非根據應用程序中的條件動態評估角色。 這類功能最好由應用程序自己的邏輯而非授權工具來處理。

您應該考慮在roles表中添加一列,以指示允許一個特定角色發布多少個帖子。 通過此列,您可以檢查允許每個用戶(通過角色)創建的帖子數。

然后,在posts_controller.rb ,可以將帖子創建邏輯包裝在僅當用戶未超過允許的最大帖子數時運行的塊中:

def create
  if user.posts.size < user.role.max_posts
    @post = Post.new(post_params)

    @post.save
    redirect_to @post
  else
    # flash an error on the page or redirect to an error page
  end
end

暫無
暫無

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

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