【问题标题】:Checkbox scopes in doorkeeper门卫中的复选框范围
【发布时间】:2018-05-21 13:28:03
【问题描述】:

我想允许用户从复选框列表中选择范围。我已经像这样设置了表单:

  <%= f.label :scopes, class: 'col-sm-2 control-label' %>
    <% Doorkeeper.configuration.scopes.each do |scope| %>
      <%= check_box_tag("doorkeeper_application[scopes][#{scope}]", scope, @application.scopes.include?(scope)) %>
      <%= scope %><br>
    <% end %>
  <% end %>

产生

doorkeeper_application[scopes]Oauth::ApplicationsController 接受。虽然用户应该能够选择多个范围,但不接受 doorkeeper_application[scopes][foo] 等参数。

将这些参数传递给控制器​​的最佳做法是什么?还是有更好的做法来实现 Doorkeeper 中的复选框范围?

【问题讨论】:

    标签: ruby-on-rails doorkeeper


    【解决方案1】:

    根据 OAuth2 规范,多个范围应由空格字符连接。因此,您应该从 params 获取检查范围的名称,用空格 " " 将它们连接起来,并将该单个值分配为 doorkeeper_application[scopes] 值。

    【讨论】:

    • 谢谢,我用params.require(:doorkeeper_application).permit(:name, :redirect_uri, :scopes, checkbox_scopes: [Doorkeeper.configuration.scopes.to_a])打开了checkbox_scopes,然后用params['scopes'] = params[:checkbox_scopes].nil? ? '' : params[:checkbox_scopes].keys.join(" ")转换了参数
    【解决方案2】:

    一般来说,我会推荐使用表单助手来完成这项任务,因为这样 Rails 能够发挥它的魔力,而且您不必处理输入字段的名称。

    我不熟悉 Doorkeeper,但我认为范围保存在您数据库的表中。在这种情况下,您应该能够在表单所属的模型上定义has_and_belongs_to_many :scopes 关系。

    之后,您可以生成checkbox_collection,如this question 的答案所示。

    【讨论】:

    • 感谢您的建议,如 Sawa 的回答中所述,范围存储为带空格的字符串。我不知道这是 OAuth2 规范
    【解决方案3】:

    从版本 5.1.0rc2 开始,Doorkeeper 支持开箱即用,自动将数组转换为空格分隔的范围字符串。详情请见https://github.com/doorkeeper-gem/doorkeeper/pull/1214

    对于 5.1.0rc2 以上的版本,您需要自行修补 Scopes 关注点或预处理用户输入参数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-18
      • 1970-01-01
      • 2011-03-10
      • 2013-09-09
      相关资源
      最近更新 更多