# Gestione ruoli utenti e controllers

**URL:** <https://www.ruby-forum.com/t/gestione-ruoli-utenti-e-controllers/163958>\
**Category:** IT\
**Created:** [March 26, 2009, 2:08pm UTC](https://www.ruby-forum.com/t/gestione-ruoli-utenti-e-controllers/163958 "2009-03-26T14:08:39Z")\
**Posts on this page:** 5\
**Page:** 1

<div class="post-metadata">

**Author:** ![serpico](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/7feea3/32.png) [@serpico](https://www.ruby-forum.com/u/serpico)\
**Post date:** [March 26, 2009, 2:08pm UTC](https://www.ruby-forum.com/t/gestione-ruoli-utenti-e-controllers/163958/1 "2009-03-26T14:08:39Z")

</div>

Salve a tutti,

sto creando un’applicazione web con rails che comprende un sistema di  
gestione ruoli per gli utenti, ma ho qualche dubbio rispetto alla  
gestione dei ruoli e l’architettura dell’applicazione.

Al momento gestisco 3 tipi di utenti: Amministratore \> Capo Area \>  
Impiegato , dall’utente con privilegi maggiori fino a quello con  
privilegi minimi.

Fin qui nessun problema, riesco a bloccare determinate azioni o interi  
controller rispetto al ruolo. Quello che non riesco a strutturare in  
modo pulito sono le situazioni dove piu utenti hanno accesso alla stessa  
azione, ma devono vedere dati (estratti dal db) differenti.

Esempio:  
Un Impiegato ha dei Documenti, nell’azione index del controller  
documents dovrei mostrare tutti i SUOI documenti. Un capo area ha  
accesso alla stessa azione dello stesso controller, ma vedere tutti i  
documenti di TUTTI gli impiegati, un find(:all) in pratica.

Vorrei evitare condizioni nei controller in queste situazioni del tipo:  
se sei capo area, fai un find(:all), se sei Impiegato fai un find solo  
sui documenti dell’utente ecc…

Mi piacerebbe avere qualche input dalla community per capire come voi  
risolvereste la cosa.

Grazie in anticipo!

---

<div class="post-metadata">

**Author:** ![serpico](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/7feea3/32.png) [@serpico](https://www.ruby-forum.com/u/serpico)\
**Post date:** [March 26, 2009, 8:59pm UTC](https://www.ruby-forum.com/t/gestione-ruoli-utenti-e-controllers/163958/2 "2009-03-26T20:59:34Z")

</div>

Serafino P. wrote:

> Salve a tutti,
> 
> sto creando un’applicazione web con rails che comprende un sistema di  
> gestione ruoli per gli utenti, ma ho qualche dubbio rispetto alla  
> gestione dei ruoli e l’architettura dell’applicazione.
> 
> Al momento gestisco 3 tipi di utenti: Amministratore \> Capo Area \>  
> Impiegato , dall’utente con privilegi maggiori fino a quello con  
> privilegi minimi.
> 
> Fin qui nessun problema, riesco a bloccare determinate azioni o interi  
> controller rispetto al ruolo. Quello che non riesco a strutturare in  
> modo pulito sono le situazioni dove piu utenti hanno accesso alla stessa  
> azione, ma devono vedere dati (estratti dal db) differenti.
> 
> Esempio:  
> Un Impiegato ha dei Documenti, nell’azione index del controller  
> documents dovrei mostrare tutti i SUOI documenti. Un capo area ha  
> accesso alla stessa azione dello stesso controller, ma vedere tutti i  
> documenti di TUTTI gli impiegati, un find(:all) in pratica.
> 
> Vorrei evitare condizioni nei controller in queste situazioni del tipo:  
> se sei capo area, fai un find(:all), se sei Impiegato fai un find solo  
> sui documenti dell’utente ecc…
> 
> Mi piacerebbe avere qualche input dalla community per capire come voi  
> risolvereste la cosa.
> 
> Grazie in anticipo!

l’ultima volta che ho fatto una cosa simile ho fatto cosÃ¬ :

Riscrivi il metodo find e fai in modo che aggiunga delle conditions in  
base all’utente corrente in questo modo quando fai ad esempio  
Documents.find(:all) la find lo riscrive mettendo ad es  
Document.find(:all, :conditions =\> { :user\_id =\> 1 })

---

<div class="post-metadata">

**Author:** ![serpico](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/7feea3/32.png) [@serpico](https://www.ruby-forum.com/u/serpico)\
**Post date:** [March 26, 2009, 9:55pm UTC](https://www.ruby-forum.com/t/gestione-ruoli-utenti-e-controllers/163958/3 "2009-03-26T21:55:43Z")

</div>

Oppure (supponendo che il metodo current\_user restituisca l’utente  
corrente):  
u = current\_user  
user\_documents = u.documents.find(:all)

Il 26 marzo 2009 20.59, Alessandro S. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) ha  
scritto:

> >

–  
Carlo P.  
email: removed\_email\_address@domain.invalid  
twitter: @carlopecchia

---

<div class="post-metadata">

**Author:** ![serpico](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/7feea3/32.png) [@serpico](https://www.ruby-forum.com/u/serpico)\
**Post date:** [March 26, 2009, 9:57pm UTC](https://www.ruby-forum.com/t/gestione-ruoli-utenti-e-controllers/163958/4 "2009-03-26T21:57:29Z")

</div>

Il 26 marzo 2009 14.08, Serafino P. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) ha  
scritto:

> Vorrei evitare condizioni nei controller in queste situazioni del tipo:  
> se sei capo area, fai un find(:all), se sei Impiegato fai un find solo  
> sui documenti dell’utente ecc…

in una situazione simile, appunto per non rendere illeggibili i  
controller né le view, io ho optato per una certa separazione: ho  
definito in User dei metodi tipo may\_create\_documents?,  
may\_edit\_document?(doc), etc., da usare nelle view per scegliere quali  
link mostrare e nei controller per decidere se eseguire un’azione:

# DocumentController.rb

def edit  
@document = Document.find(params[:id])  
if current\_user.may\_edit\_document? @document  
…  
else  
…

# view.rb

\<% if current\_user.may\_edit\_document? @document %\>  
\<%= link\_to “edit”, … %\>  
\<% end %\>

per filtrare gli oggetti ho invece creato dei named\_scope, tipo:

named\_scope :visible\_by, lambda { |user| user.admin? ? {} : {:user\_id  
=\> user.id} }

così nel controller scrivo:

@documents = Document.visible\_by(current\_user).paginate …

(Quando poi i metodi in User sono diventati troppi, li ho spostati in  
un modulo Permissions incluso da User.)

credo che definire un named\_scope sia una soluzione preferibile al  
ridefinire find, perché così, leggendo il controller, si capisce  
chiaramente l’intenzione del codice, mentre se si ridefinisce find,  
ciò non risulta evidente dal codice del controller, e si corre il  
rischio di incappare in bug inspiegabili, specie a distanza di tempo.

pietro

---

<div class="post-metadata">

**Author:** ![serpico](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/7feea3/32.png) [@serpico](https://www.ruby-forum.com/u/serpico)\
**Post date:** [March 26, 2009, 10:31pm UTC](https://www.ruby-forum.com/t/gestione-ruoli-utenti-e-controllers/163958/5 "2009-03-26T22:31:54Z")

</div>

Grazie a tutti,mi sembrano tutti suggerimaneti validi. Alla fine,  
analizzando meglio la situazione penso che opterÃ² per una soluzione  
leggermente diversa, dato che in diversi casi non cambia solo la query  
ma anche quasi comletamente la view e altro codice del controller.

In linea di massima per i casi semplici in cui cambia effettivamente  
solo la query, seguo i vostri consigli, e tengo un unico controller per  
tutti gli utenti, mentre per il resto creo un namespace diverso per ogni  
utente contenente un controller ad hoc, mi sembra la soluzione migliore  
per mantenere flessibilitÃ e pulizia.
