Database GRANT

Salve a tutti, ho una semplice domanda (non per me ;).

Ho un database con determinati grant (i classici admin, user, guest), il
problema è che non ho la minima idea di come comportarmi in rails!!

Quando avvio la mia applicazione va a guardare il file database.yml e da
li accede al database secondo i parametri contenuti (username incluso),
giusto?
Ma come comportarmi per gestire le 3 tipologie di utenti (e quindi le
differenti connessioni necessarie)?
Nel concreto, come faccio dalla mia login form a connettere il singolo
utente al database?

Spero di essermi spiegato :wink: .

Grazie in anticipo!

Credo di aver capio che desideri modificare i parametri di connessione
al database in funzione dei dati di login.
Per grant intendi proprio l’istruzione grant in SQL? Se così fosse,
non mi sembra sia molto classico come approccio.
Definendo tre set di parametri di connessione, è come se ti collegassi
a tre database diversi.
E’ questo che intendi?

Il giorno 24/set/08, alle ore 20:34, As As ha scritto:

Le grant non sono robaccia. In un utilizzo multi utente sono un ottima
sicurezza.
Ma rails non è multiutente, allora si che le grant danno fastidio.
Purtroppo che io sappia non c’è soluzione al tuo problema e l’accesso al
db lo devi controllare da codice (a meno di installarti qualche plugin,
che non cambia la connessione, ma da codice ti permette di gestire
l’accesso alle singole tabelle).

Utilizza il login di admin e gestisci le autorizzazioni tramite plugin.
Oppure (vado oltre le mie conoscenze) leggiti le tabelle di sistema e
con quelle gestisci l’accesso alle singole risorse…

Ciao Michele.

Fabrizio R. wrote:

Credo di aver capio che desideri modificare i parametri di connessione
al database in funzione dei dati di login.

Esatto: ui login-> connessione database (sfruttando i grant).
Questo perché ho differenti utenti del database.

Per grant intendi proprio l’istruzione grant in SQL? Se cos� fosse,
non mi sembra sia molto classico come approccio.

Sì, proprio i comandi grant di sql…
Purtroppo non ho la facoltà di modificare questa robaccia, quindi mi
ritrovo tre tipologie di utenti per il database (grant e viste
annesse)…

Definendo tre set di parametri di connessione, � come se ti collegassi
a tre database diversi.
E’ questo che intendi?

Non la trovo una gran soluzione ma è la prima (e unica) cosa che ho
pensato… Non c’è alternativa (sempre lasciando intatto il db)??
In caso come fare a settare i diversi set di parametri di connessione?

Intanto grazie per la risposta!

Michele C. wrote:

Le grant non sono robaccia. In un utilizzo multi utente sono un ottima
sicurezza.
Ma rails non è multiutente, allora si che le grant danno fastidio.
Purtroppo che io sappia non c’è soluzione al tuo problema e l’accesso al
db lo devi controllare da codice (a meno di installarti qualche plugin,
che non cambia la connessione, ma da codice ti permette di gestire
l’accesso alle singole tabelle).

Utilizza il login di admin e gestisci le autorizzazioni tramite plugin.
Oppure (vado oltre le mie conoscenze) leggiti le tabelle di sistema e
con quelle gestisci l’accesso alle singole risorse…

Ciao Michele.

[OT] Infatti le grant in progetti passati non sono state un gran
problema (anzi)… in rails sembrano dare realmente fastidio… e in
questo caso diventano robaccia, [/OT]

Quindi consigli di procedere creando una classe che gestica tre
connessioni distinte??

Qualche frammento di codice per partire?

Grazie!

Se l’unica soluzione fosse creare diversi set di parametri di
connessione, come procedo?
Realizzo una classe che instanzia diverse connessioni al db (una per
tipologia d’utente)?
Esempi pratici??

E’ stato più facile del previsto:
http://wiki.rubyonrails.org/rails/pages/Authentication

Di quelli presenti ho visto e apprezato (mai utilizzato) il primo :
Acts_as_authenticated

Ciao Michele.

Non so se esiste la possibilità di gestire tre connessioni diverse.
Ho visto in azione un plugin per gestire le autorizzazioni (purtroppo
non ce l’ho sotto mano).
L’idea che ti proponevo era di connetterti al db come admin, cosi da
avere accesso a tutte le risorse, e gestire le autorizzazioni con il
plugin (faccio una ricerca con guugle).

Ciao Michele.

Non so se risolve il tuo problema, ma puoi definire un db e un utente
per ogni classe.
In database.yml crei una configurazione per un utente:

dbname_development:
adapter: mysql
database: dbname
username: user
password: secret

