我正在尝试建立一个“只需点击你的名字登录”系统使用auth_logic。我的用户模型有一个email和name字段。要登录,我只需执行以下操作:
UserSession.create(@user, true)不幸的是,这并不会导致创建会话。使用调试器时,我发现了以下消息:
#<UserSession: {:unauthorized_record=>"<protected>"}>我的用户模型只有一行:
acts_as_authentic用户会话行有这个,我在某个地方找到的。我不知道它是做什么用的,我试过了:
class UserSession < Authlogic::Session::Base
def to_key
new_record? ? nil : [ self.send(self.class.primary_key) ]
end
end数据库(我也不确定是否需要user_sessions表):
create_table "sessions", :force => true do |t|
t.string "session_id", :null => false
t.text "data"
t.datetime "created_at"
t.datetime "updated_at"
end
add_index "sessions", ["session_id"], :name => "index_sessions_on_session_id"
add_index "sessions", ["updated_at"], :name => "index_sessions_on_updated_at"
create_table "user_sessions", :force => true do |t|
t.datetime "created_at"
t.datetime "updated_at"
end
create_table "users", :force => true do |t|
t.datetime "created_at"
t.datetime "updated_at"
t.string "persistence_token"
t.string "email"
t.string "name"
end我使用的是Rails 3.0.9,我的Gemfile显示(我同时尝试了normal和Github authlogic gem):
gem 'rails', '3.0.9'
gem 'sqlite3'
gem "authlogic" #, :git => 'git://github.com/odorcicd/authlogic.git', :branch => 'rails3'Here是其余的源代码。
几天前,我在一个类似的项目中遇到了这个问题,在某种程度上它“就这么消失了”。我只是不记得是怎么回事了。
有什么想法吗?这快把我逼疯了。
发布于 2012-01-30 15:15:47
可能的解决方案...看起来有两个版本的帮助器方法示例在四处漂浮。下面是我们使用的one:
@current_user = current_user_session && current_user_session.user然后是一些较新的教程和示例中的the newer version:
@current_user = current_user_session && current_user_session.record显然,当在session对象上调用.user (或任何登录字段)时,它返回unauthorized_record,而.record.user返回适当的数据。
发布于 2015-11-11 01:35:57
我最近遇到了这个问题,也很困惑。我已经找出了我的代码的具体问题,所以这是另一个潜在的解决方案。
tl;dr
我不明白#<UserSession: {:unauthorized_record=>"<protected>"}>仍然是有效的用户会话,只是我们自己创建的一个未经授权的会话。您可以通过对它调用user来确认这一点,并且您应该获得您传递到UserSession.create中的任何User实例。
原因
真正的问题有两个方面。current_user方法是在假设当前用户在请求的生命周期内不会更改的情况下构建的,我在创建一个请求之前调用了current_user,以确保我还没有一个。它可以简化为以下内容:
def current_user
return @current_user if defined?(@current_user)
@current_user = some_method_that_finds_a_proper_user
end这里的关键是我的查找用户的方法可以返回nil。当它这样做时,它会将@current_user定义为nil,因此该缓存值将始终在后续调用中返回。
解决方案
这就是它变得有点困难的地方,因为它实际上取决于您的代码需要什么。
UserSession.create登录用户模型后不需要current_user,那么除了等待渲染或重定向之外,您不需要做任何事情。在你下一次请求时,你的current_user将被正确设置。UserSession.create之前删除任何对current_user的调用,如果可能,你对current_user的第一个调用将工作为expected.nil的方法链不使用缓存,不缓存nil,或者更改这些缓存值的保护以确定值是否为真,而不是是否定义了实例变量。可以将防护更改为:如果!@current_user.nil?#或@current_user.present?则返回@current_user?在Rails中
或者,您可以使用Ruby的||=操作符和隐式返回。我上面的简化示例可以改为:
def current_user @current_user ||= some_method_that_finds_a_proper_user end
或者如果它不是那么简单
def current_user @current_user ||= begin some_code doing_many things_here end end
预期(UserSession).to receive(:create).with(user)
https://stackoverflow.com/questions/6638927
复制相似问题