condizioni multiple per l'uso in declarative_authorization if_attribute
-
25-10-2019 - |
Domanda
Ho 4 diversi livelli di accesso; amministratore, socio, dipendente e cliente. Admin, Partner, e dei dipendenti hanno accesso amministrativo su clienti. Fondamentalmente quello che ho fatto è stato creato un'applicazione Rails dove i clienti possono caricare i documenti da loro fornitore (partner). Tutto funziona ottimo, tranne per il livello di accesso client. Ho due codici; partercode e il codice cliente. I partner possono solo vedere i file in cui il campo partercode del file è uguale codice promo del partner. Questo funziona bene. Tuttavia, il cliente può vedere solo i file in cui il Codice partner partite e le partite clientcode. Qui di seguito è la mia sezione cliente. Ciò che è di lavoro è che il cliente è consentito solo per vedere i file partercode, ma sta mettendo loro vedere altri client che appartengono al partner. (Digitando il numero nella URL). Dubito che questo sarebbe mai essere un problema, ma è un buco di sicurezza che Vorrei assolutamente chiuso.
role :client do
has_permission_on [:users], :to => [:client, :edit, :update] do
if_attribute :username => is { user.username }
end
has_permission_on [:documents], :to => [:client, :new, :create]
has_permission_on [:documents], :to => [:client, :index, :show, :edit, :update, :destroy, :documents] do
if_attribute :partnercode => is { user.partnercode }, :clientcode => is { user.clientcode }
end
end
Soluzione 2
Ho trovato la risposta. La risposta, per ironia della sorte, è stato nei tag di questa domanda; nidificato.
role :client do
has_permission_on [:users], :to => [:client, :edit, :update] do
if_attribute :username => is { user.username }
end
has_permission_on [:documents], :to => [:client, :new, :create]
has_permission_on [:documents], :to => [:client, :index, :show, :edit, :update, :destroy, :documents] do
if_attribute :clientcode => is { user.clientcode } do
if_attribute :partnercode => is { user.partnercode }
end
end
end
Una volta a convalidare che il clientcode è corretto quindi creare un altro fare .. fine di verificare la Codice partner.
Altri suggerimenti
Non credo nidificazione le dichiarazioni if_attribute
in realtà funziona così. Declarative_authorization di default si unisce queste dichiarazioni if_attribute
con un'istruzione or
, ma se ho capito bene che si desidera loro uniti con and
. Il modo per cambiare questo è quello di impostare l'attributo :join_by
a :and
.
role :client do
has_permission_on [:documents], :to => [:do_whatever], :join_by => :and do
if_attribute :partnercode => is { user.partnercode }
if_attribute :clientcode => is { user.clientcode }
end
end
opere :join_by
, ma il mio problema con esso è che a volte è necessario sia AND
e OR
. È possibile specificare più se le condizioni, su una sola riga come argomenti diversi. Questi saranno confrontati insieme utilizzando AND
mentre ciascuna riga viene valutata OR
.
role :client do
has_permission_on [:documents], :to => [:do_whatever], :join_by => :and do
if_attribute :partnercode => is { user.partnercode },
:clientcode => is { user.clientcode } # These two are evaluated with AND
if_attribute :some_attr => is { some_val }
end
end