Witam,
mój problem polega na tym, że nie potrafię sobie poradzić z hashowaniem hasła. Czytałam już inny wątek na tym forum (http://www.rubyonrails.pl/forum/p5961-2008-07-08-21:11:25) i oto co udało mi się spłodzić na jego podstawie:
require ‘digest/md5’
class Admin < ActiveRecord::Base
attr_accessor :pass
attr_protected :crypted_pass
HUMANIZED_ATRIBUTES = {
:login => "Login",
:pass => "Hasło",
:mail => "E-mail",
}
def self.human_attribute_name(attr)
HUMANIZED_ATRIBUTES[attr.to_sym] || super
end
before_save :crypt_pass
/* w tym miejscu są tylko ograniczenia, co do długości i poprawności loginu, hasła i e-mailu - zwykła walidacja */
validates_confirmation_of :pass, :message => " różni się od potwierdzenia"
private
def self.md5(password)
Digest::MD5.hexdigest(password)
end
def crypt_pass
crypted_pass = self.class.md5(pass) unless pass.blank?
end
end
W rezultacie w bazie (mysql) nie zapisuje się hasło, albo zapisuje się hasło zerowej długości. Po rejestracji, nowy użytkownik zostaje automatycznie zalogowany i widoczne są dla niego wszystkie opcje, dostępne po zalogowaniu. I wszystko byłoby ok, z tym, że po wylogowaniu, nie mogę się ponownie zalogować na to nowo utworzone konto. Wyrzuca błąd, że jest niepoprawny login lub hasło. Domyślam się, że szkopuł tkwi z haśle.
I tutaj moje pytanie: Jak mam się dobrać do tego zahashowanego hasła w bazie żebym mogła się zalogować? Czy przy logowaniu też trzeba hashować hasło żeby porównać je z tym z procesu rejestracji?
Warto raz napisać logowanie samemu, tak jak stara się to zrobić kolega. Moim zdaniem wartość edukacyjna takiego przedsięwzięcia jest spora: uczysz się tego co jest podstawą działania wszystkich innych mechanizmów typu authlogic i devise. Więc polecam kontynuowanie zabawy. Nasz praktykant coś takiego pisał w ramach wprawki, jutro sprawdzę czy to się do czegoś nadaje i jeśli tak to umieszczę tu kod.
Udało się. Devise załatwiło sprawę. Dziękuję za pomoc.
Ale jeszcze jedno pytanko związane z rejestracją: Chciałabym żeby przy rejestracji użytkownicy podawali dodatkowo jakiś kod, ciąg znaków. (Chodzi mi to, żeby nie każdy mógł się zarejestrować, tylko osoby znające ten kod, który dostałyby od admina. A kod taki znajdowałby się np w bazie, miałby osobną tabelę, wypełnioną np czteroznakowymi ciągami liczb i cyfr, i po użyciu jednego z tych kodów stawałby się on już nieaktywny.) Jest może jakaś gotowa metoda do tego, czy raczej muszę sama kombinować z bazą?
Za to mam inny problem. Elementy utworzone poprzez Devise stworzyły tylko widoki, można dorobić do nich wspólnego kontrolera? Bo chciałabym dla nich zrobić wspólny layout pobierający inne dane z bazy, ale nie mam gdzie przekazać parametrów.
Podobny problem mam z logowaniem, wszystko działa ok, jeśli odnoszę się do tego wygenerowanego automatycznie, a chciałabym zrobić logowanie w górnym prawym rogu strony, dostępne z każdej podstrony. Jak robiłam “własne” logowanie, to nie było z tym żadnego problemu, a teraz jak kopiuję dane z automatycznie utworzonego logowania do wspólnego layoutu to wyskakuje mi błąd, mówiący o tym, że nie można znaleźć podanych parametrów (np. resource_name, którego nie widzę nawet w bazie).