トップ «前の日記(2008-11-25 (Tue)) 最新 次の日記(2008-12-05 (Fri))» 編集

uDiary

海野秀之(うんのひでゆき)の外部記憶

Twitter (twilog) / RSS / アンテナ / ぶくま

2006|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|08|
2010|01|02|03|05|06|07|10|11|
2011|03|08|
2012|02|04|07|08|10|
2013|01|02|03|05|06|08|11|12|
2014|01|02|05|06|07|08|09|12|
2015|01|02|03|04|

2008-11-27 (Thu)

Hiki のユーザ認証を LDAP にしたい

えー、社内 web みたいなところに、なんか勝手に・自由に Wiki でも立てましょうというケース。 Hiki を使って、edit_user なんかがとても便利なんだが、 こう、アカウント・パスワード情報があちこちに増え続けるのが、ちょっと堪らない。

そこで、LDAP サーバに認証をまかせてしまおう!おー、それがいい。

まず、${Hiki のインストールディレクトリ}/hiki/ldapauth.rb とかいう名前で、 次のようなファイルを置く。

require 'ldap'

def auth_ldap(uid, pass)
  conn = LDAP::Conn.new("127.0.0.1", LDAP::LDAP_PORT) # これは、LDAP サーバが localhost な場合。
  conn.set_option(LDAP::LDAP_OPT_PROTOCOL_VERSION,3)

  dn="uid=#{uid},ou=People,dc=hoge,dc=fuga,dc=honya"  # dn は適切に、ね。

  begin
    conn.simple_bind(dn, pass)
    true
  rescue LDAP::ResultError
    false
  end
end

でもって、さらに、${Hiki のインストールディレクトリ}/hiki/plugin.rb にちょいと小細工を施す。

最初らへん:

# $Id: plugin.rb,v 1.36 2006/09/02 06:36:57 znz Exp $
# Copyright (C) 2002-2003 TAKEUCHI Hitoshi <hitoshi@namaraii.com>
# Copyright (C) 2004-2005 Kazuhiko <kazuhiko@fdiary.net>
#
# TADA Tadashi <sho@spc.gr.jp> holds the copyright of Config class.

require 'cgi'
require 'uri'
require 'hiki/util'
require 'hiki/ldapauth' # ←ここ

なかほど:

    def login( name, password )
      return if @user
      return nil unless password
      name ||= @conf.admin_name
      if @conf.password.empty? || password.crypt( @conf.password ) == @conf.password && name == @conf.admin_name
        @user = @conf.admin_name
      elsif @conf['user.list']
        if auth_ldap(name, password) # ここ
          @user = name
        end
      end
    end

実際、plugin.rb を書き換えたのは二行だけである。

% diff plugin.rb.bk plugin.rb                                                                                [~/html/h/hiki]
9a10
> require 'hiki/ldapauth'
309c310
<         if @conf['user.list'].has_key?(name) && @conf['user.list'][name] == password.crypt(@conf['user.list'][name])
---
>         if auth_ldap(name, password)

これで、LDAP サーバに認証を丸なげできる。elsif @conf['user.list'] とか、 そのまま残してあるので、edit_user プラグインはちゃんと有効にして、 ユーザリストに適当なユーザ名を書いておく必要がある。

動作確認は、Hiki 0.8.7 (2007-06-24) で行った。 また、ruby-ldap-0.9.7 を使用してます。

メモ

  • このケースでは、LDAP サーバが localhost なんで、ほぼ問題ないと思うんですが、通信経路は暗号化されるべき……かなぁ? (Hiki 自体を http:// で見せてたら、どっちみちそこで見えるよね。)
  • auth_ldap が「成功」したときには、Gecos or User name を返すようにして、 @user = auth_ldap(name, password) って書いた方がおしゃれかな(どうでもいいか)。
本日のツッコミ(全2件) [ツッコミを入れる]
# katayama (2009-02-11 (Wed) 22:10)

初めまして<br>この日記を参考にhikiのLDAP認証プラグインを作ってみました。<br>http://sourceforge.jp/projects/hiki-auth-ldap/<br>事後報告となってしまいすいません。

# うんの (2009-02-12 (Thu) 09:14)

うわぁ、びっくり。<br># 普段、ひとに読まれるのを意識しているよう、いないような感じなので。<br><br>わざわざ御報告いただいて、ありがとうございます。


2006|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|08|
2010|01|02|03|05|06|07|10|11|
2011|03|08|
2012|02|04|07|08|10|
2013|01|02|03|05|06|08|11|12|
2014|01|02|05|06|07|08|09|12|
2015|01|02|03|04|
Categories 3imp | Card | Cutter | Dalvik | Euler | Football | GAE/J | Hand | Haskell | Re:View | Ruby | Scheme | TQD | Tiger | TigerBook読 | UikiTeXi | Verilog | Violin | Web | parconc | tDiary | お勉強 | エントロピー | ツン読 | | 将棋 | 政治について | | 模写してみよう | 確率論 | 設定など | 雑文 | 音声