Feltételezzük, hogy a következők már kész vannak:
- kezdő migration: alap db táblák létrehozása
rake task
migrationök futtatására (nem akarjuk, minden alkalmazás indításkor lefuttatni a migrationöket)
- modell osztályok
- modell alap validáció
Sidenote:
.gitignore
fájl is legyen a repoban. Most bekerült egy felesleges fájl (sqlite
fájl), ez jó alkalmat nyújthat némi git demóra: hogyan tüntessünk el egy fájlt a
repóból végleg.
Autentikáció: a felhasználónak legyen lehetősége bejelentkezni az alkalmazásba egy egyedi felhasználónév és jelszó párossal. Legyen egy bejelentkező felület. Ezen túl legyen egy olyan oldal is, amit csak bejelentkezett felhasználó érhet el (tesztelés céljából).
Regisztrációs felület nem feltétlenül szükséges. Egyelőre elég, ha előre (kódból) létrehozott felhasználókkal működik a rendszer.
Elvárás ezen túl még, hogy felhasználó jelszavait biztonságosan tároljuk. Ez azt jelenti, hogy az adatbázisban sima szövegként nem jelenhet meg a felhasználók jelszava.
Extra feladat: Remember me funkcionalitás. Vonatkozó RailsCasts epizód.
A végén kerüljön fel minden githubra, hogy meg tudjam nézni.
Jelszavak biztonságos tárolása hashként. Erre használható a bcrypt
.
Dokumentáció itt található. ActiveRecord ad
erre egy könnyű megoldást a has_secure_password
metóduson keresztül.
Dokumentáció
a hivatalos Ruby on Rails doksik között.
Vagy a másik lehetőség, hogy magunktól megírjuk:
require 'bcrypt'
# some authentication goodness with bcrypt
module Auth
include BCrypt
attr_accessor :password_confirmation
# gets the password
def password
@password ||= Password.new self.password_hash
end
# sets the password
def password=(pwd)
@password = Password.create pwd
self.password_hash = @password
end
# validates credentials
def authenticate(pwd)
self.password == pwd
end
# do some validation
def self.included(klass)
# only if active_record is used
if defined? ActiveRecord
klass.validates :password, presence: true, confirmation: true, on: :create
end
end
end
És ezek után már csak használni kell:
class User < ActiverRecord::Base
include Auth
end
User.new.authenticate("password1")
A bejelentkezett felhasználóról valahogy tudni kell, hogy bejelentkezett és ennek az információnak nem szabad elvesznie a kérések között (amik köztudottan állapotmentesek).
Sinatraban alapértelmezetten cookie-kat használhatunk a sessionként. Ha mégis memóriában szeretnénk tartani a session adatokat, akkor a stackoverflow siet a segítségünkre.
Annak eldöntésére, hogy a felhasználó bejelentkezett-e és egyáltalán ki a bejelentkezett felhasználó.
# in app.rb
def current_user
@current_user ||= User.find session[:user_id] if session[:user_id]
end
def logged_in?
!!current_user
end
def protected!
unless logged_in?
redirect to("/login")
end
end
És akkor már csak használni kell:
get "/secret"
protected!
"Ez egy nagyon titkos oldal."
end