Authentikáció

 Vágjunk bele. Először is adjunk egy szép kis formot a login_box partialba amin keresztül betudnak jelentkezni az emberek.

<div id="login">  
  <h2>Bejelentkezés: </h2>
  <% form_for :user, :url => auth_path do |f| -%>
    <p>Felhasználónév:<br /><%= f.text_field :username, :size => 15 %></p>
    <p>Jelszó:<br /><%= f.password_field :pass, :size => 15 %></p>
    <%= submit_tag 'Bejelentkezés' %>
  <% end %>
 
  <%= link_to "regisztáció", new_user_path %>
 
</div>

Sokan csinálnak (köztük én is) külön controllert a login, logoutnak, viszont én ezeket most a user controllerbe fogom csinálni. Mielőtt ezekbe belevágunk adjunk egy új metódust a User modelhez, aminek a neve legyen authenticate, ez egyszerűen paraméterben megkapja a felhasználónevet és jelszót, majd megkeresi őket, és visszaadja. Rubyban, nincs megadva return akkor is alapból az utolsó értéket adja vissza.

 def self.authenticate(username, password)
    find_by_username_and_password(username, User.encrypt(password))
  end

 

A find_by ugyanaz, mint ha megadtuk volna hogy find(:all …. ) viszont így kicsit rövidebb.

Most írjunk egy modult. No de mi az a modul? A modul effektíve egy osztály, csak ezt nem kell példányosítani és ezért konstruktor sem kell neki, hasonló mint javaban az interfaces. A lib mappába csináljunk egy új ruby  modult LoginSystem névvel. 

module LoginSystem
  protected
  #megadjuk hogy melyik metodusok legyen egyben helperek is (viewbol meghivhato legyenek)
  def self.included(base)
    base.send :helper_method, :is_logged_in?, :logged_in_user,:get_user
  end
  #get a logged_in_userre, ha mar van ilyen azaz be vagyunk jelentkezve
  def logged_in_user
    @logged_in_user = User.find(session[:user]) if session[:user]
  end
 
  #megnezzuk, hogy vane mar userunk vagy sessonunk(ha van session akkor van user is) fo a biztonsag
  def is_logged_in?
    if !logged_in_user.nil?  || !session[:user].nil?
      return true
    else
      return false
    end
  end
 
  #set a logged_in_userre, amin keresztul letrehozzuk a user sessiont
  def logged_in_user=(user)
    #ha nem nulla a user
    if !user.nil?
      session[:user] = user.id
      @logged_in_user = user
    end
  end
end

Ahhoz, hogy ezt elérjük mindenhonnan includeoljuk be az application controllerbe. 

include LoginSystem
 

Adjuk hozzá a logout, és authenticate metódusokat a user controllerhez.

def authenticate
    self.logged_in_user = User.authenticate(params[:user][:username],params[:user][:pass])
    if is_logged_in?
      flash[:notice] = "Sikeresen bejelentkezett"
      redirect_to index_url
    else
      flash[:error] = "A felhasználóneve vagy a jelszava hibás"
      redirect_to :action => 'login'
    end
  end

  def logout
    reset_session
    flash[:notice] = "Kijelentkezve."
    redirect_to index_path
  end

Persze most még ezeknek meg kell csinálni a pathet a routes.rb-ben.

3
4
 map.auth "/auth", :controller=>"users", :action=>"authenticate"
 map.logout "/logout", :controller=>"users", :action=>"logout"

Kétféleképpen adhatjuk meg a tartalmaknak, hogy csak akkor jelenjenek meg, ha mondjuk be van jelentkezve a user, vagy ha admin stbstb. 1. A viewban egy if-el. 2. A controllerben before_filterrel.
Most az elsőt alkalmazzuk, módosítsuk kicsit a login_boxunkat.

<div id="login">  
  <% if is_logged_in? %>
    Üdvözöllek <%= logged_in_user.username %>
    <%= link_to "Kijelentkezés", logout_path %>
 
<% else %>
  <h2>Bejelentkezés: </h2>
  <% form_for :user, :url => auth_path do |f| -%>
    <p>Felhasználónév:<br /><%= f.text_field :username, :size => 15 %></p>
    <p>Jelszó:<br /><%= f.password_field :pass, :size => 15 %></p>
    <%= submit_tag 'Bejelentkezés' %>
  <% end %>
 
  <%= link_to "regisztáció", new_user_path %>
<% end %>
</div>

A második módszerről a következő postban írok majd.

Látható, hogy a felhasználó kezelés és alapból a session kezelés is egyszerű a railsben mint miden.

További jó olvasgatást!

 

júl24

2 Responses to “Authentikáció”

  1. amikor bejelentkezek akkor dob egy hibát: undefined method `find_by_username_and_password’ for #

    pedig követtem az utasításokat:D

  2. milyen verziójú railst használsz?

Leave a Reply