我正在使用Devise和Ruby on Rails开发游戏。
用户可以登录并加入游戏。
第一次登录时,一切都很好-这表明他们以预期的身份登录。
但是我很少(无论是在现实生活中还是在测试中)都发现一种令我感到困惑的情况。
突然,一个用户“成为”另一个用户。好像他们已经以其他用户身份登录一样。他们拥有对帐户的完全访问权限,Rails认为他们已经以其他用户身份登录。诸如“ current_user.name”和“ current_user.email”之类的所有内容均取决于另一位用户,他们以前没有以该用户身份登录过,并且该用户无权成为该用户。
我不知道这可能来自我的代码。我不想在这里发布我的全部代码,所以我希望对 how 进行一些头脑风暴,甚至有可能在我的代码中引起类似的事情-还是我更多可能会看到一个设计错误,在这个错误中,设计会在某些比赛条件下搞砸它返回的会话?
从一般安全性的角度来看,对于使用devise的任何站点而言,后者的处理都有些令人恐惧,但我认为其他人现在可能会看到这种情况。因此,我认为它一定在我的代码中-但是我在代码中的任何地方都不会触及会话信息,也不会做任何奇怪的事情,例如将current_user分配给任何事情。
要非常清楚发生了什么:
对我可能会缺少的东西有什么想法吗?
我的设计设置允许电子邮件/密码登录以及使用Facebook等的oauth登录。
-
根据要求,这是设备迁移:
-
class DeviseCreateUsers < ActiveRecord::Migration
def change
create_table(:users) do |t|
## Database authenticatable
t.string :email, null: false, default: ""
t.string :encrypted_password, null: false, default: ""
## Recoverable
t.string :reset_password_token
t.datetime :reset_password_sent_at
## Rememberable
t.datetime :remember_created_at
## Trackable
t.integer :sign_in_count, default: 0, null: false
t.datetime :current_sign_in_at
t.datetime :last_sign_in_at
t.string :current_sign_in_ip
t.string :last_sign_in_ip
## Confirmable
t.string :confirmation_token
t.datetime :confirmed_at
t.datetime :confirmation_sent_at
t.string :unconfirmed_email # Only if using reconfirmable
## Lockable
# t.integer :failed_attempts, default: 0, null: false # Only if lock strategy is :failed_attempts
# t.string :unlock_token # Only if unlock strategy is :email or :both
# t.datetime :locked_at
t.timestamps
end
add_index :users, :email, unique: true
add_index :users, :reset_password_token, unique: true
# add_index :users, :confirmation_token, unique: true
# add_index :users, :unlock_token, unique: true
end
end
答案 0 :(得分:2)
可以通过多种方式发生这种情况,显然很难从这里判断出问题所在。由于Devise经过了实战测试,因此我认为这是您要做的事情,而不是设备正在做的事情(当然,Devise仍然有可能有bug,但是您的代码有可能有bug)
你有
您能找到一种在本地重现错误的方法吗?也许使用以不同用户身份登录并检查用户身份是否保持不变的脚本。 它与什么服务器一起发生? 您使用什么会话存储?