ActiveDirectoryなんかと連携する場合、設定触る権限なかったりでどうしても日本語で検索できないと困るって場合がある。
ところが、Net::LDAPでエラーが返ってしまう。
example.rb
Group.find(:first, :filter => "(sAMAccountName=営業部)")
=>Invalid filter syntax. (Net::LDAP::LdapError)
ひょっとしてNet::LDAP日本語使えないのかなと思って試してみると、そういうわけではない。
net_ldap_sample.rb
# coding: utf-8
require 'net/ldap'
# net_ldap=Net::LDAP.newの詳しい記述は省略
net_ldap.open do |ldap|
treebase = "dc=example,dc=com"
filter = Net::LDAP::Filter.eq( "sAMAccountName", "営業部" )
attrs = ["cn"]
ldap.search(:base => treebase, :filter => filter, :attributes => attrs, :return_result => false ) do |entry|
entry.each do |attr, values|
puts"#{attr}: "
values.each do |value|
puts " #{value}"
end
end
end
end
=>cn:
営業部
Net::LDAPのソースを漁ってみると、Net::LDAP::Filter内のFilterParserに正規表現が。
どうもここで日本語がはねられてるようなので別ファイルでオーバーライドする。
※変更箇所以外はparse_filter_branchメソッドまるごとコピペ
class Net::LDAP::Filter
class FilterParser
def parse_filter_branch(scanner)
- if value = scanner.scan(/(?:[-\w*.+@=,#\$%&!'\s\]|\\[a-fA-F\d]{2})+/)
+ if value = scanner.scan(/(?:[-\w*.+@=,#\$%&!'\s\p{Letter}]|\\[a-fA-F\d]{2})+/u)
本当は漢字セットの\p{Han}でマッチさせたかったが、マッチングできず正規表現深追いしたくなかったので\p{Letter}で逃げの一手に出ることに。。。
2014/4/22追記
Net::LDAPの0.6ではこの問題解決されてそうです(未検証)。
多分この対処はいらなくなるはず。