4

これがコントローラー全体に表示されます。

if not session[:admin]
  flash[:notice] = "You don't have the rights to do #{:action}."
  redirect_to :action=>:index
  return
end

そしてその兄弟:

if not session[:user] and not session[:admin]
  flash[:notice] = "You don't have the rights to do #{:action}."
  redirect_to :action=>:index
  return
end

メソッドで使用する場合は、これをすべて宣言行に減らしたいと思います。

def action_which_requires_rights
    require_rights :admin
    #or:
    #:require_rights :user_or_admin
end

明らかに、require_rights が失敗した場合、残りのメソッドを実行したくありません。これを行う方法があったことを誓いますが、それについて読んだ場所が見つかりません。私はこれを想像していますか?

4

5 に答える 5

8

まず、次のことができます:unless session[:admin]代わりにif not ...

次に、メソッドを呼び出す前のフィルターを使用できます。このメソッドは、redirect_to "url" を実行して戻ります。

質問があります。認証の唯一の手段としてセッションに管理者の ID を保存するだけでなく、ユーザー モデルに属性を設定し、より安全な方法でクエリを実行することを願っています。

于 2009-01-20T00:59:44.663 に答える
6

他の人が言ったように、ここでは before_filter が適切なツールのようです。しかし、私はあなたが尋ねていた実際のパターンに対処します.

残念ながら、メソッドは呼び出し元のメソッドを返すことはできません。探しているパターンに最も近い 2 つの一致:

ブロック:

def require_rights(rights)
  if session[rights]
    yield
  else
    flash[:notice] = "You don't have the rights to do #{:action}."
    redirect_to :action=>:index
  end
end

したがって、次のようにします。

def action_which_requires_rights
  require_rights :admin do
    #do whatever here
  end
end

または戻り値:

def require_rights(rights)
  return true if session[rights]
  flash[:notice] = "You don't have the rights to do #{:action}."
  redirect_to :action=>:index
  false
end

したがって、次のようにします。

def action_which_requires_rights
  require_rights :admin or return
  #do whatever here
end

同様のメソッドに適合するため、ブロックの方が気に入っています。また、呼び出し元に実行させるのは、or return私にとっては不自然に感じます。

于 2009-01-20T10:08:26.927 に答える
3

before_filter を見てください。実行を停止したり、特定のアクションに制限したりすることができます。

于 2009-01-20T01:27:37.710 に答える
1

ユーザーがこのアクションの実行を許可されていない場合、ユーザーにアクションを表示しません (それを達成するためにヘルパーを使用します)

コントローラーでは、他の回答で述べたように、フィルターの前にアクセス権を制御するのが最善の方法です。

ユーザーの役割を管理するために、安らかな認証プラグインを使用することもお勧めします。

于 2009-01-20T09:08:18.327 に答える
0

例外をスローする何かを試すことができます。

def action_for_admins
  require_rights :admin
end

begin 
  action_for_admins
rescue
  <%= You don't have the rights to do that %>
end

次に、require_rights は次のようになります。

def require_rights(*rights)
  rights.each do |right|
    raise "Missing right #{right.to_s}" if not user.has_right?(right)
  end
end

私は Ruby や Rails の初心者なので、そうではないかもしれないことに注意してください

于 2009-01-20T09:29:55.367 に答える