Nagy projekt második rész. Felhasználók.

Eljött az idő, hogy csináljunk a projekthez jó kis felhasználó kezelést. Ehhez létre kell hoznunk egy User modelt, be kell állítanunk, hogy a sessionoket, db-ben tároljuk és ne cookieban. Most már csak nagyobb vonalakban fogom leírni a lépéseket, ha valaki valamit nem ért, akkor kérdezze meg a kommentekben. 

Mielőtt belevágnánk el kell mondanom, hogy van egy rakat plugin authentikációra. Ezek közt vannak nagyon jók, viszont meg kell, hogy mondjam ezeket én nem használom, az évek során megírtam a magam kis modulját erre, ami eddig mindig bevált. Korábban meg-meg néztem még 1.2.6os Railsnél ezeket a pluginokat, viszont akkor vagy sok volt a tudásuk, vagy kevés, és így kezdtem neki egyedinek az írásához. Meg ugye sajnos a nyílt forrásnak meg van az a hátránya, ami egyben az előnye is, hogy sokan látják, és a hibák hamarabb kiderülnek, amik authentikációnál nagy kockázatot jelentenek.

 

Nos akkor hozzuk létre a User modelt egyenlőre bőven elég a username és password paraméterekkel. Ha megvan akkor szépen migrateljünk. Ezután hozzunk létre egy users controllert, index, new, update, show viewkal.Állítsuk be, hogy REST legyen. Ezek után készítsük el a new, createt a movies-hoz hasonlóan. 

 

Most már kicsit pofozzuk ki az application.html.erbnket a layout mappában. Adjunk hozzá doctypot és “dobozoljunk” kicsit. Csináljunk egy új partialt a layout mappába, legyen a neve, mondjuk _login_box.html.erb. Ezt a partialt rendereljük a side divbe. 

 _login_box.html.erb

<div id="login">  
  <%= link_to "regisztáció", new_user_path %>
</div>
 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <title>Filmek adatbázisa</title>
  </head>
  <body>
    <div id="wrapper">  
       <div id="side">  
        <%= render :partial=>"layouts/login_box"%>                
      </div>
 
      <div id="content"> 
        <%= yield %>
      </div>
 
    </div>
  </body>
</html>

Mielőtt tovább mennénk gyorsan állítsunk be egy-két dolgot. Először is jelenleg a sessionöket a cookieban tároljuk. Ezt állítsuk át, hogy db-ben tároljuk őket. Nézzünk bele a config/environment.rb-be és  nézzünk rá az 55. sorra. Itt oldjuk fel a kommentet a 58.sorról. 

 

  # Use the database for sessions instead of the cookie-based default,
  # which shouldn't be used to store highly confidential information
  # (create the session table with "rake db:sessions:create")
  config.action_controller.session_store = :active_record_store
 
 

Majd futassuk le a fentebb lévő rake parancsot, akár Netbeansben akár parancssorban.
Netbeansben jobb gomb Run Rake Task -> db->session->create. Ezután migrateljünk.  

Viszont most ki kell lőni a cookie based sessiont, ehhez viszont ki kell kommentálni a 50-53. sort. 

#  config.action_controller.session = {
#    :session_key =>; '_MovieDb_session',
#    :secret      =>'bab4db93dfb6ddd51fe9c8d88886e939a6f0bf70e406ee6c808bd583c78903b3f8248f9f1ed423548f8e975b2c9e0fa96230ffcb7683a2725ac1f2abd92d852c'
#  }

Van még egy dolgunk ezzel kapcsolatban. Menjünk az application controllerünkbe és ott láthatjuk azt a leírást, hogy ha nem cookie session storet használunk akkor a :secretet oldjuk fel. 

Ezek után, ha futtatjuk a szervert és megnyitva az oldalt nem dob hibát akkor jók vagyunk, ha valami hibát dob (leginkább 500 errort) akkor valamit rosszul állítottunk be. 

 

Dobjuk össze gyorsan a regisztrációhoz a new user-nek a view-t.

<%= error_messages_for :user %>
<%form_for :user, :url=>users_path do |f| %>
  <p> <%= f.label(:username, "Felahsználónév: ") %>
  <%= f.text_field :username %></p>
 <p> <%= f.label(:password, "Jelszó: ") %>
  <%= f.password_field(:password)%> </p>  
  <%= submit_tag "Regisztráció" %>
<% end %>
 

Mivel itt ugye kényes adatokat kezelünk ezért egy-két dolgot be kell állítanunk. 

  • Egyedi felhasználónevek.
  • Kitöltés kötelező.
  • Jelszó tárolása kódolva az adatbázisban.
  • Bizonyos tartalmak átírása kívülről.

Ezek beállításához a User modellhez kell egy-két sort hozzáadnunk, hisz ugye mikor a create metódust meghívjuk akkor az az átadott paraméterekből létrehoz egy új egyedet a User modellből.

