Authentikáció
Filed under Rails
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













december 17, 2008 at 4:40 du.
amikor bejelentkezek akkor dob egy hibát: undefined method `find_by_username_and_password’ for #
pedig követtem az utasításokat:D
december 25, 2008 at 11:20 du.
milyen verziójú railst használsz?