Rejestracja Logowanie i autentykacja

Witam

Zaczynam dopiero zabawę z Rails. Chciałem stworzyć aplikacje w RoR która służyła by do rejestracji, logowania i śledzenie czy dany użytkownik jest zalogowany czy nie? Chciałbym też zrobić coś takiego żeby nie można sie zalogować na jedno konto w jednym czasie z dwóch komputerów. Szukałem w internecie jakichś tutoriali do tego. Znalazłem kilka ale ciągle mi jakieś błędy wyskakują. Znacie jakiś prosty sposób na zrobienie tego ?? Albo jakiegoś linka gdzie mógłbym zobaczyć jak to sie robi.

Z rejestracją nie miałem dużego problemu.
Najgorzej idzie mi z logowaniem i sprawdzaniem kto jest zalogowany przy przechodzeniu w pod strony? Nie mogę sobie z tym poradzić :frowning:

Pomóżcie
Dzięki z góry za pomoc.

Nie wiem czy o to chodzi, ale moze funkcja before_filter wywolywana z controlera ci pomoze.
A jak chcesz miec liste osob ktore sa obecnie zalogowane to musisz zapisywac sesje do bazy danych, inaczej to chyba nie da rady.
Tak to jest przynajniej rozwiazane na frameworku na ktorym pracuje w PHP.

Musisz wtedy czuscic tablice z zapisanymi sesjami co jakis czas, powiedzmy raz na godzine z jakiegos crona. Wtedy wpisy nieaktualniane od powiedzmy 30 min, uznajesz za zamkniete i wykasowujesz. Ma to swoje liczne wady oczywiscie.

Może LoginGeneretor?
Kodu tam naprawdę jest nie za wiele, więc latwo się zorientować.
Wygeneruj sobie model, kontroler i widoki, to może ulatwi zrozumienie.

Moga Cie zaciekawic te pluginy:
Autoryzacja: http://www.writertopia.com/developers/authorization
Autoryzacja : http://technoweenie.stikipad.com/plugins/show/Acts+as+Authenticated

Te wydaly mi sie najrozsadniejsze po dosc doglebnych poszukiwaniach w tym temacie.

witam

skorzystałem z login generatora, wszystko fajnie , tylko jest mały problem, wyszukuje on hasła w bazie w SHA1 lecz hasz hasła stowrzony przez rails jest inny niż hasz stworzoeny przez phpmyadmin

tu jest log z zapytaniem od rails:

4 Query SELECT * FROM users WHERE (login = ‘admin’ AND password = ‘9a91e1d8d95b6315991a88121bb0aa9f03ba0dfc’) LIMIT 1

a w bazie mam tak:

admin a94a8fe5ccb19ba61c4c0873d391e987

co moze być przyczyną i czy można zmienić kodowanie na MD5

MD5 juz sie nie uzywa.

Nie wiedzialem jak to ustrojstwo zainstalowac wiec znalelzem po prostu kod gdzies na sieci, w katalogu z tym login generatorem bedziesz mial taki szablon http://www.koders.com/ruby/fid079461FC3D16D357EE3BC0A511CF2D5B017A3ACE.aspx a tam juz powinienes sie sam domyslic co zrobic i co zmienic. Jesli juz wygenerowales sobie kod, to zmien kod a nie szablon.

Do prostych zastosowań wystarcza całkowicie acts_as_authenticated. Linki i opisy na http://wiki.rubyonrails.org/railshttp://wiki.rubyonrails.org/rails. Polecam

Ja używam AAA i jest wystarczające dla mnie, szczerze polecam.

zaisntlowałem AAA i wywwali mi taki błąd:

NameError in AccountController#login

undefined local variable or method `crypted_password’ for #User:0xb718e70c

/usr/lib/ruby/gems/1.8/gems/activerecord-1.15.3/lib/active_record/base.rb:1860:in method_missing' app/models/user.rb:33:inauthenticated?’
app/models/user.rb:19:in authenticate' app/controllers/account_controller.rb:14:inlogin’

i jeszcze jedno pytanie co to jest jest “salt” np.

Encrypts some data with the salt.

def self.encrypt(password, salt)
Digest::SHA1.hexdigest("–#{salt}–#{password}–")
end

Salt to jest wartość (różna dla każdego usera) dodawana do hasła przy haszowaniu. Zwiększa bezpieczeństwo przechowywanego hasła.

i teraz już jasne dlaczego sumy haseł nie zgadzają się

albo ja czegoś nie łapie albo AAA dział słabo, zroibłem wszystko jak opisali, mam w bazie 3 pola “login” “cyrpted_password” “salt”, dodaje usera porzez akcje signup, wszystko się dodaje jest pieknie, ale jak próbuje się zalgowac to tylko odświeża ekran i nic sie nie dziej, sprawdziłem zapytanie jakie wysłał do bazy :

 SELECT * FROM users WHERE (users.`login` = 'michal')  LIMIT 1

jak on tym zapytaniem chce wyciągnąc hasło, nie dziwie się że nie moge się zalgować

Proste. Tym zapytaniem wyciąga z bazy usera, jak który chcesz się zalogować. Potem tylko bierze hasło, które podajesz i porównuje jego hasz do tego z bazy. Jeśli zwraca Cię z powrotem do ekranu logowania, a nie do wiersza o tytule “In the Caboose” (co w brytyjskim slangu oznacza ‘w dupie’ :wink: to znaczy, że rzeczywiście nie możesz się zalogować.
Spróbuj odpalić ./script/console i przeprowadzić kroki, które on wykonuje z ręki i zobacz co zwraca, może się coś wyjaśni.

Tutaj fragment kodu AAA, który wyjaśnia ten mechanizm:

(/app/models/user.rb)
def self.authenticate(login, password)
u = find_by_login(login) # need to get the salt
u && u.authenticated?(password) ? u : nil
end

def authenticated?(password)
crypted_password == encrypt(password)
end

ja rozumie że tym zapytaniem pobiera nazwe usera ale także musi pobrać hasło a takie zapytanie już się nie generuje

Przyznaję, że na SQLu się za bardzo nie znam, ale…

SELECT * FROM users WHERE (users.`login` = 'michal')  LIMIT 1

pobiera całego usera wraz z pełnym dobrodziejstwem inwentarza (salt, crypted_password).
Jakby ktoś chciał (nie wiedzieć po co) pobrać tylko nazwę, wyglądałoby to raczej tak:

SELECT login FROM users WHERE (users.`login` = 'michal')  LIMIT 1