on Rails : アプリケーションのadminパスワードを設定
するCoooooolな方法は無いかしら.内容的にはRide on Rails - Chapter 2の始めの方です.
Ride on Railsに書いてある方法.
- ソースコードの中に直接
- 格好悪すぎ
- 保守性が悪い
- 何よりも危険
- MD5で暗号化してソースコードに埋め込む
- 設定ファイルを作り,パスワードを管理
- /etc/などに置くことになるので,安全
- ある程度の汎用性がある
- アプリケーション配布時に,それぞれユーザが作らなければならない
考えつく他の方法は,
- Adminモデルを作っちゃう
- テーブルが増えることになる
- 複数の管理人が登録できる
- でも,いつどこで登録するんだよ
- ガッチリはする?
- ひげろぐ@はてな-LoginEngine関連メモより
- なるほど.UserController*1を作って,継承しちゃうってのもアリだな
- いろいろ(ビューとか)DRYに反しそう(結局アクションはほとんど再定義になる?)
もっと他に,いい方法は無いかしら.
今はとりあえず一番下の「設定ファイルを作ってパスワードを管理」することにしてみます.
ほとんど写経しただけ.ちょっと変えたけど.
class BooksController < ApplicationController (略) @@config = HashWithIndifferentAccess.new({ :password => 'webapp_name__admin' }) cattr_reader :config config_paths = [File.expand_path('/etc/webapp_name.conf')] config_paths << File.expand_path('~/.webapp_name') if ENV.key?('HOME') config_paths.each do |path| next unless test ?f, path IO.foreach(path) do |line| next if line =~ /^#/ if line =~ /^(\w+)=(.*)/ @@config[$1] = $2 end end end def login if request.post? if params[:password] == config[:password] session[:role] = 'admin' redirect_to :action => 'index' flash[:notice] = 'Login successful.' end end end def logout session[:role] = nil redirect_to :action => 'login' flash[:notice] = 'Logout' end (略) end
なかなか奥が深い.
@@config = HashWithIndifferentAccess.new({:password => 'books_admin'})
これは,設定ファイルが存在しない場合の,言わばデフォルトのパスワード.こういうふうに既定値を設定する方法があるのね.勉強になるわ.
config_paths = [File.expand_path('/etc/books.conf')]
わざわざ配列にしてるのは,パスをドンドン追加していくためなのね.初め見たとき,なんと面妖な記法かと思ってしまったけれど,そのままだった.
next unless test ?f, path
パスの指定したものがプレーンファイルであるかを確認してる.あぁ,確かそんなのあったなぁ,程度に脳みその隅っこにあった.
if params[:password] == config[:password]
なるほど,クラス変数のアクセサメソッドを定義することで,インスタンスメソッドの中で,こんな簡単に呼び出すことが出来るんだな.
なんだかんだで安全かつ保守性もありそうで良い感じだな.
しかしながら,これ,後からユーザ管理とかになるんですけど,どうせLoginEngineでUserモデルとUserコントローラが作られるんだから,Adminもその流れに乗っちゃってAdminモデル,Adminコントローラを作っちゃっても良い気がする.
その辺は実務経験が無いもんだから,はっきりとした物言いが出来ないけれどもね.まぁあれです,学生は妄想だけしれてば良いんです.
*1:LoginEngineで作られる