2010-10-25

ActvieDirectoryでケルベロス認証して、その結果をrailsで使ってみる

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
railsには便利な認証機構がいろいろある感じですが、ActiveDirectoryに認証を任せるには普通はldapを使うのでしょうが、都合によりActiveDirectoryのldapがうまく使えないためケルベロス認証させたいときお話です。

調べ見たところ、もうそこはrailsではなくapacheの方でmod_auth_kerbを利用して認証させて、その結果がREMOTE_USERに設定されるので、その値を利用して認可するというやり方をするようです。
このやり方であればapacheのモジュールで認証できる仕組みならば、rails側に持ってくることもできそうです。

なので使えるようにしてみました。
環境は、CentOS5.4,apache2.2,passengerを利用した環境です。
ちなみにpassengerを使わずにapacheをproxyにして別のwebサーバを利用している時は、mod_rewriteを使ってREMOTE_USERが後ろのサーバに伝播されるような設定が必要なようです。

まずは、mod_auth_kerbの準備です。
[/etc/krb5.confの設定]
http://junsan45.blogspot.com/2009/10/centos-53-windows.html
などを見て、環境にあわせて/etc/krb5.confを設定してください。
ここで設定したrealmの値を後で使います。

[インストール]
su
yum -y install mod_auth_kerb

[設定]
vi /etc/httpd/conf.d/auth_kerb.conf
とりあえずテスト用に以下のような感じで設定
-----------------------------
<Location /test_krb_auth>
AuthType Kerberos
AuthName "Kerberos Login"
KrbAuthRealms [/etc/krb5.confで設定したrealm]
KrbVerifyKDC Off
KrbMethodNegotiate Off
require valid-user
</Location>
-----------------------------

[確認]
これで対象のサイトにログインした際に
これでREMOTE_USERに
username@realm
のようにrealm付きで認証したユーザがセットされることをお手軽に確認できる方法で確認します。

[おまけ]
mod_auth_kerbのversionが5.4
ならば
KrbLocalUserMapping On
とすることで
上記の@以降のrealmが除去される模様です。
yumでインストールされるversionは5.4より古かったです。


ここでrailsアプリを用意してpassengerの設定を行います。
passenger.confに以下のような感じでrailsアプリを利用できるように配置します。

RailsBaseURI /rails_kerb

<Location /rails_kerb>
AuthType Kerberos
AuthName "Kerberos Login"
KrbAuthRealms [/etc/krb5.confで設定したrealm]
KrbVerifyKDC Off
KrbMethodNegotiate Off
require valid-user
</Location>

これでrailsのApplicationControllerで
login = request.env['REMOTE_USER']
でユーザ情報を受け取り、データベースでも見て利用可能なユーザかどうかをチェックすればOKです。

本番環境はこれでよいのですが開発環境ではwebサーバでapacheを利用することはあまりないと思うので、REMOTE_USERが取得できないというのが困った感じです。
とりあえず以下のような感じで環境がdevelopmentの時だけ、独自のBASIC認証をしてREMOTE_USERをセットするようにしてみました。

class ApplicationController < ActionController::Base
  before_filter :authorize
  protected
  def authorize
    auth_ret = true
    if session[:user].nil?
      if ENV['RAILS_ENV'] == "development"
        auth_ret = false
        authenticate_or_request_with_http_basic do |user, pass|
          request.env['REMOTE_USER'] = user
          true
        end
      end
      login = request.env['REMOTE_USER']
      //本当はここいら辺でloginを利用して値をチェック
      session[:user] = login
    end
    if auth_ret and session[:user].nil?
      //認可されなかったときの処理
    end
  end
end
auth_retは、
if ENV['RAILS_ENV'] == "development"
の中に入るけど
authenticate_or_request_with_http_basic do |user, pass|
の中に入らない動きを見せたので入れてみました。

これでdevelopment環境でもREMOTE_USERが設定されるようになりました。
test環境を加えてもよいのかもしれないです。

