obsługa różnych użytkowników bazy danych w RoR

Witam,
zaszła taka potrzeba aby oprócz uprawnień dostępu obsługiwanych przez acl9, użytkownicy łączyli się z bazą danych za pomocą różnych kont w tejże.

Czy istnieje taka możliwość w RoR?
Czy mógłby mnie ktoś nakierować na jakiś temat/artykuł/tutorial/gem/konkretną pozycję w api?

PS: pewnie to nieistotne ale do obsługi kont używam authlogic.

Złapać tego, kto taką potrzebę zaszedł, oblać smołą, wytarzać w pierzu i wywalić na zbity pysk. Można taczką jeśli to, nie daj Boże, jakiś kierownik czy inny dyrektor. Jeśli to tylko DBA to dać mu do łapki podręcznik perla, pizzę i zamknąć na kłódkę w składziku (sprawdzić jak otworzył poprzednią kłódkę!).

Jest to dość powalone rozwiązanie bo:

  • nie możesz już korzystać z authlogica
  • musisz samemu napisać proces logowania (osobny kontroler, logowanie do bazy za pomocą ActiveRecord::Base.establish_connection)
  • przechowywać login i hasło w sesji lub wymusić ich ciągłe przesyłanie przez zabezpieczenie każdej podstrony przez http basic authentication (http://railscasts.com/episodes/82-http-basic-authentication)
  • przy każdym requeście z palca nawiązywać połączenie za pomocą odpowiedniego before_filter i wspomnianego establish_connection

Ogólnie: da się, ale jest to BARDZO głupie. Przy BARDZO dążącym do nieskończoności.

Przy czym nie ma najmniejszego wzrostu bezpieczeństwa bez względu na to co jakiś niewydarzony DBA by nie kombinował.

No niestety, w takiej sytuacji mnie postawiono (mam podejrzenie, że w grę wchodzi standardowe podejście do połączenia z bazą danych w php).

zwolnij się ;]

Chyba już tak od jakiegoś czasu w PHP nie ma, że łączysz się z bazą danych przy każdym requeście… były tam jakieś persistent connections z tego co pamiętam. Poza tym, inny użytkownik i hasło dla każdego usera? To się kupy nie trzyma.

a co ma phpowe (bardzo lipne) podejście do łączenia z bazą danych z ilością użytkowników w bazie?

