MySQLとの連携
このオーソライザーは、MySQLデータベースに格納されたルールリストとパブリッシュ/サブスクリプション要求を照合することで認可チェックを実装します。
前提条件
EMQX認可の基本概念の知識が必要です。
データスキーマとクエリ文
MySQLオーソライザーはほぼあらゆるストレージスキーマに対応しています。ビジネス要件に応じて、認証情報の保存方法やアクセス方法を決定できます。例えば、1つまたは複数のテーブルやビューを使用することが可能です。
ユーザーはクエリ文のテンプレートを提供し、以下のフィールドが含まれていることを保証する必要があります:
permissionはルールが一致した場合に適用されるアクションを指定します。denyまたはallowのいずれかである必要があります。actionはルールが関連するリクエストの種類を指定します。publish、subscribe、またはallのいずれかである必要があります。topicはルールに関連するトピックフィルターを指定します。ワイルドカードおよびトピックプレースホルダーをサポートする文字列である必要があります。qos(任意)はルールが適用されるQoSレベルを指定します。値は0、1、2のいずれか、またはカンマ区切りの文字列(例:0,1)で複数指定可能です。デフォルトはすべてのQoSレベルです。retain(任意)は現在のルールが保持メッセージをサポートするかどうかを指定します。値は0または1で、デフォルトは保持メッセージを許可します。
認証情報を格納するためのテーブル構造例:
CREATE TABLE `mqtt_acl` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`ipaddress` VARCHAR(60) NOT NULL DEFAULT '',
`username` VARCHAR(255) NOT NULL DEFAULT '',
`clientid` VARCHAR(255) NOT NULL DEFAULT '',
`action` ENUM('publish', 'subscribe', 'all') NOT NULL,
`permission` ENUM('allow', 'deny') NOT NULL,
`topic` VARCHAR(255) NOT NULL DEFAULT '',
`qos` tinyint(1),
`retain` tinyint(1),
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;TIP
システム内のユーザー数が多い場合は、クエリ応答時間を短縮しEMQXの負荷を軽減するために、事前にテーブルの最適化とインデックス作成を行ってください。
このテーブルでは、MQTTユーザーは username で識別されます。
例えば、ユーザー user123 がトピック data/user123/# へのパブリッシュを許可される認可ルールを追加したい場合、クエリ文は以下のようになります:
mysql> INSERT INTO mqtt_acl(username, permission, action, topic, ipaddress) VALUES ('user123', 'allow', 'publish', 'data/user123/#', '127.0.0.1');
Query OK, 1 row affected (0,01 sec)対応する設定パラメータは以下の通りです:
query = "SELECT action, permission, topic, ipaddress, qos, retain FROM mqtt_acl where username = ${username} and ipaddress = ${peerhost}"ダッシュボードでの設定
EMQXダッシュボードを使用して、MySQLをユーザー認可に利用する方法を設定できます。
EMQXダッシュボードの左側ナビゲーションツリーで アクセス制御 -> 認可 をクリックし、認可 ページに入ります。
右上の 作成 をクリックし、次に バックエンド で MySQL を選択します。次へ をクリックすると、設定 タブが表示されます。

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