システム内でメールアカウントを自動発行するロジックがあるのですが、ランダムな文字列で生成した場合に、重複するというトラブルが発生しました。
発行されたメールアカウントはLDAPサーバ内の一意のディレクトリに情報として保持してありますので、発行の際に参照し、重複があれば再発行することで問題を解決しました。
from ldap3 import Server,Connection,AUTO_BIND_NO_TLS,SUBTREE
import json
import random
import string
import sys
# サーバに接続し認証
conn = Connection(
server = Server('example.co.jp', 389),
user='cn=Manager,dc=example,dc=co,dc=jp',
password='Password',
check_names=True,
read_only=True,
auto_bind=AUTO_BIND_NO_TLS
)
# メールアカウント生成関数定義
def generate():
# 空のリストを作成し5桁5桁を格納
global MailAccountId
first = random.choices(string.ascii_lowercase, k=5)
latter = random.choices(string.digits, k=5)
MailAccountId = "".join(first) + "".join(latter)
# 保持ディレクトリ検索関数
# ou=MailAccountから該当値と重複する値があるか
def accountsearch():
# メールディレクトリへの検索フィルタを作成
filtervalue = '(&(objectclass=MailAccount)(MailAccountId=' + MailAccountId + '))'
# 属性情報を抽出 メールディレクトリのMailAccountIdを取得
conn.search(
search_base='ou=MailAccount,ou=retention,ou=,dc=example,dc=co,dc=jp',
search_filter = filtervalue,
search_scope = SUBTREE,
attributes = (
'MailAccountId'
),
# オプション属性を出力するならTrue、不要ならFalse
get_operational_attributes = False
)
if not conn.response:
print(MailAccountId)
sys.exit()
else:
# JSON形式で出力
json_string = conn.response_to_json()
json_dict = json.loads(json_string)
# JSONからDictに変換し、入れ子になっているキーと要素を指定して裸の値を出力
global mavalue
mavalue = json_dict["entries"][0]["attributes"]["MailAccountId"][0]
メールアカウントを発行するgenerate()関数と、保持ディレクトリに対してsearchをかけるaccountsearch()関数をループで組むことで、重複が無くなるまで再発行を繰り返すことができるようになります。
ldap3ライブラリで属性情報を取得する際にはLDIF形式やJSON形式が選べるのですが、JSON形式のほうが加工しやすかったので採用しました。
発行対象がメールアカウント以外でも応用できますし、検索対象がLDAPではくRDBなりKVSでも応用できます。