首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >#<UserSession:{:unauthorized_record=>"<protected>"}>

#<UserSession:{:unauthorized_record=>"<protected>"}>
EN

Stack Overflow用户
提问于 2011-07-10 11:07:18
回答 2查看 1.6K关注 0票数 8

我正在尝试建立一个“只需点击你的名字登录”系统使用auth_logic。我的用户模型有一个email和name字段。要登录,我只需执行以下操作:

代码语言:javascript
复制
UserSession.create(@user, true)

不幸的是,这并不会导致创建会话。使用调试器时,我发现了以下消息:

代码语言:javascript
复制
#<UserSession: {:unauthorized_record=>"<protected>"}>

我的用户模型只有一行:

代码语言:javascript
复制
acts_as_authentic

用户会话行有这个,我在某个地方找到的。我不知道它是做什么用的,我试过了:

代码语言:javascript
复制
class UserSession < Authlogic::Session::Base
  def to_key
     new_record? ? nil : [ self.send(self.class.primary_key) ]
  end
end

数据库(我也不确定是否需要user_sessions表):

代码语言:javascript
复制
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):

代码语言:javascript
复制
gem 'rails', '3.0.9'
gem 'sqlite3'
gem "authlogic" #, :git => 'git://github.com/odorcicd/authlogic.git', :branch => 'rails3'

Here是其余的源代码。

几天前,我在一个类似的项目中遇到了这个问题,在某种程度上它“就这么消失了”。我只是不记得是怎么回事了。

有什么想法吗?这快把我逼疯了。

EN

回答 2

Stack Overflow用户

发布于 2012-01-30 15:15:47

可能的解决方案...看起来有两个版本的帮助器方法示例在四处漂浮。下面是我们使用的one

代码语言:javascript
复制
@current_user = current_user_session && current_user_session.user

然后是一些较新的教程和示例中的the newer version

代码语言:javascript
复制
@current_user = current_user_session && current_user_session.record

显然,当在session对象上调用.user (或任何登录字段)时,它返回unauthorized_record,而.record.user返回适当的数据。

票数 2
EN

Stack Overflow用户

发布于 2015-11-11 01:35:57

我最近遇到了这个问题,也很困惑。我已经找出了我的代码的具体问题,所以这是另一个潜在的解决方案。

tl;dr

我不明白#<UserSession: {:unauthorized_record=>"<protected>"}>仍然是有效的用户会话,只是我们自己创建的一个未经授权的会话。您可以通过对它调用user来确认这一点,并且您应该获得您传递到UserSession.create中的任何User实例。

原因

真正的问题有两个方面。current_user方法是在假设当前用户在请求的生命周期内不会更改的情况下构建的,我在创建一个请求之前调用了current_user,以确保我还没有一个。它可以简化为以下内容:

代码语言:javascript
复制
def current_user
  return @current_user if defined?(@current_user)

  @current_user = some_method_that_finds_a_proper_user
end

这里的关键是我的查找用户的方法可以返回nil。当它这样做时,它会将@current_user定义为nil,因此该缓存值将始终在后续调用中返回。

解决方案

这就是它变得有点困难的地方,因为它实际上取决于您的代码需要什么。

  1. 如果在使用UserSession.create登录用户模型后不需要current_user,那么除了等待渲染或重定向之外,您不需要做任何事情。在你下一次请求时,你的current_user将被正确设置。
  2. 如果你不需要检查已经登录的用户,在UserSession.create之前删除任何对current_user的调用,如果可能,你对current_user的第一个调用将工作为expected.
  3. Ensure产生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)

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6638927

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档