2014-09-19 66 views
0

我正在爲我的應用程序使用自定義無密碼登錄。用戶只需輸入他們的用戶名或電子郵件,然後將具有令牌的唯一登錄鏈接發送給他們。他們輸入用戶名或電子郵件到一個簡單的形式:rails 4強參數會話

<%= form_tag request_token_path, id:'login-form' do %> 
    <%= text_field_tag :user_id %> 
<% end %> 

這帖子的sessions#request_token方法,驗證用戶是否存在,然後沿着登錄鏈接發送。

def request_token 
    lookup = session_params[:user_id] 
    if lookup.include? '@' 
    @user = User.find_by(email: lookup) 
    else 
    @user = User.cached_find(lookup) 
    end 
    if @user 
    @user.send_login_link 
    redirect_to login_path, notice: "#{@user.username.capitalize} your email was sent!" 
    else 
    redirect_to login_path, notice: "Whoops! Looks like #{lookup} is not registered on this site. Please check spelling or signup!" 
    end 
end 

我的問題是,在我的SessionsController文件中定義了一個sessions_params

private 
def session_params 
    params.require(:session).permit(:user_id,:auth_token) 
end 

我知道這意味着我必須使用一個會話對象或爲了從形式沿:user_id通過自我將:user_id定義爲會話屬性有效的參數。我想知道正確的方法來做到這一點。創建一個新的會話對象是沒有意義的,因爲這甚至不是我的模型,但是從參數中拿出它是否安全?

而改爲lookup = params[:user_id]

回答

1

如果您有響應user_id說明屬性的會話對象,您需要專門創建該對象的形式:

<%= form_for @session do |f| %> 
    <%= f.text_field :user_id %> 
<% end %> 

如果不是的話,你需要堅持form_tag的,請嘗試屬性名稱的東西,會拿出控制器作爲會話哈希:

<%= text_field_tag "session[user_id]" %> 

當你

params.require(:session) 

這意味着你需要你的PARAMS哈希有一個會話密鑰,這反過來應該允許USER_ID屬性:

{params: {session: {user_id: "something"}} 

而這就是爲什麼你需要的form_for @Session:或建議的文本字段「session [user_id]」name

+0

我明白爲什麼我需要其中一個或另一個我只是想知道哪個更安全。製作會話對象似乎比較安全,因爲我使用強參數,但創建會話對象也沒有意義,因爲它只是臨時存儲信息,而不是實際的模型。 – kittyminky 2014-09-19 02:36:27

+0

即使它們不是模型,創建會話對象也是一種很好的做法。創建對象和進一步的會話資源意味着你可以爲你的會話設置一個RESTful控制器,這在Rails中是一個很好的練習(創建會話,銷燬會話等) – 2014-09-19 02:39:14

+0

但是'session'已經是一個存在於Rails中的對象,爲什麼我會創建自己的臨時存儲信息?我的問題是發送控制器沒有明確定義的參數是否安全。 – kittyminky 2014-09-19 20:56:02