Ruby on Rails創建你自己的User並實現登陸功能

話說rails裏面有許多gem可以實現用戶管理等等各種複雜的功能,但是對於一個初上手ror的菜鳥來說,未免也會顯得有點無從下手,所以我們乾脆來做一個簡單的用戶類,來了解一些基本的概念,之後用其他人的gem的時候也會得心應手。

ok,現在

rails generate model user login:string hashed_password:string salt:string

下面這些代碼是你需要加在User.rb這個對象中的

class User < ActiveRecord::Base
  attr_accessible :login, :password
  validates :login, :presence => true
  
  def password
    @password
  end
  
  def password=(pass)
    return unless pass
    @password = pass
    generate_password(pass)
  end

  private
  def generate_password(pass)
    salt = Array.new(10){rand(1024).to_s(36)}.join
    self.salt, self.hashed_password = 
      salt, Digest::SHA256.hexdigest(pass + salt)
  end
end
對於初學者來說,上面這部分代碼可能會比較難以理解一些,在這裏主要是定義了一個password方法用來接受創建用戶的時候輸入的密碼,爲了避免密碼被明文存儲所以需要一個password的產生器用以將密碼加密,在這裏我們使用的加密方式是SHA256而不是之前的MD5,這個原因呢據說是因爲一箇中國女博士的功勞,讓破解MD5的加密變得比較輕鬆了。最後存我們要存兩個東西,一個是hashed_password,另一個是salt,前者是加密的密碼,後者存了關於這次加密的一些信息,用來後面的密碼驗證用的。

此時還需要

rake db:migrate

然後我們rails c進入控制檯

User.create(:login => "gonjay", :password => "111111")

這裏解釋一下ror中的new和create的區別,就是new的時候沒有保存對象到數據庫,create的時候會保存,如果在你new一個對象之後再save一下,那麼作用就和create的作用是一樣的。至於ruby中爲什麼用“=>”來表示賦值,可能是因爲看起來比較酷吧~

此時你User.all的時候就能看見你剛剛創建的對象了,很嗨皮是吧,可是我們要怎麼才能和這個User一起嗨皮呢?

rails generate scaffold session

然後我們需要session_controller.rb

class SessionsController < ApplicationController
  def new
  end
  
  def create
    @user = User.authenticate(params[:login], params[:password])
    if @user
      session[:user_id] = @user.id
      flash[:notice] = "Weclome #{@user.login}"
      redirect_to posts_path
    else
      flash[:notice] = "The login or password is not correct."
      redirect_to new_session_path
    end
  end
end
這個控制器繼承了基本的應用控制器類,我們在create方法中做了一些事情,此時用到了User的authenticate方法,這個方法暫時還沒有寫,先把坑挖了放這裏。

此時傳進去了兩個參數,是從view那邊post過來的東西,我們用ApplicationController自己帶的一個params的方法把post過來的數據抓取住。(話說我之前玩芯片總是被各種寄存器折磨的要死,現在看見這些東西覺得好神奇#^=^#,你可以不需要操心底層的是怎麼做事的了~)

下面貼出在User的authenticate代碼

  
  def self.authenticate(login, password)
    user = User.find_by_login(login)
    if user && Digest::SHA256.hexdigest(password + user.salt) == user.hashed_password
      return user
    end
    false
  end
  


加上self之後,這個方法就成爲了一個私有方法,不能被別人隨便調用。authenticate裏面首先根據login判斷這個user是否存在我們的數據庫中,如果在就返回這個user,將其中的salt和輸入的password用SHA256給它整到一起,看看能不能湊成之前存的hashed_password這個值,如果湊成了就說明密碼是對的,沒有就返回錯囉~

現在我們還要在view/sessions/new.html.erb給它加上一些表單,然後我們就能歡快的登陸了

<h1>Admin Login</h1>
<%= form_tag sessions_path do -%>
  <label for="login">Login</label>
  <%= text_field_tag :login, params[:login] %>
  <label for="password">Password</label>
  <%= password_field_tag :password, params[:password] %>
  
  <%= submit_tag "Login"%>
<% end %>



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章