話說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 %>