Nejdříve předestřu globální pohled na toto řešení a jeho integraci do aplikace. Přihlašovací informace jsou prezentovány v tabulce, v tomto případě pojmenované people
ve forme přihlašovacího jména login
a SHA1 hashe hesla sha1hash
. Model této tabulky Person
je rozšířen o několik metod sloužících k ověření hesla daného uživatele. Dále implementujeme
FIXME: work in progress.
Začnu jednoduchým řešením s uživatli v databázi. Předpokládejme že uživatelé jsou v tabulce 'people' popsané modelem Person
. Sloupec s přihlašovacím jménem se jmenuje login
, a hash hesla je uložen v sloupci sha1hash
.
První věcí kterou potřebujeme udělat je rozšířit model o několik metod které budeme potřebovat.
def valid_password?(password) self.sha1hash == self.sha1_digest(password) end
def self.sha1_digest(password, salt=nil) '{SHA}'+Base64.encode64(Digest::SHA1.digest(password)).chomp end
def self.authenticate(login, password) user = find(:first, :conditions => ["login = ?", login]) return nil if user.nil? return user if (Person.sha1_digest(password) == user.sha1hash) nil end
def login if request.post? @user = Person.find_by_login(params[:login]) if @user and @user.login == 'radek' session[:uid] = @user.id redirect_to :controller => 'listy', :action => 'index' else @auth_error = 'Wrong username or password' end end end