Gestione sicurezza

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? :slight_smile:

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? :slight_smile:

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 :wink:

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.