2017-04-13 2 views
0

Ich habe eine Admin-Ansichten, wo nur der Administrator anzeigen darf. Ich benutze Pandit, um die Anwendung zu autorisieren.Verwenden Sie Pandit, um Benutzer von Admin-Ansichten zu verweigern

wie leugne ich alle Benutzer aber Admin zu den Admin-Ansichten ohne Erstellen von Richtlinien (und jeden Controller mit authorise dekorieren) für jeden Admin-Controller? wenn es eine kürzere Lösung gibt.

Dank

Antwort

1

Was Sie versuchen, gegen die Art von MVC zu tun und ist eine ziemlich schlechte Idee.

Während Sie in der Ansicht autorisieren können:

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

Das ist für Stücke der Ansicht, nicht ganze Aktionen zur Ermächtigung.

Der Grund dafür ist, dass Autorisierungssysteme wie Pandit arbeiten, indem sie eine Ausnahme auslösen, die im Controller gefangen wird, um die "Fehler" -Seite zu rendern, die von der Ausnahme rettet (normalerweise die Login-Ansicht). Eine nicht autorisierte Aktion sollte auch einen anderen HTTP-Antwortcode zurückgeben. Dies erfolgt, wenn die Wiedergabe der Ansicht bereits begonnen hat, zu spät im Antwortzyklus und würde einen doppelten Renderfehler verursachen, da der Server möglicherweise bereits mit dem Senden der Antwort begonnen hat.

Stattdessen können Sie eine Maden Richtlinie erstellen:

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

Und Sie können es wie so verwenden:

# 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 
Verwandte Themen