我是Rails的新手,我正在关注Michael Hartl的Rails教程,所以我的代码主要是从那里借来的。这是场景:
我使用Computer A
登录我的网站。然后我使用Computer B
使用相同的用户ID登录网站。当我使用Computer A
注销网站时,Computer B
仍然会登录并仍然可以执行操作。出于安全原因,我希望在Computer B
注销后强制Computer A
再次登录。是否有一种简单的方法可以在注销时使给定用户的所有会话无效?如果您有一些非常感谢的示例代码。
我还读到最好在注销时使用reset_session。但是,我在确定是否应该在退出用户之前或之后使用reset_session
时遇到问题?
这是来自我的会话控制器:
def destroy
log_out if logged_in?
# Reset session to prevent session fixation vulnerability
reset_session
flash[:info] = "You are now logged out"
redirect_to root_url
end
这是我的Sessions Helper:
# Forgets a persistent session
def forget(user)
user.forget
cookies.delete(:user_id)
cookies.delete(:remember_token)
end
# Logs out the current user
def log_out
forget(current_user)
session.delete(:user_id)
@current_user = nil
end
答案 0 :(得分:1)
这是他们必须的工作。
会话依赖于browser.if登录到一台PC,然后您的会话保留在您当前工作的同一浏览器上。如果您使用另一台PC登录,那么您的浏览器会为您创建另一个会话。
您可以使用google和Facebook等知名网站尝试此方案。
请参阅以下链接。
What are sessions? How do they work?
如果你试图在单机中销毁所有会话,你可以试试。
rake db:sessions:clear
答案 1 :(得分:0)
您可以采用的一种方法是在用户模型上设置一个标志,让我们称之为active
或status
,这将是数据库中的布尔列。当用户注销时,您将活动列设置为false
。现在,在您的current_user
方法中,在控制器中,您只需要检查用户是否为active
,如果没有清除会话。
这里有一个我可以为此涂鸦的小片段:
class User
# you should add an active or status column through a migration
# enum status: {true => :active, false => :inactive} # largely personal preference for enums, you could define other helper methods without needing the enums
end
# x_controller
def log_out
...
user.inactive!
...
end
def current_user
if @current_user ||= User.active.find_by_id(session[:user_id])
# the user is active continue
@current_user
else
# the user is not active clear the session
session.clear
end
end
之前没有尝试过代码,但这是我认为你可以实现这一目标的方式。