PostgreSQLとの統合
このオーソライザーは、PostgreSQLデータベースに格納されたルールのリストとパブリッシュ/サブスクリプション要求を照合することで認可チェックを実装しています。
前提条件
EMQX認可の基本概念の知識
データスキーマとクエリ文
PostgreSQLオーソライザーはほぼあらゆるストレージスキーマをサポートします。ACLルールの保存方法やアクセス方法は、単一または複数のテーブル、ビューなど、ユーザーの判断に委ねられます。
ユーザーはクエリ文のテンプレートを提供し、以下のフィールドが含まれていることを確認する必要があります:
permissionはルールがマッチした場合に適用されるアクションを指定します。denyまたはallowのいずれかである必要があります。actionはルールが関連する要求を指定します。publish、subscribe、またはallのいずれかである必要があります。topicはルールに関連するトピックフィルターを指定します。ワイルドカードおよびトピックプレースホルダーをサポートする文字列である必要があります。qos(任意)はルールが適用されるQoSレベルを指定します。値は0、1、2のいずれか、または複数のQoSレベルを指定するためにカンマ区切りの文字列(例:0,1)も可能です。デフォルトはすべてのQoSレベルです。retain(任意)は現在のルールが保持メッセージをサポートするかどうかを指定します。値は0または1です。デフォルトは保持メッセージを許可します。
資格情報を保存するためのテーブル構造の例:
CREATE TABLE mqtt_acl(
id serial PRIMARY KEY,
username text NOT NULL,
permission text NOT NULL,
action text NOT NULL,
topic text NOT NULL,
qos smallint,
retain smallint
);
CREATE INDEX mqtt_acl_username_idx ON mqtt_acl(username);このテーブルでは、MQTTユーザーは username で識別されます。
例えば、ユーザー user123 に対してトピック data/user123/# のパブリッシュを許可する認可ルールを追加したい場合、クエリ文は以下のようになります:
postgres=# INSERT INTO mqtt_acl(username, permission, action, topic, ipaddress) VALUES ('user123', 'allow', 'publish', 'data/user123/#', '127.0.0.1');
INSERT 0 1対応する設定パラメータは以下の通りです:
query = "SELECT permission, action, topic, ipaddress, qos, retain FROM mqtt_acl WHERE username = ${username} and ipaddress = ${peerhost}"ダッシュボードでの設定
EMQXダッシュボードを使ってPostgreSQLをユーザー認可に利用する設定が可能です。
EMQXダッシュボードで、左側のナビゲーションツリーから Access Control -> Authorization をクリックし、Authorization ページに入ります。
右上の Create をクリックし、Backend で PostgreSQL を選択してから Next をクリックします。Configuration タブが表示されます。

以下の指示に従って認可バックエンドを設定します:
PostgreSQLへの接続情報を入力します。
- Server:EMQXが接続するサーバーアドレス(
host:port)を指定します。 - Database:PostgreSQLのデータベース名。
- Username:ユーザー名を指定します。
- Password:ユーザーパスワードを指定します。
- Server:EMQXが接続するサーバーアドレス(
Precondition:任意のVariform式を入力します。EMQXはこの式が
trueと評価された場合のみこのオーソライザーを呼び出します。詳細はオーソライザーの前提条件を参照してください。Enable TLS:TLSを有効にする場合はトグルスイッチをオンにします。TLS有効化の詳細はネットワークとTLSを参照してください。
SQL:データスキーマに従ってクエリ文を入力します。詳細はデータスキーマとクエリ文を参照してください。
Advanced Settings:接続プール、タイムアウト、プリペアドステートメントの動作を設定します。
- Connection Pool Size(任意):EMQXノードからPostgreSQLへの同時接続数を整数値で指定します。デフォルトは
8。 - Connect Timeout(任意):接続試行がタイムアウトとみなされるまでの待機時間を指定します。単位はミリ秒、秒、分、時間が利用可能です。デフォルトは
15秒。 - Disable Prepared Statements(任意):データベースクエリでプリペアドステートメントの使用を無効にします。PostgreSQLのプロキシやミドルウェア(例:PGBouncerやSupabaseのトランザクションモード)がセッションレベルの機能をサポートしない場合に有効にしてください。デフォルトは無効です。
- Connection Pool Size(任意):EMQXノードからPostgreSQLへの同時接続数を整数値で指定します。デフォルトは
Create をクリックして設定を完了します。
設定項目による設定
EMQXの設定項目を使ってPostgreSQLオーソライザーを設定することも可能です。
PostgreSQLオーソライザーはタイプ postgresql で識別されます。設定パラメータの全リストはEMQX Enterprise設定マニュアルを参照してください。
任意の precondition 設定項目はVariform式を受け入れます。EMQXはこの式が true と評価された場合のみこのオーソライザーを呼び出します。precondition が省略または空の場合は前提条件は適用されません。詳細はオーソライザーの前提条件を参照してください。
設定例:
{
type = postgresql
database = "mqtt"
username = "postgres"
password = "public"
server = "127.0.0.1:5432"
query = "SELECT permission, action, topic FROM mqtt_acl WHERE username = ${username}"
connect_timeout = "15s"
disable_prepared_statements = false
}