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
È stato utile?

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

fonte: http: // www .tzi.org / ~ sbartsch / declarative_authorization / master / classes / autorizzazione / lettore / AuthorizationRulesReader.html # M000184

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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top