【问题标题】:Serialize permissions (e.g. CanCan) with active_model_serializers使用 active_model_serializers 序列化权限(例如 CanCan)
【发布时间】:2012-07-25 23:24:59
【问题描述】:

如何使用 active_model_serializers 序列化权限?我无权访问模型和序列化程序中的current_usercan? 方法。

【问题讨论】:

    标签: ruby-on-rails cancan activemodel active-model-serializers


    【解决方案1】:

    首先,要在序列化程序上下文中访问current_user,请使用新的范围功能:

    class ApplicationController < ActionController::Base
      ...
      serialization_scope :current_user
    end
    

    如果您手动实例化序列化程序,请确保传递范围:

    model.active_model_serializer.new(model, scope: serialization_scope)
    

    然后在序列化器内部,添加自定义方法来添加自己的授权伪属性,使用scope(当前用户)来确定权限。

    如果你使用 CanCan,你可以实例化你的 Ability 类来访问can? 方法:

    attributes :can_update, :can_delete
    
    def can_update
      # `scope` is current_user
      Ability.new(scope).can?(:update, object)
    end
    
    def can_delete
      Ability.new(scope).can?(:delete, object)
    end
    

    【讨论】:

    • 我不明白 -- 你有没有马上回答你自己的问题?
    • 是的,我做到了——见this article。我希望保留这条知识,但发现它太琐碎/专业而无法在我的博客上发布,所以我将其发布在这里,问答风格。
    • @JoLiss 作为“super.merge”样式的替代方案,您可以说attributes :can_update, :can_delete,然后将can_update 和can_delete 定义为序列化程序中的方法。不过,两者都可以。
    • 您还可以将can? 方法委托给您的模型以获得更好的可读性——请参阅stackoverflow.com/a/3293522/797639
    【解决方案2】:

    我们创建了一个提供此功能的 gem:https://github.com/GroupTalent/active_model_serializers-cancan

    【讨论】:

      【解决方案3】:

      我认为你可以将任何你想传递给serialization_scope,所以我只是传递能力。

      class ApplicationController < ActionController::Base
       ...
       serialization_scope :current_ability
      
       def current_ability
         @current_ability ||= Ability.new(current_user)
       end
      
      end
      
      
      class CommentSerializer < ActiveModel::Serializer
        attributes :id, :content, :created_at, :can_update
      
        def can_update
          scope.can?(:update, object)
        end
      
      end
      

      我不能这样做,因为我的能力实际上是基于两个变量(不在上面的示例中)。
      如果您仍然需要访问 current_user,您可以简单地在 Ability 上设置一个实例变量。

      【讨论】:

        猜你喜欢
        • 2020-04-15
        • 2016-07-16
        • 2017-07-17
        • 2014-01-09
        • 1970-01-01
        • 2014-02-11
        • 2023-04-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多