2

acl9 を使用してユーザー ロールを管理するための最善の方法は何かお考えですか?

必要性は次のとおりです。

  • 管理者は、ユーザーの役割を更新できる必要があります。

問題は次のとおりです。

  1. すべてのサブジェクト ロールを一覧表示するにはどうすればよいでしょうか。:管理者、:管理者
  2. API エンドポイントを RESTful に保つために、理想的には user_controller の update メソッドでロール パラメータを渡したいと思います。
  3. ユーザー オブジェクトの所有者が自分の first_name フィールドと last_name フィールドを変更できるが、role フィールドは変更できないように、role プロパティだけを承認するにはどうすればよいですか? 管理者のみが許可されます。

access_controlブロックの外側でパラメーターを手動で確認できます。

def secure_params
    if current_user.has_role?(:admin)
        params.require(:user).permit(:first_name, :last_name, :role)
    else
        params.require(:user).permit(:first_name, :last_name)
    end
end

しかし、よりクリーンなソリューションがあるかどうかを確認すると思いました。

RoleTypes.ADMIN最後に、 のRoleTypes.MANAGER代わりに , のようなものを使用することは可能で賢明:adminですか? もしそうなら、これを行う最善の方法は何ですか?また、そのクラスはレールアプリ全体でアクセスできますか?

4

2 に答える 2

2

すべてのサブジェクト ロールを一覧表示するにはどうすればよいでしょうか。:管理者、:管理者

このRoleモデルは単なる通常のモデルであるため、他のものと同じようにクエリを実行できます。

Role.uniq.pluck :name

API エンドポイントを RESTful に保つために、理想的には user_controller の update メソッドでロール パラメータを渡したいと思います。

一般に、管理を実行するために別のコントローラーを使用し、それをAdmin::名前空間に配置し、namespace :admin doルートなどを使用する方がはるかに優れています.

次に、そのコントローラーで通常のaccess_controlブロックを使用して、他の誰も侵入できないようにすることができます。

class Admin::UsersController < ApplicationController

  access_control do
    allow :admin
  end

  # ...

end

したがって、ええ、さまざまな方法でロールを設定/更新できますが、ユーザーが多くのロールを持つことができるため、単一の:roleパラメーターを持つのではなく、次を使用するのがおそらく最善です。

class User < ActiveRecord::Base
  acts_as_authorization_subject
  accepts_nested_attributes_for :roles
end

したがって、コントローラーには次のようになります。

def user_params
  params.require(:user).permit(:first_name, :last_name, roles_attributes: [:name])
end

次に、フォームで次のようなことができます。

= form_for :user do |f|
  = f.text_field :first_name
  = f.text_field :last_name
  = f.fields_for :roles do |fr|
    = fr.text_field :name

ここでは、オブジェクトのロールではなく単純なロールを持っていると想定していることに注意してください。オブジェクトのロールがある場合は、ロールごとにキャプチャするのに少しトリッキーなものが必要になりauthorizable_idますauthorizable_type。行為。

ユーザー オブジェクトの所有者が自分の first_name フィールドと last_name フィールドを変更できるが、role フィールドは変更できないように、role プロパティだけを承認するにはどうすればよいですか? 管理者のみが許可されます。

管理インターフェイスとユーザー独自のインターフェイスに異なるコントローラーを使用することで、すでにこの質問に答えていることを願っています。

最後に、:admin の代わりに RoleTypes.ADMIN、RoleTypes.MANAGER などを使用することは可能で賢明ですか?

いいえ、シンボルはよりシンプルで優れていますが、次のようなことを行うのは非常に一般的です。

class Role < ActiveRecord::Base
  def self.permitted_roles
    %i/admin manager foo bar wee/
  end
end

Role.permitted_rolesチェックボックスの配列やドロップダウンなどを作成するために使用できます。

于 2015-03-25T22:28:10.783 に答える