我正在运行一个带有Devise 2.1.2的Rails 3.2.14应用程序,并在我的应用程序控制器中检查并发/重复会话。
我希望在我的应用程序控制器中调用signout_and_redirect后,能够在模板视图中显示一个闪烁通知,该通知显示"检测到重复登录"
以下是我的代码:
application_controller.rb
def check_concurrent_session
if duplicate_session?
flash[:notice] = "Duplicate Login Detected"
sign_out_and_redirect(current_user)
end
end
def duplicate_session?
user_signed_in? && (current_user.login_token != session[:token])
end
我用上面的代码尝试过,但当我触发重复会话时,浏览器会注销,但不会显示闪烁通知。
在我的application.html.erb中,我有以下设置来显示闪光通知/警报。
<% if flash[:notice] %>
<p class="alert"><%= flash[:notice] %></p>
<% end %>
<% if flash[:alert] %>
<p class="alert"><%= flash[:alert] %></p>
<% end %>
您能使用会话吗?
def check_concurrent_session
if duplicate_session?
sign_out_and_redirect(current_user)
session[:duplication_notice] = "Duplicate Login Detected"
end
end
# users/sessions_controller.rb
def new
if session[:duplication_notice].present?
flash.now[:alert] = session[:duplication_notice]
session.delete(:duplication_notice)
end
super
end
flash
的生存期是直到下一个操作。
sign_out_and_redirect
authenticate_user!
sign_in
日志
Started GET "/" for 127.0.0.1 at 2015-04-13 17:08:02 +0900
Processing by Users::FunctionsController#home as HTML
Filter chain halted as :check_concurrent_session rendered or redirected
Completed 302 Found in 9ms (ActiveRecord: 0.9ms)
Started GET "/" for 127.0.0.1 at 2015-04-13 17:08:02 +0900
Processing by Users::FunctionsController#home as HTML
Completed 401 Unauthorized in 1ms
Started GET "/users/sign_in" for 127.0.0.1 at 2015-04-13 17:08:02 +0900
Processing by Users::SessionsController#new as HTML
Completed 200 OK in 3258ms (Views: 3254.7ms | ActiveRecord: 0.3ms)
因为sign_out
清除了session
,所以会话设置在sign_out之后。
你放在闪光灯中的任何东西都将暴露在下一个动作
您可以在不重定向的情况下注销,稍后使用flash消息进行重定向。使用after_sign_out_path_for方法将确保使用正确的重定向路径,即使它是自定义的。
以您为例:
if duplicate_session?
user = current_user
sign_out(user)
redirect_to after_sign_out_path_for(user),
alert: 'Duplicate Login Detected'
end
对于最新版本的design,您也可以在清除用户会话后重定向到新的用户会话路径。
if duplicate_session?
flash[:notice] = "Duplicate Login Detected"
sign_out current_user
redirect_to new_user_session_path
end
这将在重定向后持续闪烁