RoR e permessi limitati su pagine

Buongiorno a tutti.
L’applicativo in qualche maniera sta andando avanti, come anche la mia
esperienza… o quasi, visto che mi pianto spesso.

Questa volta l’ostacolo riguarda i permessi sulle pagine. Mi spiego:
devo fare in modo che ci sia una pagina di visualizzazione di tutti i
dati inseriti visibile solo dagli utenti con il valore della colonna
“admin” impostato a “1” (0 = utente comune, 1 = amministratore). Sto
usando act_as_autenticated e come da suggerimento nella sua pagina sono
andato qui:
http://technoweenie.stikipad.com/plugins/show/User+Authentication per
vedere i dettagli di una gestione del genere. Come ormai avrete capito,
non sono riuscito a darne fuori… Ho provato a fare così: nel
controller dove compaiono i parametri della pagina in questione (nome
pagina: lista) ho scritto:

def lista
def authorized?(user)
@current_user.admin = “1”
end
altre cose
riguardanti lista
end

Quel @current_user.admin è stato sostituito anche con user.login,
current_user.login, ho provato a verificare in base al nome (login, come
suggerito dall’esempio), ma nulla.
Ho anche messo skip_before_filter :login_required all’inizio del
controller (sotto before_filter :login_required; se lascio solo lo
“skip” va in errore)

Non ho provato gli altri sistemi (tipo “def protect?(action)”) perché
non ho capito a cosa si riferissero le “action” (accesso alla pagina?
cose del genere?).

Ho frainteso qualcosa delle indicazioni delle pagine? Qualcuno sa dove
sto sbagliando?

Grazie per la pazienza ed i suggerimenti :slight_smile:
Daneel O.

On 3/13/07, Daneel O. [email protected] wrote:

current_user.login, ho provato a verificare in base al nome (login, come
suggerito dall’esempio), ma nulla.

non so come la cosa sia strutturata dentro AAA, ma credo dovrebbe essere
current_user senza lo @ davanti. da lquella funzione credo vada a
pescare lo
user dalla session piuttosto che da una instance variable. just
guessing.

On 3/13/07, Daneel O. [email protected] wrote:

Provato anche così, ma il risultato non cambia. Il bello è che non mi dà
manco un errore… non è che abbia sbagliato da qualche altra parte?

current_user lo stai usando nel controller vero? credo non venga
valorizzato
dentro il model

Chiaro Scuro wrote:

On 3/13/07, Daneel O. [email protected] wrote:

current_user.login, ho provato a verificare in base al nome (login, come
suggerito dall’esempio), ma nulla.

non so come la cosa sia strutturata dentro AAA, ma credo dovrebbe essere
current_user senza lo @ davanti. da lquella funzione credo vada a
pescare lo
user dalla session piuttosto che da una instance variable. just
guessing.

Provato anche così, ma il risultato non cambia. Il bello è che non mi dÃ
manco un errore… non è che abbia sbagliato da qualche altra parte?

Hai messo “include AuthenticatedSystem” nel ApplicationController?
Perché hai messo authorized dentro lista?

Hai anche scritto @current_user.admin = “1” ma hai dovuto usare ==

Il giorno 13/mar/07, alle ore 15:34, Daneel O. ha scritto:

def authorized?(user)
@current_user.admin = “1”
end

I metodi? ritornano sempre un booleano (a meno che chi li ha scritti
non sia violentemente ubriaco), scommetto che quell’authorized? vuole
un == e non un assegnamento.

HTH,
ngw

Rob C. wrote:

Hai messo “include AuthenticatedSystem” nel ApplicationController?

Sì.

Perch� hai messo authorized dentro lista?

Mi pareva il posto più logico, vedendo gli esempi fatti nella pagina di
spiegazione.
Se c’è un sistema migliore, dimmi pure.

Hai anche scritto @current_user.admin = “1” ma hai dovuto usare ==

Provato, non cambia nulla.