2010-10-24

javascriptで前後の空白を除去する

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
javascript 空白除去
で検索するといろいろ出てくるのですが、前後の
全角スペース、半角スペース、タブ、改行
すべてを除去してくれるものは見つからなかったので、組み合わせてメモ的に書いておきます。

こんな感じです。
val = unescape(escape(val).replace(/^(%u3000|%20|%09|%0D|%0A)+|(%u3000|%20|%09|%0D|%0A)+$/g, ""));

valが前後の空白を除去したい文字列です。

2010-10-21

jQueryでいくつかの画像を順番に表示するプラグイン

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
説明画面のようなものを画像を使って作りたいなぁと思ったわけです。

古くはアニメーションGIFなんぞを使ったのかもしれませんが、メンテナンスが面倒そうです。
今どきならば動画を用意するのがよいかもしれませんが、そこまでするほどの内容でないのです。

困った時のjQueryということで探したところ、
Feature List
というプラグインを見つけました。

こちらのページを見て見つけたのでした。
http://phpspot.org/blog/archives/2009/12/jqueryfeature_l.html

具体的な使い方は、上記のページを参考にしてください。

Feature Listを使う際には、
idがtabsとoutputというulタグでくくられたリストを用意します。
(実際は、tabsとoutputでなくてもよいのでしょうが例がそうなっているので。)

で実際には以下の2つの動作が行われます。
(1)idがoutputであるulタグで囲まれたliタグのリストを先頭から順番に表示
(2)idがtabsであるulタグで囲まれたliタグのリスト直下のaタグに先頭から順番にcurrentクラスが移動

なのでidがoutputであるulタグ内のliタグ内にimgタグを書いておけば画像が順番に表示されることになります。仕組みとしてはliタグの中が順に表示されるので別に画像でなくて普通に文章でも問題なしです。
idがtabsであるulタグ内のliタグリストは常に表示されます。currentクラスが順についていくのでcssでcurrentクラスを定義することで見た目を変えていくことになります。

かっこよさげに表示させるには、上記をふまえてcssをちゃんと書くことが重要です。
cssを何も書かないと相当かっこ悪いです。

cssでは最低限、以下ぐらいは入れないとかっこ悪い感じです。
実際はサンプルをちゃんと見たほうがよいです。
div#feature_list {
 height:800px;
}
div#feature_list ul {
 list-style: none; 
}
ul#tabs li a.current {
 color: red;
}
ul#output li {
 position: absolute;
}
div#feature_listのheightは実際に使うサイズにしてください。
div#feature_list ulのlist-styleがnoneでないと・とかでます。
ul#tabs li a.currentは単なる一例です。
ul#output liのpositionがabsoluteでないと当たらし表示が出るときにカクカクします。

cssをちゃんといじればかっこよくなるので、今後も使いそうなjQueryプラグインな気がします。

2010-10-08

Google App Engineのwebappでステータス404を返す

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
python版のGoogle App Engineで提供されているフレームワークであるwebappでhttpのステータスコード404を返したいなぁと思って調べたら、
class AaaPage(webapp.RequestHandler):
  def get(self):
    self.error(404)
    return self.response.out.write('404 not found')
というパターンと
class AaaPage(webapp.RequestHandler):
  def get(self):
    self.response.set_status(404)
    return self.response.out.write('404 not found')
という二つのパターンが見つかります。

何が違うのかしらん?と思っていたらgoogleさんに普通に書いてありました。
http://code.google.com/intl/ja/appengine/docs/python/tools/webapp/requesthandlerclass.html#RequestHandler_error

self.error(code)

self.response.clear()

self.response.set_status(code)
を呼び出した場合と同じだそうです。

なので違いは、
self.response.clear()
を呼ぶか呼ばないかみたいです。
self.response.clear()
を呼ぶ場合と呼ばない場合でどんな違いがあるのかよくわからんので
とりあえず呼んでおくことにして
self.error(code)
を使うことにしてみました。