4/05/2007

Persistent Login on Rails

Rails 社群一向是使用最方便的 Session 來做 login,而且 Rails 的 Session 也實做的非常方便。不過有些時候 Session 也有不方便的地方,像是關掉 Borwser 就要重新 Login,如果我們希望能夠做到永久 Login ,那該怎麼搞呢?

我採用這個網頁的方式,他的好處是只在 cookie 存入一個隨機的 id ,並不會存任何資訊在 cookie 裡面。



1. 安裝 UUID 的套件
因為要隨機產生 id ,總是要一個亂數產生的套件,這裡我們就用原作者的選擇 UUID
gem i uuidtools

2. DB 裡面新增一個 Persistent Login 的 table
我們新增一個 table ,把他叫做persistent_logins,結構大概是 id , uid , user_id 當作 interger ,create_on 當作 datetime。user_id 代表相對應的 user table id ,uid 就是放到 cookie 裡面的隨機 id 。

3. 建立一個 PersistentLogin 的 Model
裡面的結構很簡單,之前說的 UUID 就是用在這裡,其實可以在這裡換另外一個亂數產生器。
class PersistentLogin < ActiveRecord::Base

belongs_to :user
before_create :assign_uid

private

def assign_uid
self.uid = UUID.random_create.to_s
end
end
3. 在使用者已經 login 成功的的地方放入下面的 code
 p = PersistentLogin.create(:user=>u)
cookies[:p_session_id] = {:value => p.uid, :expires => Time.now + 7.days}
在裡面,u 就是這個使用者的 user model ,他會在 cookie 裡面放 p_session_id 這個值,expire time 是 7天。

4. 在判斷是否 login 的地方加入這些 code

def get_current_user
if session[:user].nil?
if cookies[:p_session_id] && p = PersistentLogin.find_by_uid(cookies[:p_session_id])
session[:user] = c_user.id
end
end
end

5. logout 的地方加入這樣的code

def logout
session[:user] = nil

if cookies[:p_session_id] && p = PersistentLogin.find_by_uid(cookies[:p_session_id])
p.destroy
end

cookies.delete :p_session_id
end
這裡的code 相當的 rough ,但是卻很容易實做出來。

沒有留言: