Skip to content

Instantly share code, notes, and snippets.

@tmichel
Last active December 16, 2015 00:39
Show Gist options
  • Save tmichel/5349382 to your computer and use it in GitHub Desktop.
Save tmichel/5349382 to your computer and use it in GitHub Desktop.
Kir-Dev tanfolyam 2013 tavasz. Autentikáció implementálása

Kir-Dev tanfolyam: autentikáció

Az előzőek tartalmából

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.

Feladatok szerdára

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.

Tippek a megvalósításhoz

Biztonságos jelszótárolás

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")

Sessionök Sinatrával

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.

Segéd metódusok

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
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment