门卫中的复选框范围

时间:2018-05-21 13:28:04

标签: ruby-on-rails doorkeeper

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

  <%= 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 %>

产生

image

doorkeeper_application[scopes]接受

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

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

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

一般来说,我建议使用表单助手来完成这项任务,因为这样rails可以发挥其魔力,你不必处理输入字段的名称。

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

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

答案 2 :(得分:1)

从版本5.1.0rc2开始,Doorkeeper支持通过自动将数组转换为以空格分隔的作用域字符串来实现其开箱即用。有关更多详细信息,请参见https://github.com/doorkeeper-gem/doorkeeper/pull/1214

对于5.1.0rc2以上的版本,您需要通过自己或预处理用户输入参数来修补“范围”问题。