【问题标题】:Attribute level authorization in views with pundit具有权威的视图中的属性级别授权
【发布时间】:2016-04-18 06:33:30
【问题描述】:

我正在使用 pundit 在 Rails 应用程序中进行授权。对于某些模型,我想要属性级授权。例如,普通用户可以更改手机号码,但不能将状态设置为“管理员”。

按照the Pundit docs 中的建议,我为此使用permitted_attributes

我现在想在视图中访问这些属性来决定在表单中显示或启用哪些字段。有没有一种(优雅的)方法可以做到这一点,而无需基本上重复那里的授权字段?

【问题讨论】:

    标签: ruby-on-rails authorization pundit


    【解决方案1】:

    首先,您可能想在ApplicationPolicy 中添加一些不错的快捷方式,以便检查属性是否允许:

    class ApplicationPolicy 
      #...
    
      def permits_attributes?(*attrs)
        attrs.keep_if({|a| permits_attribute?(a) }).any?
      end
    
      def permits_attribute?(attr)
        permitted_attributes.include?(attr)
      end
    
      # ...
    end
    

    然后您可以创建自定义表单构建器(或扩展表单构建器的模块):

    class MyFormBuilder < ActionView::Helpers::FormBuilder
      def can_fill_in?(attr)
        yield if @template.policy(object).permits_attribute?(attr)
      end
    end
    

    <%= form_for(@project, builder: MyFormBuilder) do |f| %>
      <%= f.can_fill_in?(:title) do %>
        <%= f.label :title %>
        <%= f.text_field :title %>
      <% end %>
    <% end %>
    

    您还可以将 Rails 配置为默认使用您的自定义表单构建器:

    ActionView::Base.default_form_builder = MyFormBuilder
    

    见:

    【讨论】:

    • 谢谢,我将方法添加到应用程序策略并创建了自定义表单构建器,但我似乎无法从帮助程序访问策略。我得到一个“#<0x007fcd123cccd8>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-19
    • 2020-09-27
    • 2014-08-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多