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で作られる