1

記事の参照:一度にユーザーごとに 1 つのセッションを制限するように工夫する

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」を取得し続けるので、代わりにこれを試してみることにしました。

よろしくお願いします!

4

1 に答える 1

1

しません

current_user && !(session[:token] == current_user.login_token)

ログインしている場合は常に true ですか?

再ログインするとログインしているので、ログインする必要があるため、リダイレクトを説明します。

于 2012-08-30T16:10:56.613 に答える