2012-01-06 11 views
15

Ho bisogno di creare sistemi di permessi basati sui ruoli nella mia app Rails. Sarei totalmente soddisfatto di CanCan, ma il problema principale è che deve essere dinamico, in modo che l'amministratore debba essere in grado di assegnare autorizzazioni e creare nuovi ruoli. Le autorizzazioni possono essere semplici restrizioni di controller/azioni e possono essere correlate ai dati, ad esempio alcuni utenti possono modificare solo i propri profili e alcuni di essi possono modificare i profili di tutti gli utenti di quel particolare gruppo. E sarebbe davvero bello consentire all'amministratore di creare nuove autorizzazioni.Sistema di ruoli e permessi dinamici nell'app Rails

Quello che sto pensando è archiviare in db un controller/azione e alcune restrizioni relative ai dati (sono davvero confuso sul modo di definirli). Quindi potresti darmi qualche consiglio, quale sarebbe il modo migliore per organizzare le autorizzazioni?

Tutti i pensieri sono molto apprezzati

risposta

18

Se ti piace CanCan, allora penso che sia meglio usarlo. Ecco un tutorial breve di memorizzazione di abilità nel database in modo non programmatori possono aggiornarli:

https://github.com/ryanb/cancan/wiki/Abilities-in-Database

Se davvero, vuole veramente per implementare tale sistema da soli. A seconda delle tue esigenze, ti suggerirò di implementarlo nel modo più semplice possibile.

Nel caso in cui siano necessari solo gli utenti per accedere ai moduli (alcuni controller). Si può fare:

1) Conservare tutti i permessi degli utenti in proprio come i campi serializzati ->http://apidock.com/rails/ActiveRecord/Base/serialize/class

class User 
    serialize :permissions, Array 

    def access_to?(module) 
    permissions.include? module.to_s 
    end 
end 

qualche controllo quando si imposta questo campo sarebbe bello.

2) Basta fare un controllo in cima ad ogni controllo se l'utente corrente ha accesso a questo controller (sezione)

class ApplicationController 
    private 

    def self.require_access_to(module) 
     before_filter do |c| 
     unless c.send(:current_user).try :access_to?(module) 
      c.send :render_no_presmissions_page 
     end 
     end 
    endposible 
end 

class AdminNewsController 
    require_access_to :news 
end 

Naturalmente questa è solo una posizione di partenza, da dove si può facilmente evolvere.

5

[EDIT Il legame data dal @RadoslavStankov è una risposta migliore di questa.]

si può fare con CanCan facilmente. Basta creare un modello per le autorizzazioni (che è has_and_belongs_to_many :users) e nel tuo Ability#initialize caricare le autorizzazioni appropriate per l'utente dal modello e dire che l'utente lo fa can. Quindi creare l'interfaccia utente appropriata per l'amministrazione di quel modello.

Qualcosa di simile a questo:

class Ability 
    include CanCan::Ability 

    def initialize(user) 
    user ||= User.new 
    user.permissions.each do |permission| 
     can permission.symbol, permission.scope 
    end 
    user.prohibitions.each do |permission| 
     cannot permission.symbol, permission.scope 
    end 
    end 
end 

dove scope restituito qualcosa come :all per nil ambito, o Object.const_get(@scope_name) altrimenti ... Gioca con esso. Comunque, è fattibile.

Le cose CanCan più complesse sono probabilmente più complesse (duh) - ad esempio le autorizzazioni condizionali - ma anche quella sarebbe una puttanella da amministrare, quindi penso che questo dovrebbe essere sufficiente per la maggior parte delle applicazioni.

Problemi correlati