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. 在使用者已經 login 成功的的地方放入下面的 code
4. 在判斷是否 login 的地方加入這些 code
5. logout 的地方加入這樣的code
我採用這個網頁的方式,他的好處是只在 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
p = PersistentLogin.create(:user=>u)在裡面,u 就是這個使用者的 user model ,他會在 cookie 裡面放 p_session_id 這個值,expire time 是 7天。
cookies[:p_session_id] = {:value => p.uid, :expires => Time.now + 7.days}
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這裡的code 相當的 rough ,但是卻很容易實做出來。
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
沒有留言:
張貼留言