# Gestione sicurezza

**URL:** <https://www.ruby-forum.com/t/gestione-sicurezza/202377>\
**Category:** IT\
**Created:** [January 27, 2011, 8:57pm UTC](https://www.ruby-forum.com/t/gestione-sicurezza/202377 "2011-01-27T20:57:34Z")\
**Posts on this page:** 7\
**Page:** 1

<div class="post-metadata">

**Author:** ![dubstep](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/cdc98d/32.png) [@dubstep](https://www.ruby-forum.com/u/dubstep)\
**Post date:** [January 27, 2011, 8:57pm UTC](https://www.ruby-forum.com/t/gestione-sicurezza/202377/1 "2011-01-27T20:57:34Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![Emanuele\_DelBono](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/e/e19adc/32.png) [@Emanuele\_DelBono](https://www.ruby-forum.com/u/Emanuele_DelBono)\
**Post date:** [January 27, 2011, 10:19pm UTC](https://www.ruby-forum.com/t/gestione-sicurezza/202377/2 "2011-01-27T22:19:21Z")

</div>

2011/1/27 Emanuele DelBono [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid):

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

> **[Category: User Authorization - The Ruby Toolbox](https://www.ruby-toolbox.com/categories/rails_authorization.html)**
>
> Explore and compare open source Ruby libraries

michele

---

<div class="post-metadata">

**Author:** ![Emanuele\_DelBono](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/e/e19adc/32.png) [@Emanuele\_DelBono](https://www.ruby-forum.com/u/Emanuele_DelBono)\
**Post date:** [January 27, 2011, 10:57pm UTC](https://www.ruby-forum.com/t/gestione-sicurezza/202377/3 "2011-01-27T22:57:00Z")

</div>

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](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](http://asciicasts.com/episodes/192-authorization-with-cancan)

> **[GitHub - ryanb/cancan: Authorization Gem for Ruby on Rails.](https://github.com/ryanb/cancan)**
>
> Authorization Gem for Ruby on Rails. Contribute to ryanb/cancan development by creating an account on GitHub.

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  
[removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) ha scritto:

---

<div class="post-metadata">

**Author:** ![Emanuele\_DelBono](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/e/e19adc/32.png) [@Emanuele\_DelBono](https://www.ruby-forum.com/u/Emanuele_DelBono)\
**Post date:** [January 28, 2011, 10:43am UTC](https://www.ruby-forum.com/t/gestione-sicurezza/202377/4 "2011-01-28T10:43:49Z")

</div>

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](http://it.asciicasts.com/episodes/192-autorizzazione-con-cancan)

Ciao Michele.

---

<div class="post-metadata">

**Author:** ![Emanuele\_DelBono](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/e/e19adc/32.png) [@Emanuele\_DelBono](https://www.ruby-forum.com/u/Emanuele_DelBono)\
**Post date:** [January 28, 2011, 2:42pm UTC](https://www.ruby-forum.com/t/gestione-sicurezza/202377/5 "2011-01-28T14:42:44Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![Emanuele\_DelBono](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/e/e19adc/32.png) [@Emanuele\_DelBono](https://www.ruby-forum.com/u/Emanuele_DelBono)\
**Post date:** [January 28, 2011, 3:16pm UTC](https://www.ruby-forum.com/t/gestione-sicurezza/202377/6 "2011-01-28T15:16:46Z")

</div>

Il 28 gennaio 2011 14:42, Emanuele DelBono  
[removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) 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

---

<div class="post-metadata">

**Author:** ![Emanuele\_DelBono](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/e/e19adc/32.png) [@Emanuele\_DelBono](https://www.ruby-forum.com/u/Emanuele_DelBono)\
**Post date:** [January 28, 2011, 10:51am UTC](https://www.ruby-forum.com/t/gestione-sicurezza/202377/7 "2011-01-28T10:51:08Z")

</div>

quasi dimenticavo, per la gestione degli utenti e dei ruoli ho usato  
devise.

[http://it.asciicasts.com/episodes/209-introduzione-a-devise](http://it.asciicasts.com/episodes/209-introduzione-a-devise)

Ciao Michele.