#a jelszo kodolashoz szuksegvan ra
require 'digest/sha2'
class User &lt; ActiveRecord::Base
  #ne lehessen kivulrol semmilyen modon  meghivni password valtozo get/set fugvenyeit.
  attr_protected :password
  #Letrehozzuk a :pass valtozohoz a get/set fugvenyt.
  attr_accessor :pass
  #egyedi felhasznalonev
  validates_uniqueness_of :username, :case_sensitive => false
 
  #kitolts kotelezo a kovetkezokre
  validates_presence_of :username,  :message => "Felhasználónév kitöltése kötelező"
  validates_presence_of :pass, :message=>"Jelszó kitőltése kötelező"
  validates_presence_of :pass_confirmation, :message=>"Jelszó megerősítés kitőltése kötelező"
 
  #jelszo megerosites
  validates_confirmation_of :pass, :message=>"A jelszavak nem egyeznek!"
 
  #jelszo es felhasznalonev hossza
  validates_length_of :username, :within => 3..64, :too_short=>"Min hossz 3", :too_long=>"Max 64."
  validates_length_of :pass, :within => 4..20, :too_long => "Túl hosszú max 20.", :too_short=>"Min hossz 4"
 
  #mielott elmentjuk
  def before_save
    self.password = User.encrypt(pass) if !self.pass.blank?
  end
 
  protected
  def self.encrypt(string)
    return Digest::SHA256.hexdigest(string)
  end
 
end

 

Közben átírtam kicsit a new viewt.

<%= error_messages_for :user %>
<%form_for :user, :url=>users_path do |f| %>
  <p> <%= f.label(:username, "Felahsználónév: ") %>
  <%= f.text_field :username %></p>
 <p> <%= f.label(:pass, "Jelszó: ") %>
  <%= f.password_field(:pass)%> </p>
  <p> <%= f.label(:pass_confirmation, "Jelszó: ") %>
  <%= f.password_field(:pass_confirmation)%> </p>
  <%= submit_tag "Regisztráció" %>
<% end %>

 

Ami a User modellből magyarázatra szorul az a before_save metódus. A railsbe alapból be van építve egy rakat dolog. Az ActiveRecordeba beépítették ezeket a before, after metódusokat, amik értelemszerűen a nevük szerint futnak le. Itt a lista.

Most, hogy már a regisztrációnk szépen fut 1 valamit még nem látunk. Ezek pedig a flashek. Ahhoz, hogy lássuk őket adjuk hozzá a layoutunkhoz a következő sorokat, a body rész tetejére valahova, de igazából bárhova ahol szeretnénk, hogy ezek megjelenjenek.

 <% if flash[:notice] -%>
        <div id="notice"><%= flash[:notice] %></div>
      <% end -%>
      <% if flash[:error] -%>
        <div id="error"><%= flash[:error] %></div>
      <% end -%>

Most próbáljuk ki, hogy működnek-e a dolgok. A hibák jelenleg még angolul jelennek meg(kivéve a mi felirataink), ehhez viszont egy-két dolgot overrideolni kell. Ezt majd később. 

Ezzel most kész is lennénk. Most adjunk kis csst a rendszerbe, mert így kezd nagyon csúnya lenni. 

body {
  background-color: #666;
  margin: 0;
  padding: 0;
  font-family: Helvetica, Arial, sans-serif;
}
 
 
 
div#wrapper {
	padding: 0;
	margin: 0 auto 0 auto;
	position: relative;
	 border: 10px solid #ccc;
	width: 980px;
}
 
#content {
	float: left;
  background-color: #fff;
  width: 810px;
  padding: 10px 10px 20px 10px;
  overflow: hidden;
}
 
div#side {
	width: 150px;
	height: 400px;
	float: left;
	background-color: #606060;
}
 
div#errorExplanation.errorExplanation {
	background-color: #ffe4d5;
}
div#notice {
	color: #5eaa5a;
	background-color: white;
}
.clear{
	clear: both;
}
#errorExplanation h2 {
	color: #ff0e00;
}
 
* html #content {
  height: 1%;
}

application.erb.html

 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <title>Filmek adatbázisa</title>
    <%= stylesheet_link_tag "standard" %>
  </head>
  <body>
    <div id="wrapper">  
      <% if flash[:notice] -%>
        <div id="notice"><%= flash[:notice] %></div>
      <% end -%>
      <% if flash[:error] -%>
        <div id="error"><%= flash[:error] %></div>
      <% end -%>
      <div id="side">  
        <%= render :partial=>"layouts/login_box"%>
      </div>      
      <div id="content"> 
        <%= yield %>
      </div>
      <div class="clear">  </div>
    </div>
  </body>
</html>

Hozzáadtuk a stylesheetet egy jó kis helper metódussal.
Így sem lett sokkal szebb viszont átláthatóbb :D . Remélem még a mai nap folyamán lesz idő megírni az authentikációt is. Holnapig azt is postolom. 

 

Jó olvasgatást!

 

 

júl23

5 Responses to “Nagy projekt második rész. Felhasználók.”

  1. Legionnaire Says:
    július 23, 2008 at 8:49 du.

    Hello!
    Mi ez a sok gt? Pl.::message =>

    Csak valami karakterhiba?

  2. hupsz, igen, koszi hogy szóltál javítom.

  3. az eredményt láthatnánk valahol?

  4. Sajnos ezt a példát nem raktam fel, és nem is tervezem, hogy felrakom. Majd a forrást lehet 1ben kirakom egy zipben és akkor azt tudjátok futtatni.

  5. na ezt is kivégeztem, klafa cikk, de egy valami “bugos”. amikor regisztráltam, és lefut a redirect: redirect_to users_path akkor az a users model index.html.erb fájlára dob. ami üres. gondolom ez már egyéni szocprobléma hogy hova irányitom a usert reg után

Leave a Reply