Non è che “include AuthenticatedSystem” in qualche modo bypassa quelli
che scrivo dentro “lista”? Il problema però è che se aggiungo “, :except
=> [:lista]” effettivamente toglie il controllo, ma lo fa
definitivamente: tutti possono andare su quella pagina. Sto facendo
altre prove, ma ci capisco sempre meno. C’è da qualche parte un esempio
pratico più corposo di come si usano quei controlli?

Daneel O.

On 14/03/07, Daneel O. [email protected] wrote:

Rob C. wrote:

Hai messo “include AuthenticatedSystem” nel ApplicationController?

Sì.

Perch� hai messo authorized dentro lista?

Mi pareva il posto più logico, vedendo gli esempi fatti nella pagina di
spiegazione.
Se c’è un sistema migliore, dimmi pure.

Non ho visto esempi così. Dovresti fare

def authorized?(user)
user.admin == “1”
end

def lista

end

Hai anche scritto @current_user.admin = “1” ma hai dovuto usare ==

Provato, non cambia nulla.

hmm… prova a mettere un po di debug per capire se @current_user, o
current_user, o user vengono istanziate.

def authorized?(user)
puts "@current_user = "
p @current_user
puts "current_user = "
p @current_user
puts "user = "
p user
user.admin == “1”
end

Non è che “include AuthenticatedSystem” in qualche modo bypassa quelli
che scrivo dentro “lista”? Il problema però è che se aggiungo “, :except
=> [:lista]” effettivamente toglie il controllo, ma lo fa
definitivamente: tutti possono andare su quella pagina. Sto facendo
altre prove, ma ci capisco sempre meno. C’è da qualche parte un esempio
pratico più corposo di come si usano quei controlli?

Non dovrebbe bypassare niente. In ogni caso ti da dei errori?

Alur, riassunto: ho capito che non ho capito nulla sul funzionamento
della gestione accessi '-_-

Per caso sapete dove possa trovare una guida (o anche un esempio) su
cosa fare, cosa scrivere e dove per fare in modo che l’utente comune
veda e compia certe azioni, mentre l’utente amministratore vede e fa
altre cose?

Sto anche sfogliando manuali, ma o ho quelli sbagliati, oppure sono
troppo generici per i miei gusti e capacità …

Ancora grazie per la pazienza e i suggerimenti.

Daneel O.

On 3/15/07, Daneel O. [email protected] wrote:

Alur, riassunto: ho capito che non ho capito nulla sul funzionamento
della gestione accessi '-_-

Se hai pazienza alcuni di noi stavano scrivendo un articolo proprio su
questo per therubymine… .-)

nel frattempo quello che puoi fare nelle view puoi mettere uno switch
fatto
così…

<% if current_user.administrator? %>

<% else %>

dove administrator è il tuo campo boolean in tabella user.

questo assume che utente e amministratore vedano le stesse pagine ma in
modo
leggermente diverso.

se vuoi proteggere le pagine ti basta mettere nei metodi del controller

redirect_to :action => ‘forbidden’ unless current_user.administrator?

forbidden è una action + view che ti fai tu per indicare l’access denied

Daneel O. wrote:

Alur, riassunto: ho capito che non ho capito nulla sul funzionamento
della gestione accessi '-_-

dunque dunque…

intanto (visto che fai rifereimento nel messaggio inziale ad AAA) direi
di separare autenticazione da autorizzazione: la prima si cura di
determinare chi sta accedendo ad una applicazione la seconda di
decidere cosa possa fare ogni soggetto.

il plugin AAA risolve solo il problema di autenticazione e non quello
di autorizzazione (e direi che lo fa in modo sufficientemente generico
da essere adatto alla maggioranza delle applicazioni).

Per caso sapete dove possa trovare una guida (o anche un esempio) su
cosa fare, cosa scrivere e dove per fare in modo che l’utente comune
veda e compia certe azioni, mentre l’utente amministratore vede e fa
altre cose?
hmm… non so darti una indicazione precisa, ma credo che un manuale
che spieghi come fare l’autorizzazione non esista (nei termini in cui lo
stai cercando)…

