2012-04-05 82 views
2

我正在嘗試使用ldap進行身份驗證後管理用戶會話。身份驗證部分工作得很好,但似乎無法生成會話ID。我得到「未定義的方法`id爲true:TrueClass」錯誤。Ruby rails - 會話管理

型號 -

def self.Authenticate(login, pass) 
    user = find_by_user_id(login) 
    if user 
    user 
    else 
    return false 
    end 
    conn = Net::LDAP.new(
    :host => SERVER, 
    :port => PORT, 
    :base => BASE, 
    :auth => { 
     :username => "#{login}@#{DOMAIN}", 
     :password => pass, 
     :method => :simple 
    } 
) 
    if conn.bind 
    return true 
    else 
    return false 
    end 
rescue Net::LDAP::LdapError => e 
    return false 
end  

控制器 -

def create 
    user = User.Authenticate(params[:user_id], params[:password]) 

    if user 
    session[:user_id] = user.id 
    redirect_to theapp_url, :notice => "Logged in!" 
    else 
    flash.now.alert = "Invalid email or password" 
    render "new" 
    end 
end 

視圖 -

<%= form_tag sessions_path do %> 
    <p> 
    <%= label_tag :Username %><br /> 
    <%= text_field_tag :user_id, params[:user_id] %> 
    </p> 
    <p> 
    <%= label_tag :Password %><br /> 
    <%= password_field_tag :password %> 
    </p> 
    <p class="button"><%= submit_tag "Log in" %></p> 
<% end %> 

錯誤 -

NoMethodError in SessionsController#create 

undefined method `id' for true:TrueClass 
Rails.root: /myapp 

Application Trace | Framework Trace | Full Trace 
app/controllers/sessions_controller.rb:12:in `create' 
Request 

Parameters: 

{"utf8"=>"✓", 
"authenticity_token"=>"OmzCrLHR1t/xfIXNcEzy2NCGfVpEKSyI4OZfqpPEFNw=", 
"user_id"=>"admin", 
"password"=>"[FILTERED]", 
"commit"=>"Log in"} 

回答

3

User#Authenticate的定義中,它可以返回true。控制器的create動作有session[:user_id] = user.id,但在這種情況下,usertrue。這就是爲什麼你會得到錯誤消息未定義的方法`ID'爲true:TrueClass

修改您的Authenticate方法始終返回一個用戶,或修改您的控制器接受true作爲用戶值。

+0

非常感謝John。這解決了這個問題。我的另一個問題是 - 在rails中,每個會話保持獨立的情況下,來自同一用戶ID的多個登錄? – 2012-04-05 01:12:33

+0

是的,每個會話都是獨立的。 – 2012-04-05 01:14:25

+0

謝謝...最後 - 如何存儲附加到會話的附加屬性?喜歡電子郵件地址或全名。 – 2012-04-05 01:22:12