20463


Railsで`Devise`を使ったユーザー認証を実装しています。

特定のユーザーが他のテスト用のユーザーでは再現しないエラーを抱えているという報告があったのですが、この場合そのユーザーでログインした場合の画面情報を確認するにはどのような方法ありますか？

自分のやり方ですとローカルにDBをコピーして、パスワードがわかってるユーザーの`encrypted_password`を該当ユーザーの`encrypted_password`に入れる、というものですがもうちょっとスマートな方法はないでしょうか？


CC BY-SA 3.0
2015-12-30T02:19:07.273
20462
2015-12-30T07:43:18.900
3271
question
ruby-on-rails devise
特定のユーザーのログインを再現する方法


## Adminのbecome機能

管理画面に`become機能`を実装するのはどうでしょうか。

`Devise`のWikiのHow Toを集めたページ  
[How Tos · plataformatec/devise
Wiki](https://github.com/plataformatec/devise/wiki/How-Tos)  
の中に

「もしアドミンユーザなら他のユーザになる方法」  
[How To: Sign in as another user if you are an admin · plataformatec/devise
Wiki](https://github.com/plataformatec/devise/wiki/How-To:-Sign-in-as-another-
user-if-you-are-an-admin)  
が記載されています。

一度実装してしまえば、該当ユーザの（成り代わったユーザの）画面情報にとどまらず画面からの操作が可能です。

実装完了してしまえば、直接DB操作することなく全てWebブラウザの画面で完結することができます。

もし本番で不用意に他のユーザに変わりたくないというのであれば、ローカルだけ(development環境だけ）この機能が使えるようにしておくなど方法があると思います。

## 一部引用かつ翻訳

「もしアドミンユーザなら他のユーザになる方法」  
[How To: Sign in as another user if you are an admin · plataformatec/devise
Wiki](https://github.com/plataformatec/devise/wiki/How-To:-Sign-in-as-another-
user-if-you-are-an-admin)

[code]

    class AdminController < ApplicationController
      before_filter :authenticate_user!
    
      def become
        return unless current_user.is_an_admin?
        sign_in(:user, User.find(params[:id]))
        redirect_to root_url # or user_root_url
      end
    end
    
[/code]

もし、`last_sign_in_at`と`current_sign_in`を該当ユーザに成り代わったときに更新したくなければ、`sign_in(:user,
User.find(params[:id]))`の部分を`sign_in(:user, User.find(params[:id]), { :bypass
=> true })`に変更できる。

この後 `:bypass`オプションの詳しい説明が、

> The :bypass option bypasses warden callbacks and stores the user straight in
> the session.

と続きますが、いまいち意味がわからず.....

また、[flyerhzm/switch_user](https://github.com/flyerhzm/switch_user)というのもあると参考までに紹介されています。


CC BY-SA 3.0
2015-12-30T03:17:01.043
20463
2015-12-30T07:43:18.900
2015-12-30T07:43:18.900
9008
9008
20462
answer