e poi nella classe, model.rb, ti connetti al db con l’utente che ti
serve

establish_connection “dbname_#{RAILS_ENV}”

Ciao

–Tommaso

Ti ringrazio molto ma… per questioni legate alle specifiche non posso
bypassare i grant… quindi non mi è possibile utilizzare la connessione
admin e gestire l’accesso delle risorse da rails…

In questo momento trovo questo fatto una limitazione enorme di rails…

Devo trovare qualunque escamotage…
Proverò a vedere se è possibile realizzare una specie di classe
“singleton” per ogniuna delle 3 connessioni necessarie…

Se ti viene in mente qualcosa (qualunque cosa!!) fammi sapere!

Grazie mille… comunque vada!!

Tommaso P. wrote:

Non so se risolve il tuo problema, ma puoi definire un db e un utente
per ogni classe.
In database.yml crei una configurazione per un utente:

dbname_development:
adapter: mysql
database: dbname
username: user
password: secret

e poi nella classe, model.rb, ti connetti al db con l’utente che ti
serve

establish_connection “dbname_#{RAILS_ENV}”

Ciao

–Tommaso

Profuma (quasi) di soluzione :wink: ma… supponiamo che l’avvio di rails
avvenga come utente “admin”, come faccio in fase di login (interfaccia
web) a passare alla connessione user (ad es.) ??

Tommaso P. wrote:

Cos� al volo direi:

dal model di login hai il nome dell’utente corrente e fai

establish_connection “dbname_#{username}_#{RAILS_ENV}”

e in database.yml

dbname_username_development:
adapter: mysql
database: dbname
username: username
password: secret

per ogni username che hai

Ma questo funziona solo per classe, quindi ogni modello utilizzato
da quell’utente dopo l’autenticazione, dovrebbe verificare qual’�
l’utente corrente e fare il suo establish_connection

Sarò testone io, ma non è possibile creare una classe che instanzia
tutte e tre le connessioni che necessito, alla quale fanno riferimento i
miei controller (un controller->una istanza (che ne so, magari tramite
richiamo di qualche metodo??))??

Così al volo direi:

dal model di login hai il nome dell’utente corrente e fai

establish_connection “dbname_#{username}_#{RAILS_ENV}”

e in database.yml

dbname_username_development:
adapter: mysql
database: dbname
username: username
password: secret

per ogni username che hai

Ma questo funziona solo per classe, quindi ogni modello utilizzato
da quell’utente dopo l’autenticazione, dovrebbe verificare qual’è
l’utente corrente e fare il suo establish_connection

Tutto da verificare. :wink:

–Tommaso

2008/9/25 Al Shox [email protected]:

L’idea del pooling potrebbe essere risolutiva… faccio un po di prove e
vi faccio sapere!

Al Shox wrote:

Sarò testone io, ma non è possibile creare una classe che instanzia
tutte e tre le connessioni che necessito, alla quale fanno riferimento i
miei controller (un controller->una istanza (che ne so, magari tramite
richiamo di qualche metodo??))??

Io mi definirei un filtro che (dopo l’autenticazione) associa la
connessione all’utente corrente.
Qualcosa di simile a:

class ApplicationController < ActionController::Base
before_filter :check_if_login_required

def check_if_login_required
    # setup user (ad es in User.current) in base alla sessione
    ...
    # carica le configurazioni dei database
    $$config ||= YAML.load_file("#{RAILS_ROOT}/config/database.yml")

    # stabilisci la connessione per le classi di model
    # assumendo che esista un metodo User::role che ti dice
    # il nome del ruolo dell'utente
    ActiveRecord::Base.estabilish_connection $$config[User.current ?

User.current.role: ‘default’]

    redirect_to :controller => "account", :action => "login" and

return false unless User.current
return true
end
end

Se poi vuoi creare le connessioni staticamente allo startup in un pool,
potresti provare.
Crei una classe (in lib/) con metodi statici, richiamandola con

uso: ConnectionPool.connection(‘standard’)

class ConnectionPool

def self.config
    $$config ||= YAML.load_file("#{RAILS_ROOT}/config/database.yml")
end

def self.connection(configuration)
    $$pool ||= Hash.new
    $$pool[configuration] ||=

create_connection(config[configuration])
end

def self.create_connection(hash)
    ...
end

end

Credo che Rails sia gia’ abilitato a gestire pool di connessioni, ma non
ne sono sicuro.
Dovresti googlare al riguardo.
Troverai sicuramente codice migliore.

Per quanto ne so, in Ruby/Rails anzichè un pool di connessioni,
si preferisce gestire un pool di processi, ognuno con la sua
connessione.