2012-04-05 92 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