2011/04/27

devise でカスタム認証ロジックを組み込む

たとえば、退職したユーザにはログインさせたくないけど、表示等の関係でユーザ情報を削除できない場合、users テーブルに can_login 列などを作って、フラグ管理しますよね。
んで can_login 列の値でログインを制御したい場合、どう組み込めばいいかなーと悩んでたんですがとりあえずできたのでエントリにしてみます。
devise やコアとなってる warden にそんな機能はありそうなもんだけど、よくわからなかったので自前で仕込みました。
で、認証を行っているメソッドに追加処理をつっこんでやればいいわけです。
devise の lib/devise/controllers/helpers.rb を見ると、authenticate_user! は warden.authenticate! を、current_user は warden.authenticate を呼びだしてる模様。
warden のソースで lib/warden/proxy.rb を見ると、authenticate! も authenticate も _perform_authentication を呼び出しているので、ここで細工してやればよさそう。
んで、最終的には $RAILS_ROOT/config/initializers/extensions/warden_extension.rb を配置して、中身はこんな感じ。
# -*- coding: utf-8 -*-
module Warden
  class Proxy
    alias_method :original_perform_authentication, :_perform_authentication

    private
    def _perform_authentication(*args)
      user, opts = original_perform_authentication(*args)
      # このチェックを入れないとリダイレクトループになる
      unless winning_strategy && winning_strategy.user
        user = nil if user && !user.can_login?
      end
      [user, opts]
    end
  end
end
元メソッド呼び出したあとに、追加でカスタムロジックを追加している。
んで、その内容自体を元メソッドとして上書きってな感じ。
リダイレクトループにさえならなければ、もっとシンプルなソースになったのに、残念だ。

2011/04/10

eclipse galileo にPyDev をインストール

どうせ GAE やるなら Java よりも Python よね。
Java の方が慣れているし、コーディングしやすいんだけど、せっかくの勉強ということで。

というわけで、PyDev を Eclipse にインストールした。
まずは Eclipse を立ち上げて、[ヘルプ] > [新規ソフトウェアのインストール...]

作業対象に http://pydev.org/updates と入力し、[追加]ボタンで PyDev と名づけて [OK] ボタンで保存(上の状態になる)。

上の [Eclipse PyDev] にチェックを入れて [次へ]

インストールの確認なので何もせず [次へ]

ライセンスの確認。同意しますをチェックして [完了]

Now Installing...

証明書の信頼が必要らしい。とりあえず両方共チェックして [OK]

Eclipse の再起動を促されるので再起動。

パースペクティブに PyDev が登録されているから大丈夫だろう。

2011/04/09

Ubuntu 10.04 に Eclipse をインストール

今更ながら Google App Engine で遊ぶために、Eclipse をインストール。
まずは本体をインストール。面倒なので少々古くても apt で入れる。
% sudo aptitude install eclipse

次に日本語化のために、Merge Doc Projectから、Pleiades 本体をダウンロード。
解凍してインストールした Eclipse に上書き。
% unzip pleiades.zip
% cd pleiades
% sudo cp -R features/* /usr/lib/eclipse/features 
% sudo cp -R plugins/* /usr/lib/eclipse/plugins 

eclipse.ini を編集。(sudo が必要)
最後に下記を追加。
-javaagent:/usr/lib/eclipse/plugins/jp.sourceforge.mergedoc.pleiades/pleiades.jar
(ついでに、-showsplash と org.eclipse.platform をコメントアウトしておけば、起動時の splash を変えられるそうな。)

端末で eclipse -clean とすれば完了。無事に Eclipse が日本語化されました。