2017-04-13 4 views
0

管理者だけが閲覧できる管理者ビューがあります。私は専門家を使ってアプリケーションを認可しています。私は、各管理コントローラのポリシーを作成することなく、管理者ビューにすべてのユーザーが、管理者を拒否(およびAUTHORIZEと各コントローラを飾る)どうやっpunditを使用して管理者ビューからユーザを拒否する

?より短い解がある場合

あなたが何をしようとして感謝

答えて

1

は、MVCの性質に違反するとかなり悪い考えです。

あなたはビューで承認することができますが:

# In views 
<% if policy(:dashboard).show? %> 
    <%= link_to 'Dashboard', dashboard_path %> 
<% end %> 

ザッツビュー全体ではなく、アクションのチャンクを許可するため。

これは、punditのような認証システムは、例外(通常はログインビュー)から救済される「エラー」ページをレンダリングするためにコントローラにキャッチされた例外を発生させるためです。不正なアクションは、別のHTTP応答コードも返す必要があります。ビューのレンダリングがすでに開始されているときにこれを行うのは、応答サイクルの後半にあるため、サーバーがすでに応答を送信し始める可能性があるため、2重レンダリングエラーが発生します。

代わりに、ヘッドレスポリシーを作成することができます

class AdminPolicy < Struct.new(:user, :admin) 
    def admin? 
    user.admin? 
    end 
end 

をそして、あなたはそうのようにそれを使用することができます:

# app/controllers/concerns/administrated.rb 
module Administrated 
    extends ActiveSupport::Concern 

    included do 
    before_action :authorize_admin 
    end 

    def authorize_admin 
    authorize(:admin, :admin?) 
    end 
end 

class ThingsController < ApplicationController 
    include Administrated 
end 
関連する問題