Ciao a tutti
Sto sviluppando la mia prima app con Rails e sto cercando di risolvere
un problema per cui gli utenti possono vedere solo alcuni set di dati.
Mi spiego, ho un elenco di clienti (customers/index), da qui posso
accedere ai dettagli customer/:id.
Per non tutti gli utenti che usano l’app possono vedere tutti i
customers. Sull’index non ho prob, filtro per user, il problema
sulla show: un utente un po’ pi furbo della media pu cambiare l’Id
nell’url e visualizzare i dati di un altro customer anche se non ne ha
il diritto.
Come pu essere gestita questa cosa in rails? Esiste una gemma?
La soluzione che ho in mente ora di controllare sull’action show se
l’id del customer rientra in quelli validi, ma non che mi piaccia
molto perch oltre al customer ho parecchie altre entit da
verificare.
grazie
2011/1/27 Emanuele DelBono [email protected]:
Come pu essere gestita questa cosa in rails? Esiste una gemma?
quello che stai descrivendo si chiama autorizzazione. ci sono alcune
gemme che posso aiutarti qui:
michele
Come te stesso hai suggerito puoi verificare nella Users#show che lo
user della richiesta corrente sia lo stesso dell’oggetto che vuoi
aggiornare. Qualcosa simile a:
def show
if current_user != Customer.find(params[:id])
render :status => :not_found
end
end
ovviamente current_user deve essere in qualche modo valorizzato (come
fa la gemma devise per esempio).
tra (), l’HTTP status code 404 (not found) e’ adatto in questa
situazione? O_o
http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html
Se poi vuoi una soluzione piu’ flessibile puoi provare la gemma CanCan
di monsieur Ryan B.:
http://asciicasts.com/episodes/192-authorization-with-cancan
prestando particolare attenzione alla sintassi che usa in questo
frammento:
can :update, Comment do |comment|
comment.try(:user) == user
end
hf
Maurizio
Il 27 gennaio 2011 20:57, Emanuele DelBono
[email protected] ha scritto:
Confermo, cancan è un’ottima soluzione.
L’ho usata nell’ultimo progetto e ne sono rimasto molto soddisfatto.
P.S. l’ascicast c’è anche in italiano.
http://it.asciicasts.com/episodes/192-autorizzazione-con-cancan
Ciao Michele.
Grazie a tutti per le risposte. Devise gi implementato, quindi ok.
CanCan l’avevo guardato ma avevo capito che serviva per la gestione
dei ruoli (chi pu fare cosa). Il mio contesto leggermente diverso,
in qualche modo trasversale sui dati (devo verificare che gli utenti
non vedano dati di clienti che non sono di loro competenza).
Prover a riguardarlo prob mi sfuggita qualche funzionalit.
thx
ema
Il 28 gennaio 2011 14:42, Emanuele DelBono
[email protected] ha scritto:
Grazie a tutti per le risposte. Devise gi implementato, quindi ok.
CanCan l’avevo guardato ma avevo capito che serviva per la gestione
dei ruoli (chi pu fare cosa). Il mio contesto leggermente diverso,
in qualche modo trasversale sui dati (devo verificare che gli utenti
non vedano dati di clienti che non sono di loro competenza).
La funzionalita’ c’e’ ma non si nota subito
Nel frammento dell’asciicast che ti ho passato:
can :update, Comment do |comment|
comment.try(:user) == user
end
verifichi proprio che il ruolo “update” sia detenuto solo da chi
rispetta la condizione contenuta nel blocco (ricorda che user contiene
l’istanza dello user legato alla richiesta).
Maurizio
quasi dimenticavo, per la gestione degli utenti e dei ruoli ho usato
devise.
http://it.asciicasts.com/episodes/209-introduzione-a-devise
Ciao Michele.