• 締切済み

devise認証方法について

Restful_authenticationをdeviseへ移行しようとしています。 既存のテーブルusersの2つのカラム(CRYPTED_PASSWORD、SALT)を使用して これまでと同様にSALTを使用してパスワードの暗号化を行いたいです。 具体的に、どのような対応をしてよいものか調査中です。 どなたか、詳しい方がいらっしゃいましたら、ご教授をお願いします。 【環境】 Ruby 2.2.2 Rails 4.0.13 CentOS6 devise 3.5.1 以上、宜しくお願いします。

  • Ruby
  • 回答数2
  • ありがとう数2

みんなの回答

  • hattorix
  • ベストアンサー率80% (4/5)
回答No.2

まず前提として、devise はフルスタックなフレームワークなので、少しでも rail から外れたことをしようとすると、かなり面倒なことになります。 http://www.hsbt.org/diary/20150120.html で言われているような気概がない限り、私個人としてはオススメしません。 その上で、解決方法のみ書きます。 ログイン時にパスワードと一緒に入力するもの (ユーザー名とかメールアドレス等) がなにか分かりませんが、それはこちら (*1) を参考にして設定して下さい。それができていれば、user.valid_password? (*2) をオーバーライドして restful-authentication と同等の SHA1 ハッシュの比較処理を行うようにし、user.authenticatable_salt (*3) もオーバーライドし password_salt の値を返すようにすればできると思います。 その他気をつけないこととして、パスワードの更新処理が標準では bcrypt で行われるようになっているのをカスタマイズする必要があります。user.password= (*4) もオーバーライドして、encripted_password に SHA1 でハッシュした値を、salt は password_salt に設定するようにしてください。 > まずは、カラム名を変更しました(encripted_password、password_salt) これは良い対応だと思います! (参考) *1: https://github.com/plataformatec/devise/wiki/How-To:-Allow-users-to-sign-in-using-their-username-or-email-address *2: https://github.com/plataformatec/devise/blob/master/lib/devise/models/database_authenticatable.rb#L45 *3: https://github.com/plataformatec/devise/blob/master/lib/devise/models/database_authenticatable.rb#L132 *4: https://github.com/plataformatec/devise/blob/master/lib/devise/models/database_authenticatable.rb#L39

回答No.1

先日までの質問からいきなり難易度が変わりましたね。 deviseの裏側は色んなgemの機能が入り混じった闇なので正直かなり辛いです。 一応、wardenというgemが裏側で認証処理を代行しているのでそのあたりの認証処理をモンキーパッチングで上書きすれば直せると思います。 個人的には既にrestful authenticationが動いているのでしたら、大分古くなったgemとはいえ一斉を風靡した名のあるgemなのでこれをrails4へ適応してしまう方が近道だと思いますよ。 調べるのが、かなり大変なので もし時間があればやってみますが、ちゃんとした回答をお返しできるかは あまり期待し無いでください。

rapport5683
質問者

お礼

お忙しい中、ご回答ありがとうございます。 まずは、カラム名を変更しました(encripted_password、password_salt) gem "devise-encryptable"をインストールしてみたりと、試行錯誤中です。 既存のログイン画面を使用して、パスワードをSHA1形式で暗号、復号さえできれば 良いのですが。。。頑張ってみます。ありがとうございます。