Sto anche sfogliando manuali, ma o ho quelli sbagliati, oppure sono
troppo generici per i miei gusti e capacità …

perche il problema della determinazione dei ruoli e dei permessi
(chi-fa-cosa) e’ parte dell’applicazione e non e’ certo generalizzabile
in maniera assoluta.

La prima cosa che devi decidere e’ cosa deve fare il sistema come
autenticazione (l’autorizzazione puoi risolverla con AAA)

ciao,
Luca

Web: http://spazidigitali.com - http://thetyper.com
Email: mailto://[email protected]
Skype: callto://l.mearelli
Tel: +39 347 7764416

Il giorno 15/mar/07, alle ore 16:13, Daneel O. ha scritto:

Alur, riassunto: ho capito che non ho capito nulla sul funzionamento
della gestione accessi '-_-

Per caso sapete dove possa trovare una guida (o anche un esempio) su
cosa fare, cosa scrivere e dove per fare in modo che l’utente comune
veda e compia certe azioni, mentre l’utente amministratore vede e fa
altre cose?

Eh, bisogna implementarlo …
Una volta che sai riconoscere il ruolo del tuo utente e’ semplice
isolarlo da cio’ che non puo’ fare, usa lo stesso approccio con
filtri dell’autenticazione, e’ esattamente la stessa cosa …
Una soluzione piuttosto elegante starebbe nell’usare la single table
inheritance, dove Admin < User, Staff < User ecc. ecc. in modo da
eseguire un check sul “tipo” piuttosto che su un attributo,
semplicissimo da gestire con un before_filter.

Sto anche sfogliando manuali, ma o ho quelli sbagliati, oppure sono
troppo generici per i miei gusti e capacità…

C’è una recipe su Rails Recipes, che spiega un approccio abbastanza
tipico.
Io, normalmente, quando qualcosa non mi entra nella testa, mi
sviluppo tutto from scratch, cosi’ sono sicuro di capire.

pfao,
ngw


Nicholas W.
[email protected]
http://www.tochunky.org

On Mar 15, 2007, at 4:13 PM, Daneel O. wrote:

Alur, riassunto: ho capito che non ho capito nulla sul funzionamento
della gestione accessi '-_-

Per caso sapete dove possa trovare una guida (o anche un esempio) su
cosa fare, cosa scrivere e dove per fare in modo che l’utente comune
veda e compia certe azioni, mentre l’utente amministratore vede e fa
altre cose?

Intanto una precisazione: l’autenticazione e l’autorizzazione sono due
aspetti distinti che andrebbero affrontati separatemente.
Per quanto riguarda l’autorizzazione, io trovo molto valido questo
plugin:

http://www.writertopia.com/developers/authorization

che ti permette di usare meccanismi molto flessibili (dai casi piu’
semplici a casi anche molto complessi) rimanendo agnostico riguardo
lo strato di autenticazione sottostante.

Chiaro Scuro wrote:

On 3/15/07, Daneel O. [email protected] wrote:

Alur, riassunto: ho capito che non ho capito nulla sul funzionamento
della gestione accessi '-_-

Se hai pazienza alcuni di noi stavano scrivendo un articolo proprio su
questo per therubymine… .-)

Resto in attesa, allora :slight_smile:

nel frattempo quello che puoi fare nelle view puoi mettere uno switch
fatto
cos�…

<% if current_user.administrator? %>

<% else %>

dove administrator � il tuo campo boolean in tabella user.

questo assume che utente e amministratore vedano le stesse pagine ma in
modo
leggermente diverso.

Come al solito le soluzioni più semplici sono le più difficili da
trovare. Per ora questo sistema va più che bene, grazie. Lo applico e
intanto mi studio il resto.

Per autenticazione ed autorizzazione, cambia decisamente molto sapere
che sono gestite separatamente, specialmente se si è abituati a sistemi
che gestiscono le due cose in apparenza senza far distinzioni.

Alla prossima.

Daneel O.