参考一篇文章:设计限制每个用户一次会话
我已经按如下方式设置了我的 Rails 应用程序:
路线.rb
devise_for :users, :controllers => { :sessions => "my_sessions" }
应用控制器:
before_filter :check_concurrent_session
def check_concurrent_session
if is_already_logged_in?
sign_out_and_redirect(current_user)
end
end
def is_already_logged_in?
current_user && !(session[:token] == current_user.login_token)
end
my_sessions 控制器:
class MySessionsController < Devise::SessionsController
skip_before_filter :check_concurrent_session
def create
super
set_login_token
end
private
def set_login_token
token = Devise.friendly_token
session[:token] = token
current_user.login_token = token
current_user.save
end
end
当我把它连接起来并重新启动我的 Rails 服务器时,它加载得很好。但是,当尝试登录时,它会快速恢复到登录屏幕。根据我的开发日志,我可以看到它击中了 MySessions 控制器:
Started GET "/users/sign_in" for 127.0.0.1 at 2012-08-30 10:51:24 -0500
Processing by MySessionsController#new as HTML
Rendered devise/sessions/new.html.erb within layouts/application (1.4ms)
Completed 200 OK in 16ms (Views: 15.8ms | ActiveRecord: 0.0ms)
设计/会话/新
<h2>Secure Login</h2>
<%= form_for(resource, :as => resource_name, :url => session_path(resource_name)) do |f| %>
<div><%= f.label :login %>
<%= f.text_field :login, :placeholder => 'Username or Email' %></div><br />
<div><%= f.label :password %>
<%= f.password_field :password, :placeholder => '••••••••' %></div><br />
<div><%= f.submit "Login", :class => 'btn btn-inverse' %></div>
<% end %>
即使它击中了覆盖控制器,之后它也没有做任何事情。我已经按照文章进行了发球,它适用于另一个用户。谁能看看我的代码,看看我做错了什么。
我真的很想正确限制会话,因为我的应用程序依赖它。我尝试过使用 Devise Security Extension,但在按照说明操作后不断得到一个未定义的方法“unique_session_id”,所以我想我会试试这个。
提前谢谢各位!