[quote=Bragi]Jest to dość powalone rozwiązanie bo:

  • nie możesz już korzystać z authlogica
  • musisz samemu napisać proces logowania (osobny kontroler, logowanie do bazy za pomocą ActiveRecord::Base.establish_connection)
  • przechowywać login i hasło w sesji lub wymusić ich ciągłe przesyłanie przez zabezpieczenie każdej podstrony przez http basic authentication (http://railscasts.com/episodes/82-http-basic-authentication)
  • przy każdym requeście z palca nawiązywać połączenie za pomocą odpowiedniego before_filter i wspomnianego establish_connection[/quote]
    Wydaje mi się, że przesadzasz w kwestii skomplikowania.

Kolega napisał, że użytkownicy mają się łączyć za pomocą różnych kont w bazie (nie wiem, może ktoś im chce ograniczyć tabele do jakich mają dostęp) ale nie napisał, że ten login i hasło do konta bazodanowego ma być przesyłany non stop tudzież stanowić sposób uwierzytelnienia.

Możemy sobie wyobrazić coś takiego

  • Przychodzi request
  • Użytkownik się loguje, wysyła login i hasło. Znajduję go korzystając ze standardowego połaczenia z bazą.
  • Jeśli użytkownikowi udało się zalogować to establish_connection z danymi do konta bazodanowego, które zostało dla niego utworzone podczas rejestracji.

Przychodzi następny request
w before_filter jeśli ktoś jest zalogowany robimy establish_connection.

Cały czas możemy korzystać z authlogica i tylko trochę hooków trzeba wykorzystać wokół logowania ale generalnie nic nie trzeba za bardzo zmieniać.

Może zadziałać no nie ? Jeśli ma to działać tak jak myślę a nie tak jak Bragi sobie wyobraził to nawet nie takie ciężkie do napisania. Tylko użytkownik bazy danych (ten normalny dla aplikacji a nie dla jakiegoś użytkownika aplikacji) będzie musiał mieć tworzenia innych użytkowników na bazie co też trzeba będzie robić rzeźbiąc SQL z ręki bo na to api w Active Record nie ma. No chyba, że nie ma czegoś takiego w tej aplikacji jak rejestracja użytkowników tylko coś z zewnątrz zasila baze.

[quote=paneq]Możemy sobie wyobrazić coś takiego

  • Przychodzi request
  • Użytkownik się loguje, wysyła login i hasło. Znajduję go korzystając ze standardowego połaczenia z bazą.
  • Jeśli użytkownikowi udało się zalogować to establish_connection z danymi do konta bazodanowego, które zostało dla niego utworzone podczas rejestracji.[/quote]
    Czyli jeśli dobrze rozumiem user aplikacji ma dostęp tylko do jednej tabeli: użytkowników.

Gdzie hasła do bazy danych są zapisane otwartym tekstem.

Cała architektura bezpieczeństwa właśnie wyszła sobie z bunkra przeciwnuklearnego dziurą na lufcik pancerny, który ktoś zapomniał wstawić.

Zwolnić się i przejść do normalnej firmy. Dobra opcja.

[quote=Bragi][quote=paneq]Możemy sobie wyobrazić coś takiego

  • Przychodzi request
  • Użytkownik się loguje, wysyła login i hasło. Znajduję go korzystając ze standardowego połaczenia z bazą.
  • Jeśli użytkownikowi udało się zalogować to establish_connection z danymi do konta bazodanowego, które zostało dla niego utworzone podczas rejestracji.[/quote]
    Czyli jeśli dobrze rozumiem user aplikacji ma dostęp tylko do jednej tabeli: użytkowników.

Gdzie hasła do bazy danych są zapisane otwartym tekstem.

Cała architektura bezpieczeństwa właśnie wyszła sobie z bunkra przeciwnuklearnego dziurą na lufcik pancerny, który ktoś zapomniał wstawić.

Zwolnić się i przejść do normalnej firmy. Dobra opcja.[/quote]
Szukasz dziury w całym. Penq do tego zdaje się nie jest nawet autorem rozwiązania stara się tylko wydedukować o co chodzi a ty już go chcesz “powiesić” za wszelkie błedy projektowe :wink:

Wracając do wątku możliwość istnieje, ale nie jest prosta, to będzie gruby hax ponieważ wszystko powyżej AR ma z załążenia już być połączone i uwierzytelnione z bazą danych. Czy istnieje domyślne połączenie wykorzystywane do uwierzytelniania użytkowników, po którym następuje przełączenie się na już konkretnego użytkownika, czy raczej użytkownik logując się powinine nawiązać takie połączenie czyli w zasadzie nawiązanie połączenia z baza będzie już uwierzytelnieniem.

[quote=Bragi]Czyli jeśli dobrze rozumiem user aplikacji ma dostęp tylko do jednej tabeli: użytkowników.
Gdzie hasła do bazy danych są zapisane otwartym tekstem.[/quote]
OMG Nic takiego nie napisałem, nie wiem gdzie ty to widzisz. Chodziło mi o opcję: wyobraź sobie normalne super hiper bezpieczne logowanie jakie tylko potrafisz i jedyną rzecz jaką do tego masz sobie dodać w wyobraźni to, że dla uwierzytelnionych użytkowników następuje establish_connection do ich konta bazodanowego.

User aplikacji mógłby działać z dostępem do tabeli użytkowników tylko zapewne ale to nie znaczy, że musi być do niej ograniczony.

Bragi, może ktoś piszę jakąś aplikację w której będzie autodiscover co możesz przeglądać na podstawie zabezpieczeń bazy ? Taki tool do oglądania bazy danych tylko ? Skąd ja mogę wiedzieć jakie ktoś ma wymagania, tylko nieśmiało rzucam pomysły, które pozwolą mu pozbyć się problemu.

Nie skaczmy sobie do oczu bo nie znamy powodów dla których pojawiło się takie wymaganie. Nie sądzę, żebyśmy mieli tu do czynienia z jakimś super wymyślnym rodzajem aplikacji. Nie w polskich warunkach. Obstawiam piwo, że ktoś po prostu wpadł na pomysł ‘tak będzie bezpieczniej bo na poziomie bazy danych sobie wszystko zabezpieczymy’.

Murrinus dostał już wszystkie potrzebne klocki do poradzenia sobie z problemem. Zostawmy mu decyzję o tym co i jak zrobi. Fajnie jakby dał znać jak problem rozwiązał.

Przy czym nadal uważam poradę Gotara za najlepszą.

Ja uważam ją za najsłabszą. Będziesz się zwalniać z każdej firmy, która postawi przed Tobą jakieś nietrywialne wymaganie?
Tego czy jest ono głupie akurat nie wiesz.

Chyba nie doceniasz projektów robionych przez inne zespoły. Niby czemu w PL nie miałoby powstawać coś bardziej złożonego ?

Chyba źle mnie rozumiesz Robercie.

Wiem na jak skomplikowane i nietrywialne projekty stać Polaków. W końcu robimy w naszej firme Winnie Cloud, prawda?

Tutaj jednak widzę młodego programistę, który na początku swej drogi z Rails boryka się z problemem który łatwo da się wytłumaczyć niekompetencją DBA/kierowników/architektów. Widziałem tego sporo w swoim życiu, tak jak i Ty miałem okazję pracować w dużej korporacji wykorzystującej masę inteligentnych programistów jako małpy przy komputerze realizujące pomysły przepłaconego ‘architekta’.

Stosuję po prostu brzytwę Ockhama.

A ponieważ chłopak nie wygląda na doświadczonego to może lepiej by było, żeby zdobywał to doświadczenie w rozsądniejszym zespole. Co o tym sądzisz?

Dlatego byłem tak zdzwiony twoją wypowiedzią.

Owszem, jest to pierwsze co przychodzi na myśl, ale tego nie wiemy. Gdybamy sobie.

Taką decyzję zostawiam już jemu. Na pewno sam jest bardziej zorientowany w temacie swojego otoczenia niż my tutaj gdybyjący sobie o tym i owym i ma więcej danych uprawniających do podejmowania decyzji w tą lub w drugą stronę.

Ktoś przychodzi z jakimś stricte technicznym problemem, którego nie opisał do końca. Dopowiedzieliśmy sobie resztę i mówimy mu “zwolnij się” ? Chyba nie takiej pomocy się spodziewać można było…

Dziękuję wszystkim za odpowiedzi.

Cóż będę próbował reformować, a jak nie wyjdzie to skorzystam z porady panq’a

Zwolnienie nie wchodzi w grę na razie :stuck_out_tongue:

Do jasnej ciasnej. Zamiast facetowi pomóc to pleciecie androny żeby się zwalniać bo ma chłopak prawdziwych adminów?

Jeżeli ACL masz na poziomie modeli to robisz tak:

w config.yml:

[code]production_ro:
tu: credentiale do bazy RO
production_rw:
tu: credentiale do bazy RW
production:
:<< *production_ro (albo RW cokolwiek uzywasz jako default)

class PrzykladowyModelRW < ActiveRecord::Base
database_name = Rails.env.production ? :production_rw : Rails.env.to_sym
establish_connection(database_name)
end[/code]
Jeżeli masz na poziomie użytkownika (jedno konto użytkownika w aplikacji = jedno konto użytkownika w bazie danych), to piszesz moduł logowania do authlogica, jest mnóstwo przykładowych (OpenID, etc.) wiec bierzesz jeden, modyfikujesz i bangla.

Nie wiem dlaczego używanie tego co natura dała (ACL w bazie danych) uważacie za coś potwornego, ale jak dla mnie to świetny przykład nieortodoksyjnego unikania NIH i po napisaniu odrobiny kodu idealny przykład KISS.

Czy wszystkie wypowiedzi których nie rozumiesz nazywasz “pierdoleniem”?

Oraz: przekonywałem moderatorów forum że nowy regulamin (napisany przeze mnie zresztą) wystarczy do ogarnięcia się użytkowników, nie trzeba będzie ludzi brać za mordę. Właśnie mnie przekonujesz że nie miałem racji :confused:

Przepraszam, chyba przesadziłem ze słownictwem odrobine. Ale weź pod uwagę że była częścią użytecznego posta. Jedynego w tym wątku który podejmuje próbe pomocy gościowi, na zasadzie innej niz “znajdź sobie inną pracę”