2006-05-25 優しいRailsの育て方 [長年日記]

[Rails] 簡単な認証機能が欲しい (#2)

http://wota.jp/ac/?date=20060521#c 神キターーー!!

                   /ヽ       /ヽ   
                  /  ヽ      /  ヽ  
                  /     ヽ__/     ヽ    
   ┏┓  ┏━━┓     /               \   .┏━┓ 
 ┏┛┗┓┃┏┓┃    /       \     /   |   .┃  ┃ 
 ┗┓┏┛┃┗┛┃┏━|      >      < |━┓┃  ┃ 
 ┏┛┗┓┃┏┓┃┃  |.         (__人__)   |  ┃┃  ┃ 
 ┗┓┏┛┗┛┃┃┗━ヽ         \/   / ━┛┗━┛ 
   ┃┃      ┃┃   /               \   ┏━┓ 
   ┗┛      ┗┛  /         ̄ ̄ヽ / ̄  ヽ .┗━┛ 
               .ヽ_______/ \__/  

ありがとう大地、ありがとう太陽、ありがとうぴーちっち、素晴らしいプラグインをどうもありがとう。そうか、Basic認証にしてしまえばいいのか!完璧です。望み通りです。あまりに出来がよく実用的なので、

  • inline 時に :crypted 指定を追加
  • テストを追加

しました。(あと後半ばっさり)。

Htpasswd Plugin

从*’w’)<ということで、舞波が作った Htpasswd Plugin だよ!

ruby script/plugin install http://wota.jp/svn/rails/plugins/branches/stable/htpasswd

Basic 認証が簡単にできます

class AdminController < ApplicationController
    htpasswd :user=>"maiha" , :pass=>"berryz"
    htpasswd :user=>"saki"  , :pass=>"7Et1Y7tCawx32", :type=>:crypted
    htpasswd :file=>"/usr/local/apache/passwd/.htpasswd"
end

Apache 運用時に public の .htaccess でやっちゃうと一部のコントローラだけ認証かけるのが出来なくて困ってたんですよ。うん、これは便利だ。あとは、

  • realm 指定して通常の Apache コンテンツと認証を共有したり
  • 認証時のユーザ情報を session に入れて権限管理までやったり
  • Digest認証に対応したり

