レールと自動ログイン?
-
20-09-2019 - |
質問
私はRailsのRESTfulな認証プラグインで簡単な認証システムを取得しようとしていて、ちょうどB / C私は要件がクッキーのためのものであるかを把握するように見えることはできませんが、それがどのように動作するか疑問に思って、そしてどのようにブラウザは常に(6+ヶ月間)あなたを覚えているので、それを作るています。
いくつかの質問:
1)あなたはルビーのrestful_authenticationためremember_meさんはどのように行うのですか?私はこの問題を解決するための良好なワンライナーを見つけるように見えることはできません...
ユーザーがサインアップし、チェックしている場合は、どのようにRailsアプリケーションは、ページには、ページに行く次の時間を行くが、何もユーザーせずにセッション/クッキーを取得しない、「私を忘れないでください」、3ヶ月後に言うの?
2)私は自分のIPアドレスか何かのように、サーバーへの情報のいくつかの並べ替えを送信する必要がありますか?定義されていることをcookies[:auth_token]
は、何ですか?
目標は次のとおりです。私は彼らがStackOverflowのがどのように動作するかのように、再び自分の電子メール/パスワードを入力する必要がありますする必要はありません。)
解決
ここ
...これは私たちが実行しているログインを処理するコントローラのメソッドです...(主に認証されたシステムから取られた)私たちがやっていることですdef login
if logged_in?
flash[:notice] = "You are already logged in."
redirect_to "/" and return
end
unless request.post?
render :layout => 'task' and return
end
self.current_user = User.authenticate(params[:login], params[:password])
if logged_in?
if params[:remember_me].to_i == 1
self.current_user.remember_me
cookies[:auth_token] = {:domain => "#{DOMAIN}", :value => self.current_user.remember_token , :expires => self.current_user.remember_token_expires_at }
else
self.current_user.forget_me
cookies.delete(:auth_token, :domain => "#{DOMAIN}")
cookies[:auth_token] = nil
end
current_user.last_seen_at = Time.now
current_user.save
session[:notice] = "You logged in successfully"
flash[:notice] = "You logged in successfully"
redirect_back_or_default(:controller => 'dashboard') and return
#redirect_back_or_default(:controller => 'index', :action => 'index') and return
else
if $failed_login_counter.add_attempt(params[:login]) > MAXIMUM_LOGIN_ATTEMPTS
logger.info("login rate limiter kicking in, #{MAXIMUM_LOGIN_ATTEMPTS} login attempts failed")
redirect_to "/denied.html" and return
end
flash[:error] = "Unable to authenticate username and password"
render(:layout => 'task') and return
end
end
とログアウトのためにこれを使用する
def logout
current_user.last_seen_at = Time.now
current_user.save
self.current_user.forget_me if logged_in?
cookies.delete(:auth_token, :domain => "#{DOMAIN}")
reset_session
flash[:notice] = "You have been logged out."
#redirect_to :back
redirect_back_or_default(:controller => 'index', :action => 'index') and return
end
: - 次に、あなたのapplication.rbであなたのような何かをする必要があります
before_filter :login_from_cookie
def login_from_cookie
return unless cookies[:auth_token] && !logged_in?
user = User.find_by_remember_token(cookies[:auth_token])
if user && user.remember_token?
user.remember_me
self.current_user = user
cookies[:auth_token] = { :domain => "#{DOMAIN}", :value => self.current_user.remember_token , :expires => self.current_user.remember_token_expires_at }
flash[:notice] = "#{self.current_user.login}, you have logged in successfully"
end
end
そして - あなたのUserモデルでは、このようないくつかの方法があります:
# Encrypts some data with the salt.
def self.encrypt(password, salt)
Digest::SHA1.hexdigest("--#{salt}--#{password}--")
end
# Encrypts the password with the user salt
def encrypt(password)
self.class.encrypt(password, salt)
end
def remember_token?
remember_token_expires_at && Time.now.utc < remember_token_expires_at
end
# These create and unset the fields required for remembering users between browser closes
def remember_me
self.remember_token_expires_at = 2.weeks.from_now.utc
self.remember_token = encrypt("#{email}--#{remember_token_expires_at}")
save(false)
end
def forget_me
self.remember_token_expires_at = nil
self.remember_token = nil
save(false)
end
他のヒント
私は正直にその特定の実装abooutわかりません。しかし、認証の共通のRESTfulな方法は、ヘッダとして各要求と共にユーザ/パスワードのハッシュ化されたバージョンを渡すことです。別の方法としては、ヘッダーとしてハッシュ化されたクッキーの値を使用することができます。
私はまた、両方が関与するハイブリッドシステムを見てきました。あなたはそれを知っている場合は、ユーザ/パスに加えて、セッションを渡します。セッションが有効であれば、サーバ側では、それはそれを使用して、セッションキャッシュすることができます - パフォーマンスのために>ユーザ関係を。セッションが無効である場合、それは、ユーザ/パスを使用して認証しようとします。
このタイプのシステムでは、バックヘッダとして応答のセッションを渡すと思います。
システムが動作するかもしれない方法のちょうど簡単に説明だ。もちろん、ないルビーのライブラリはありませんか。
あなたはここに安らかな認証に関する全体のチュートリアルを見つけることができます。 http://railsforum.com/viewtopic.php?id=14216&p=13