Restful Authenticationプラグイン7 - AASM [プログラミング]
今回はAASMを絡めて動かす。最初からそれをやれば良かったんだけど、物事を単純にしてテストしてから、全体を動かすのがポリシーなので、まわりくどいけどやる。いちから作るったって、Railsなら仮に作ったテストコードをすぐ捨てても、作り直すのは比較的楽だしね。
今回はAASMを使わずに出ていたバグ(ログインでメール発行しちゃうとか)が出なくなったので、これまでのようにそのまま使っても動かねぇよという事にはならないと思います。
すげー。プロ並みの嫁。
http://www.func09.com/wordpress/archives/596
サンプルもあるけど、これ普通に広告に使えちゃうな。普通にその業界に入ってたらどうなっていた事でしょう。アマチュアだから出来る事ってあるよね。
同じサイトのネタで、泉こなたもRuby on Railsに参戦していたらしい。
http://www.func09.com/wordpress/archives/716
って、本当に脱線しまくるな、ググってると。
今回もここを参照してやってみる。
http://www.func09.com/wordpress/archives/280
http://terrazilog.quipu.jp/?eid=591548
http://blog.imishin.com/2008/09/14/rails-with-restful-authentication-on/
http://gendosu.ddo.jp/redmine/wiki/1/Restful_authentication
ただ自分のやった事を記録してるだけだから、本気でやりたい人は上のリンクを見てやった方がいい。枝葉末節が多いだろうから。
せっかくなので、AASMだけじゃなくて、メールアクティベーションのログイン時にいらないメールを発行してしまう問題の検証も一緒にやる。でも、途中で完動しないforgot_passwordは後回し。
railsで新規にプロジェクト(?)作成して、そのディレクトリで以下のコマンドを打つ。
前は、generateコマンドの--aasm の部分を省いてました。上書きするようなことをしても面倒そうなので、今回も重複した作業になるけど、同じ事をやる事にします。Railsは楽だけど、インストールを楽にできている分、後で同じものを修正して入れようとすると、ソースの中身の精査をしなくちゃいけないと思うので、まっさらな状態から作っていった方がいい気がします。手間もかからないし、コマンドもソースもコピペで済ませた方が精神衛生上いい。プラグインの細かいところ知ったところで、面倒が増えるだけだろうし。OSSプログラマとしては日和った考えだが、他のところに労力を割いた方がいい。
scaffoldで一つ作っておいて、そこをログインの対象にしてみる。
config/environment.rbに追加。
config.active_record.observers = :user_observer
config/environment.rbに、ActionMailerの設定。
config/routes.rbに追加。
map.activate '/activate/:activation_code', :controller => 'users', :action => 'activate', :activation_code => nil
config/environments/development.rbに追加。
config.action_mailer.raise_delivery_errors = true
app/models/user_mailer.rbの、@fromの部分を、<メールアドレス>にする。たぶん他の文字列を加えても大丈夫。普通のメールのヘッダで許される書き方をしてればOK。
@from = "<hogehoge@yahoo.co.jp>"
app/models/user_mailer.rbのYOURSITEの部分を'localhost:3000'に変更。
ここまでが今までやってきたところ。で、以降は差分。
config/routes.rbに追加
map.resources :users, :member => { :suspend => :put, :unsuspend => :put, :purge => :delete }
app/controllers/application_controller.rbに追加
include AuthenticatedSystem
before_filter :login_required
これをすると、全部のコントローラにログイン状態を要求することになるらしいので、指定漏れを防ぐ意味では有用なのだろう。というか、自分が使うコントローラは、気にしないでガンガン開発したいし、いちいち気にしてたんじゃ絶対穴があく。うっかりミスはプログラミングに関わらずあるし、どの分野にも安全装置は必要だってことで。動かないよりか、動いて欠陥が出る方が問題な時もある。
使わない場合は、before_filterの:exceptに例外として、メソッドというか、アクションを指定してあげないといけないみたい。それかskip_before_filterでコントローラ全体をクラスの中の一番始めに書いて無効にする。
app/controllers/users_controller.rbは部分的に普通に晒す。
SessionsControllerクラスは、認証が必要ないため、app/controllers/sessions_controller.rbに、skip_before_filterを設定。
skip_before_filter :login_required
セッションを作るためにログインさせようとするが、ログインするためにも事前にセッションが必要で、またログイン…と果てしなく続きそうだけど、実際にやるとどうなんだろ。後で実験するか。
最後にサーバを再立ち上げします。
ruby script/server
なんだか、
NoMethodError in UsersController#create
undefined method `recently_activated'
ってエラーが出てきた。
http://d.hatena.ne.jp/seipontan/20101004/1286156096
で解決。というか、あり得ないでしょ、メソッドに?付けてないって。開発者はしっかりテストしてから、gitにアプライしてないんだろうね。ふぅ世の中にGoogleがあって良かったよ。自分で調べるのって勉強になるけど時間がかかって仕方ないし、そういうスキルって足りてないんだよねぇ。そもそも曲がりなりにも動くものを改造って仕事が多かったから、ソース追ってくのしんどい。秀丸かサクラエディタだったらいいんだけど、いまいちMacのmiの使い心地が良くないので、なかなか上手く使えてない。UNIXなんだからgrep使えって言われたら返す言葉もないけどね。
その後は、一通り動作確認できてほっと一息。ちょっとメールが上手くないところもあったものの、基本的に問題なく出来ました。コントローラ全部に認証するように設定をしたけれど、影響する他のすべてのコントローラで、include AuthenticatedSystemを書いてあっても、重複して問題になる事はなかったみたい。
それと前回問題になっていた、ログインするとガンガンに「Your account has been activated!」なメールが発行されてしまう状態は直っていた。AASMなしでのメールアクティベーションは問題があると考えた方がいいでしょう。そもそもAASMがないと折角のログインの仕組みが十分発揮されないし、セキュリティ上問題もあるかもしれない。クロスサイトうんちゃらとか、攻撃者の事は考えたくない感じ。とりあえずRailsでサポートしているような機能は、コーディングで潰さないようにしましょう(と自分に言い聞かせる)。
http://ja.wikipedia.org/wiki/Category:%E3%82%A6%E3%82%A7%E3%83%96%E3%83%BB%E3%82%BB%E3%82%AD%E3%83%A5%E3%83%AA%E3%83%86%E3%82%A3%E3%81%AE%E5%BC%B1%E7%82%B9%E3%81%B8%E3%81%AE%E6%94%BB%E6%92%83
Webは悪い人ばかりじゃないけど、いい人ばかりでもない。まぁそこは普通の現世界でも同じだけど。
前に気付いたんだけど、Railsの使われている時間が世界標準時間ぽい。ここいらを日本のに設定しないとちょっと気持ち悪いな。DBのデータを直で見ると、直感的に分かりづらい。9時間進めたUTC+9とか考えてもいいけど、直せるんだったら直したい。UTCは何か嫌い。どうせ日本人向けのサービスだし。environment.rbのある行を、UTCをJSTに変えればいいのかな。
config.time_zone = 'UTC'
時間を取得するにしても、日本の時間の方がいちいちコンバートをかけなくてもいいかもしれない。全世界を相手にするなんておこがましい気がするし、基本的に日本語じゃないとしっくりこない人間だしね。とはいえ、必要があったら英語読むくらいの事は、技術者としてしなくちゃなんないのは残念だけど。
UTCをJSTにしたら起動時にエラー出まくり。rake time:zones:allをすると、地名とかで指定するみたい。バリバリ関東の人間なのだが、東京ってあんまり好きじゃなくて、ちょっと不本意だけど、下記のように設定。
config.time_zone = 'Tokyo'
とすると、エラーが出なくなった。OsakaでもYakutsk(ってどこ?ロシア?)でも大丈夫らしい。DBの中身の方は今までと変わらずUTC表示っぽいが、Ruby on Rails的にはコメントに書いてあるように、自動的にコンバートをかけてくれるみたい。作りたいのはガッツリ日本時間を取れないと大問題ですが、とりあえずこのままでいいや。
今回はAASMを使わずに出ていたバグ(ログインでメール発行しちゃうとか)が出なくなったので、これまでのようにそのまま使っても動かねぇよという事にはならないと思います。
すげー。プロ並みの嫁。
http://www.func09.com/wordpress/archives/596
サンプルもあるけど、これ普通に広告に使えちゃうな。普通にその業界に入ってたらどうなっていた事でしょう。アマチュアだから出来る事ってあるよね。
同じサイトのネタで、泉こなたもRuby on Railsに参戦していたらしい。
http://www.func09.com/wordpress/archives/716
って、本当に脱線しまくるな、ググってると。
今回もここを参照してやってみる。
http://www.func09.com/wordpress/archives/280
http://terrazilog.quipu.jp/?eid=591548
http://blog.imishin.com/2008/09/14/rails-with-restful-authentication-on/
http://gendosu.ddo.jp/redmine/wiki/1/Restful_authentication
ただ自分のやった事を記録してるだけだから、本気でやりたい人は上のリンクを見てやった方がいい。枝葉末節が多いだろうから。
せっかくなので、AASMだけじゃなくて、メールアクティベーションのログイン時にいらないメールを発行してしまう問題の検証も一緒にやる。でも、途中で完動しないforgot_passwordは後回し。
railsで新規にプロジェクト(?)作成して、そのディレクトリで以下のコマンドを打つ。
rails -d mysql aasm-test cd aasm-test ruby script/plugin install git://github.com/technoweenie/restful-authentication.git ruby script/plugin install git://github.com/rubyist/aasm.git ruby script/generate authenticated --include-activation --aasm user sessions
前は、generateコマンドの--aasm の部分を省いてました。上書きするようなことをしても面倒そうなので、今回も重複した作業になるけど、同じ事をやる事にします。Railsは楽だけど、インストールを楽にできている分、後で同じものを修正して入れようとすると、ソースの中身の精査をしなくちゃいけないと思うので、まっさらな状態から作っていった方がいい気がします。手間もかからないし、コマンドもソースもコピペで済ませた方が精神衛生上いい。プラグインの細かいところ知ったところで、面倒が増えるだけだろうし。OSSプログラマとしては日和った考えだが、他のところに労力を割いた方がいい。
scaffoldで一つ作っておいて、そこをログインの対象にしてみる。
ruby script/generate scaffold hoge title:string text:text rake db:create:all rake db:migrate
config/environment.rbに追加。
config.active_record.observers = :user_observer
config/environment.rbに、ActionMailerの設定。
config.action_mailer.delivery_method = :smtp config.action_mailer.smtp_settings = { :address => 'smtp.mail.yahoo.co.jp', :port => 587, :authentication => :login, :user_name => 'username', :password => 'password' }
config/routes.rbに追加。
map.activate '/activate/:activation_code', :controller => 'users', :action => 'activate', :activation_code => nil
config/environments/development.rbに追加。
config.action_mailer.raise_delivery_errors = true
app/models/user_mailer.rbの、@fromの部分を、<メールアドレス>にする。たぶん他の文字列を加えても大丈夫。普通のメールのヘッダで許される書き方をしてればOK。
@from = "<hogehoge@yahoo.co.jp>"
app/models/user_mailer.rbのYOURSITEの部分を'localhost:3000'に変更。
ここまでが今までやってきたところ。で、以降は差分。
config/routes.rbに追加
map.resources :users, :member => { :suspend => :put, :unsuspend => :put, :purge => :delete }
app/controllers/application_controller.rbに追加
include AuthenticatedSystem
before_filter :login_required
これをすると、全部のコントローラにログイン状態を要求することになるらしいので、指定漏れを防ぐ意味では有用なのだろう。というか、自分が使うコントローラは、気にしないでガンガン開発したいし、いちいち気にしてたんじゃ絶対穴があく。うっかりミスはプログラミングに関わらずあるし、どの分野にも安全装置は必要だってことで。動かないよりか、動いて欠陥が出る方が問題な時もある。
使わない場合は、before_filterの:exceptに例外として、メソッドというか、アクションを指定してあげないといけないみたい。それかskip_before_filterでコントローラ全体をクラスの中の一番始めに書いて無効にする。
app/controllers/users_controller.rbは部分的に普通に晒す。
before_filter :login_required, :except => [:new,:create,:activate,:suspend,:unsuspend,:destroy,:purge]
SessionsControllerクラスは、認証が必要ないため、app/controllers/sessions_controller.rbに、skip_before_filterを設定。
skip_before_filter :login_required
セッションを作るためにログインさせようとするが、ログインするためにも事前にセッションが必要で、またログイン…と果てしなく続きそうだけど、実際にやるとどうなんだろ。後で実験するか。
最後にサーバを再立ち上げします。
ruby script/server
なんだか、
NoMethodError in UsersController#create
undefined method `recently_activated'
ってエラーが出てきた。
http://d.hatena.ne.jp/seipontan/20101004/1286156096
で解決。というか、あり得ないでしょ、メソッドに?付けてないって。開発者はしっかりテストしてから、gitにアプライしてないんだろうね。ふぅ世の中にGoogleがあって良かったよ。自分で調べるのって勉強になるけど時間がかかって仕方ないし、そういうスキルって足りてないんだよねぇ。そもそも曲がりなりにも動くものを改造って仕事が多かったから、ソース追ってくのしんどい。秀丸かサクラエディタだったらいいんだけど、いまいちMacのmiの使い心地が良くないので、なかなか上手く使えてない。UNIXなんだからgrep使えって言われたら返す言葉もないけどね。
その後は、一通り動作確認できてほっと一息。ちょっとメールが上手くないところもあったものの、基本的に問題なく出来ました。コントローラ全部に認証するように設定をしたけれど、影響する他のすべてのコントローラで、include AuthenticatedSystemを書いてあっても、重複して問題になる事はなかったみたい。
それと前回問題になっていた、ログインするとガンガンに「Your account has been activated!」なメールが発行されてしまう状態は直っていた。AASMなしでのメールアクティベーションは問題があると考えた方がいいでしょう。そもそもAASMがないと折角のログインの仕組みが十分発揮されないし、セキュリティ上問題もあるかもしれない。クロスサイトうんちゃらとか、攻撃者の事は考えたくない感じ。とりあえずRailsでサポートしているような機能は、コーディングで潰さないようにしましょう(と自分に言い聞かせる)。
http://ja.wikipedia.org/wiki/Category:%E3%82%A6%E3%82%A7%E3%83%96%E3%83%BB%E3%82%BB%E3%82%AD%E3%83%A5%E3%83%AA%E3%83%86%E3%82%A3%E3%81%AE%E5%BC%B1%E7%82%B9%E3%81%B8%E3%81%AE%E6%94%BB%E6%92%83
Webは悪い人ばかりじゃないけど、いい人ばかりでもない。まぁそこは普通の現世界でも同じだけど。
前に気付いたんだけど、Railsの使われている時間が世界標準時間ぽい。ここいらを日本のに設定しないとちょっと気持ち悪いな。DBのデータを直で見ると、直感的に分かりづらい。9時間進めたUTC+9とか考えてもいいけど、直せるんだったら直したい。UTCは何か嫌い。どうせ日本人向けのサービスだし。environment.rbのある行を、UTCをJSTに変えればいいのかな。
config.time_zone = 'UTC'
時間を取得するにしても、日本の時間の方がいちいちコンバートをかけなくてもいいかもしれない。全世界を相手にするなんておこがましい気がするし、基本的に日本語じゃないとしっくりこない人間だしね。とはいえ、必要があったら英語読むくらいの事は、技術者としてしなくちゃなんないのは残念だけど。
UTCをJSTにしたら起動時にエラー出まくり。rake time:zones:allをすると、地名とかで指定するみたい。バリバリ関東の人間なのだが、東京ってあんまり好きじゃなくて、ちょっと不本意だけど、下記のように設定。
config.time_zone = 'Tokyo'
とすると、エラーが出なくなった。OsakaでもYakutsk(ってどこ?ロシア?)でも大丈夫らしい。DBの中身の方は今までと変わらずUTC表示っぽいが、Ruby on Rails的にはコメントに書いてあるように、自動的にコンバートをかけてくれるみたい。作りたいのはガッツリ日本時間を取れないと大問題ですが、とりあえずこのままでいいや。
コメント 0