夢は膨らみますなー!さすが舞波!!

              ∬
               ∫    ノハヽヽ <・・・誰が作ったって?  
                 ~━⊂(か わ) つ-、 
   ☆ノノハヽ        ///   /_/:::::/       
   从:;;;) w’)        |:::|/⊂ヽノ|:::| /」  
  (_U_U      / ̄ ̄旦 ̄ ̄ ̄/|      
            /______/ | |      
 ス、スミマセン    | |-----------|     

参考

本日のツッコミ(全8件) [ツッコミを入れる]
_ かわむら (2006-05-26 11:10)

コード添削とテスト追加乙です。お役に立てたようで何よりです。<br>とくにプラグインのテストの書き方がよくわからなかったので参考になりました〜(というかテストのほうが長いし)舞波乙!

_ shin (2008-05-15 16:11)

はじめまして。ヲタ界部外者、まじめ一本槍で生きてきた者です。<br>Rails 2.0.2(Windows)上で、Htpasswd Plugin を使わせて頂こうという安易な気持ちを抱いたの<br>ですが、<br> htdigest :file => ".htpasswd"<br>でIE7やFirefoxたちが認証を受け付けてくれないのは私の気のせいでしょうか?<br>付属のテストは成功しているようで、認証用ファイルも<br>Htpasswd::Auths::Digest.new(:user => user_name, :pass => password).entry<br>でエントリを生成し、テスト用ファイルと見比べてなんの落ち度もないように思うのですが。。<br><br>もし「同じ条件でもうまくやってますけど、なにか?」という方がいらっしゃれば自力本願で<br>頑張ってみます。

_ shin (2008-05-15 18:38)

分かりました。<br>htpasswd/lib/htpasswd/auths/digest.rb<br>def a2<br> ‥‥<br>end<br>の中で使われている「uri」の値がまずいようです。<br>私のような環境だと<br> http:// 〜 /app_name/controller/action?param=xxx<br>のようなURLなので、クライアントからは<br> uri="/app_name/controller/action?param=xxx"<br>でGETしてくるわけですが、上記uriは<br> uri="/controller/action"<br>となっていますね。。

_ shin (2008-05-15 19:06)

それはなぜなら、<br>Htpasswd::Auths::Digest.parse() で options[:uri] に正しい値が入っても、<br>Htpasswd::Auths::Digest.set_controller() で上書きされてしまうからに他ならないようです。

_ shin (2008-05-15 19:29)

PARAMETER_VALID_KEY_MAPPINGS = {<br> ‥‥<br> :uri => :req_uri,<br> ‥‥<br>}<br>にして<br>def req_uri<br> options[:req_uri] ||= '/'<br>end<br>を追加して<br>def a2<br> digest_algorithm.hexdigest([method, req_uri] * ":")<br>end<br>としたら上手く動いているようですが、こんなんでいいんでしょうか。。?<br><br>オープンソースのグループウェアThetisのRSSの認証にこれ、使わせて頂こうと思ってます。。<br>http://sysphonic.com/thetis/<br><br># これで「別途Apacheからhtpasswdをゲットしてください」なんていう<br># 意味不明なマニュアルともおさらばだっ!ありがとう、ぴーちっち!

_ 舞波 (2008-05-16 07:29)

>>IE7やFirefoxたちが認証を受け付けてくれないのは私の気のせいでしょうか?<br><br>IEのDigest認証には有名なバグ(URIのクエリ文字列の部分を無視する)があり、さらにMSもずっと放置したままだったので長年みんなが困っていたのですが、例に漏れずhtpasswdでもIEを取るかその他の正しい挙動のブラウザを取るかという二択を迫られることとなり、シェアを重視というか、その時の自分の顧客がたまたまIEが必須だったという恥ずかしい理由でhtpasswdではIE用のDigest認証の挙動になりました。<br><br>htpasswdの対応はそんな感じで大丈夫だと思います。そして、その場合、IE6では動かなくなるはずです。で、今回逆に、IE7で動かなくなったということは、いよいよMSが対応してくれたっぽいですね。よくやったMS!これで万々歳!と思ったら、結局IE6がいきなり駆逐される事はないので、事態は変わらず。みたいなねぇ。困ったものです。やっぱり両タイプのアルゴリズムを実装してブラウザで判別するのがいいかな?ぴーちっち

_ pie (2008-05-16 12:07)

Rails 2.0.2には標準でBasic認証機能があるけど、それだとダメですか?<br>3の倍数とRailsの話題のときにアホになるので外してたらごめん。

_ shin (2008-05-16 16:22)

げげっっ、マジですかっ?本当だ。。<br>Digest認証はまだだけど、ってことですね。(ていうか我ながらなんたる不勉強。。)<br>まあRails仕様に振り回されるのも癪だったりするし、選択肢があるのはどっちにしても良いこと<br>ですけどね。<br># Thetisのようなアプリだとセキュリティ強化のためにはどっちみちSSLかまさないといけないから<br># Basicでも可なのか、う〜ん‥‥<br><br> それとは別に一つ問題が。ファイル指定だと現状コントローラのロード時にエントリを読み込む<br>だけなので、ユーザ情報変更ありのアプリだとファイル更新しても認証に反映されないんですよね。。<br>(自分で修正したのですがたぶんあまり良いやり方じゃないと思いますので一応ご報告まで)<br><br>P.S. あと、IE6でもだいじょうVみたいです。


サイト内検索 (by Google)

| JRuby | Rails | Berryz | ℃-ute | エッグ | jQuery |

過去

2006年
5月
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31

未来

コンタクト