0

こんにちは、私は、特定のユーザーがアクセスできるリソースを制限する Ruby on Rails の認証ライブラリである CanCanCan gem を使用しています。ただし、ユーザーがサインアップすると、「管理者」や「禁止」を含むすべてのオプションが表示されます。これらの 2 つのチェックボックスを非表示にして、「顧客」と「シッター」を残します。どうすればいいですか?

user.rb

class User < ActiveRecord::Base

  ROLES = %i[admin sitter customer banned]

  def roles=(roles)
    roles = [*roles].map { |r| r.to_sym }
    self.roles_mask = (roles & ROLES).map { |r| 2**ROLES.index(r) }.inject(0, :+)
  end

  def roles
    ROLES.reject do |r|
      ((roles_mask.to_i || 0) & 2**ROLES.index(r)).zero?
    end
  end

  def has_role?(role)
    roles.include?(role)
  end

edit.html.erb

        <% for role in User::ROLES %>
          <%= check_box_tag "user[roles][#{role}]", role, @user.roles.include?(role), {:name => "user[roles][]"}%>
          <%= label_tag "user_roles_#{role}", role.to_s.humanize %><br />
        <% end %>
        <%= hidden_field_tag "user[roles][]", "" %>
      </div>
      </div>

https://github.com/CanCanCommunity/cancancan

4

2 に答える 2

0

ユーザーが独自の役割を設定できるようにすることは、特権のない役割であっても、おそらく悪い考えです。

コンテキストから推測すると、ユーザーが顧客またはシッターとしてサインアップできる育児アプリケーションに取り組んでいます。@rolesチェックボックスは、配列リストに基づいて作成するのではなく、手動で設定する必要があります。または@public_roles、管理者以外のロールのみを含むビューで使用する配列を作成することもできます。

最後に、何らかの理由で、技術的には役割ではない「禁止」と呼ばれる役割があります。これは、個別に処理する必要があるユーザー状態です。

于 2015-07-28T22:16:38.443 に答える
0

edit.html.erb で次のように置き換えfor role in User::ROLESますfor role in %i[customer sitter]

admin悪意のあるユーザーが、保護された状態 (または)の 1 つに対して独自のチェックボックスを作成する可能性も考慮する必要がありますbannedadmin許可されていない限り、ユーザーが自分自身を設定できないように、保護を組み込むようにしてください。

于 2015-07-28T22:17:05.547 に答える