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ć
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.
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
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.
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’ 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
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