Ruby on rails 在Rails中使用Desive注销特定用户
我设计了一个用户认证系统。 我想注销具有特定id的用户 在我的控制器中Ruby on rails 在Rails中使用Desive注销特定用户,ruby-on-rails,ruby,ruby-on-rails-4,devise,Ruby On Rails,Ruby,Ruby On Rails 4,Devise,我设计了一个用户认证系统。 我想注销具有特定id的用户 在我的控制器中 def exit @user = User.find(5) sign_out(@user) # this line here signs out the current_user end designe的注销命令,即使我通过@user,它也会注销当前的用户。 如何从数据库中选择一个用户并使用designe命令将其注销 我假设这是某个管理模块的一部分,您想在其中注销某个特定用户 然而,这并不容易
def exit
@user = User.find(5)
sign_out(@user) # this line here signs out the current_user
end
designe的注销命令,即使我通过@user,它也会注销当前的用户。
如何从数据库中选择一个用户并使用designe命令将其注销 我假设这是某个管理模块的一部分,您想在其中注销某个特定用户 然而,这并不容易解决。用户是否登录将存储在会话中。因此,要注销另一个用户,您必须能够访问其会话 注意:如果
注销
方法仅在当前会话中有效,或者可能通过warden(不太了解warden)有效,它可以扩展到当前服务器曾经接触过的所有会话。但是:如果您使用passenger,或者某种形式的rails服务器集群(这是非常常见的),afaik这将不起作用。我想听听其他的解释:)注销使用给定的参数来确定从当前会话中注销(afaik)的范围
所以我们通常会添加一种紧急按钮来注销所有用户:这会破坏所有会话。注意:这当然只有在使用数据库或文档存储支持的会话存储时才可能实现
或者,您可以打开所有会话,查找正确的会话(针对您的用户),然后销毁这些会话
要从存储在activerecord中的特定会话中读取数据,可以编写以下命令:
@session = ActiveRecord::Base.connection.select_all( "SELECT * FROM sessions WHERE session_id = '#{sess_id}'" )
Marshal.load(ActiveSupport::Base64.decode64(@session.data))
有其他办法:
- 使用
Timeoutable
模块,并强制用户超时
- 如果您使用
Rememberable
,您可以使用@user.遗忘我
,但我不确定这是否会影响当前会话
从设备api文档中,注销(@user)方法应该可以工作。当前用户是否可能碰巧拥有id 5?您是在测试中还是在开发/生产环境中签出用户?目的是什么?是否确定已设置@user
会话请参见。