関連するQ&A

  • Ruby on Rails でのログイン機能について

    Ruby on Rails でのログイン機能について あるPCアプリにログイン・ログアウトの機能をつけたいのですが、良い方法がなくて困っています。 現状は、プラグインのrestful_authenticationを使用しています。 しかし、ログアウトをせずにブラウザを閉じたあにページにアクセスすると自動でログインしていまいます。 何か良い方法はないでしょうか? 

  • Railsログイン認証について

    イントラネット上で使用する業務システムのログイン画面を作成しています。 調べてみると、device、sorcery等の認証プラグインが存在するようですが、 どれを使おうか思案中です。 Railsのログイン認証について、詳しい方がいらっしゃいましたら、 お勧めの認証プラグイン等がありましたら、ご教授ねがいます。 【開発環境】 Ruby 2.2.2 Rails 4.0.13 CentOS 6.6 Oracle 以上、宜しくお願いします。

    • ベストアンサー
    • Ruby
  • PerlでLinuxのユーザー認証・管理プログラム

    ブラウザでLinuxのユーザー名とパスワードと入力して、 ユーザー認証してログイン後、Linuxユーザーの パスワードを自分で変更できるプログラムが作りたいのです。 /etc/passwdにパスワードが直接記録されていれば簡単なのでしょうが、 シャドウパスワードなので苦労しています。LinuxはFedora Core3です。 まず、/etc/shadowに記録されているような、 $1$ではじまる暗号化されたシャドウパスワードをPerlで作るには どのようにしたらいいのでしょうか。 pwconvのソースをみたらどんなアルゴリズムかわかると思い、 shadow-utilのSRPMをインストールしてみたりしましたがわかりませんでした。PHPのメーリングリストに $salt = substr(md5(microtime()), 0, 9); return crypt($password, "$1$" . $salt); このようなコードがあったのですが、これでは$saltが毎回 代わってしまい、よくある $salt=substr(暗号化されたパスワード,0,2); if(crypt($pass,$salt) ne 暗号化されたパスワード){ &err("パスワードが違います"); } のような認証ができないのではないかと思いました。 Linuxではどのようなアルゴリズムでシャドウバスワード を作り、パスワードの認証をしているのでしょうか。 つまり、簡単にいうとPerlでシャドウパスワードを使った Linuxユーザーのパスワード認証と パスワード変更ができないか、ということなのです。 また、Perlでシャドウパスワードなど作らなくても system()などを使ってLinuxのコマンドを使えば 各ユーザーの認証やパスワードの変更がブラウザでできるという場合は、 教えていただけないでしょうか。 どうかご教示ください。よろしくお願いします。

  • Rails deviseログイン画面について

    deviseをインストールしました。 全ページに認証がかかるように、application_controller.rbの最後に以下を追記しました。 before_action :authenticate_user! すると、表示させたいログイン画面とは別のログイン画面があらわれたのですが、 なぜでしょうか? URLを見ると「http://localhost:3000/users/sign_in」になっています。 どなたか、詳しい方がいらっしゃいましたら、ご教授をお願いします。 【環境】 Ruby 2.2.2 Rails 4.0.13 CentOS6 devise 3.5.1 以上、宜しくお願いします。

  • Ruby on Railsで入力フォームを作成しています。

    Ruby on Railsで入力フォームを作成しています。 そこで、入力されたid(table.id)と商品名カラム(table.product_id) を結合して商品ID(table.product_number)を 登録時に商品IDカラムに登録できないかと思っています。 商品名カラムは商品テーブルから読み込んでいます。 恐らく、callbackのしくみを利用すればできるのではないかと 思っているのですが、やり方がわかりません。 以上、よろしくお願いします。 環境は以下のとおりです。 ruby1.8.6 rails 2.3.5 db:mysql gems:1.3.5

  • パスワードのsaltの構築方法

    PHPでパスワードの登録でsaltを使用しようと考えているのですが、ネットで調べても自分の疑問に思っている事が出てきません。 パスワードにsaltという十分な長さ(40文字とか)の文字列を加え、それをmd5などでハッシュ化する・・・と言うことは分かりました。 しかしその実装方法が分かりません。 A.saltはランダム乱数でもいいし、セキュリティは低くなるが固定文字列でもいい。 B.saltは別ファイルに保管(一緒に保管と書いてあるのもありましたが)する。 、というような記事を見かけました。 で、自分はZendFrameworkのマニュアルに沿って考えたのですが、 データベーステーブルにpassword、saltカラムを作成する。 登録時、$_POST['ユーザの入力値']を(ハッシュ化する)passwordカラムに、saltはここでは単純にmt_rand(0,99)としてsaltカラムに登録、とした場合に認証時にはどのようにすればいいのでしょうか? 認証時にユーザの入力したパスワードとデータベースに格納したsaltを結合し、それをmd5()したものと、データベースに格納されているパスワードと同じく格納されたsaltを結合しそれをmd5()したものを比べる ・・・となるとパスワードさえ合って入ればいいので別にsaltは不要なような気がするのでこの実装法は間違っているのかなと思います。 そうではなく、登録時にユーザの入力したパスワードとデータベースに格納したsaltを結合し、それをmd5()したものをpasswordカラム又はsaltカラムに格納する・・・というのも正しいのかな?と思います。 データベースに侵入されればどちらもダメなので、何か別ファイルに保管するのかなとも思いましたが良く分かりません。 登録フォーム => ログインフォームにおいてのsaltの実装法を教えていただけないでしょうか?少し頭がぐちゃぐちゃになり、ちょっと文章がおかしい気もしますがすみません。

    • ベストアンサー
    • PHP
  • Ruby on Rails によるデータベース作成

    Rubyもよくわからない初心者ですが、「かんたんRuby on RailsでWebアプリケーション開発」という本を見ながらデータベースを作成しています。Railsのバージョンは1.1.2、データベース管理はMySQLを使っています。 マイグレーションの作成まではうまく行っていると思うのですが、001_create_table.rbの修正、database.ymlの設定を行い、マイグレーション、scaffoldを実行してブラウザで表示すると、表示されないフィールドがあります。 001_create_table.rbでは次の部分を追加しています。 create_table(:items) do |table| table.column :index, :string, :limit => 32 table.column :pos, :string, :limit => 8 table.column :cid, :string, :limit => 32 table.column :type, :string, :limit => 5 table.column :flq, :integer table.column :ns, :string, :limit => 6 table.column :cflg, :integer table.column :wflg, :integer end 何回かやり直してみましたが、↑この中のtypeというフィールドがどうしても表示されません。 どこを直したらいいのか教えてください。 よろしくお願いします。

  • ruby on railsについてなのですが、scaffoldで入力フ

    ruby on railsについてなのですが、scaffoldで入力フォーム、一覧表示、詳細表示を作成しました。 そこで、一覧表示の際、テーブルのカラムに存在しない番号を一番左に表示させたいと考えています。3件存在すれば、上から1,2,3とういようにです。テーブルのIDを表示するとIDの1を削除した場合、2,3,4となってしまうので、3件あれば、必ず、1,2,3としたいのです。 環境は以下のとおりです。 ruby1.8.6 rails 2.3.5 db:mysql gems:1.3.5 よろしくお願いします。

  • パスワード暗号化について(CGIスクリプト)

     現在記事削除処理の、キー暗号化と解読について勉強しているんですが、他の方が書いたソースを読んでもさっぱり意味不明です。技術評論社さんのリファレンスを参考にしてるんですが、どうも載っていないワザが使われているらしく・・・。  まずは暗号化処理です(とある有名ソースから抜粋)。 @SALT = ('a'..'z', 'A'..'Z', '0'..'9', '.', '/'); srand; $salt = $SALT[int(rand(@SALT))] . $SALT[int(rand(@SALT))]; $encrypt = crypt($password, $salt) || crypt ($password, '$1$' . $salt); 問題は$encryptなんですが、||演算子は、要するに左オペランドの保険みたいなものなんでしょうか?まず、左オペランドが偽になる、ということ自体が分かりません。結果が偽になる、というのは0を返すということでしょうか?  crypt関数が処理を失敗する(?)、ということでも偽になるかもしれないんですが、暗号化処理を失敗などということがあるのでしょうか?  次に、ひとまず左オペランドが偽だった場合ですが、右オペランドに関して、暗号化キーが「$1$xx」の5文字ですよね。暗号化キーは2文字までしか評価されないから、結局これは「$1」と変わらない気がします。というより、まずなぜ「$1$」なんでしょうか?そして、合計5文字の意味は・・・?謎は深まるばかりです。  質問の長さが800文字を超えてしまうので、前半はここで切らせていただきます。  後半は「パスワード解読について(CGIスクリプト)」にて質問させていただいています。  どうかよろしくお願いします。

    • ベストアンサー
    • Perl
  • Ruby on Railsインストール(アップデート)

    Ruby on Railsインストール(アップデート) RailsをCentOS4.4?にインターネット経由以外でのインストールする方法を知りたいです。 下記に条件を記載させて頂きますので、本当に申し訳ありませんが、 ご教授していただけますでしょうか? 無知で申し訳ありませんがよろしくお願いします。 ■現状  サーバOS CentOS4.4  Ruby 1.6.x  gem 0.9x??  rails 1.x  mysql4.1  sqlite3 ■条件  ・会社のサーバなので、インターネットが使用できない。  ※CDやUSBも無理です。   やり方としては、ソースを会社のメールアドレスに送り   自分の端末からFTPでサーバにアップロードします。   また、上長には許可は頂いています。  ・現状古いバージョンのRuby・RubyGems・Ruby on Railsは   インストールされていますが、アップデートよりは、   上書きインストールの方が望ましい。   ※理解し易いため。    初心者のためアップデートは難関かとm(--)m ■今回インストール(アップデート)したい物  Ruby on Rails 2.x ----以下は、ダウンロード済み----  Ruby 1.8.7  ※こちらは、色々なサイトに記載されています参考にしています。  RubyGems  ※これは、RubyForgeからダウンロード済み ■気になる点  ほかにインストールしなければならないものってありますでしょうか? 教えて君で申し訳ありませんが、よろしくお願いします。

    • ベストアンサー
    • Ruby

専門家に質問してみよう