Skip to content

PostgreSQL 授权

扩展授权支持通过集成 PostgreSQL 进行授权验证。

表结构与查询语句

PostgreSQL 授权器可以支持任何表结构,甚至是多个表联合查询、或从视图中查询。用户需要提供一个查询 SQL 模板,且确保查询结果包含以下字段:

  • permission: 用于指定操作权限,可选值有 allowdeny
  • action: 用于指定当前规则适用于哪些操作,可选值有 publishsubscribeall
  • topic: 用于指定当前规则适用的主题,可以使用主题过滤器和主题占位符。
  • qos: (可选)用于指定规则适用的消息 QoS,可选值为 012,也可以用 , 分隔的字符串指定多个 QoS,例如 0,1。默认为全部 QoS。
  • retain: (可选)用于指定当前规则是否支持发布保留消息,可选值有 01,默认允许保留消息。

示例表结构:

SQL
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 tinyint,
  retain tinyint
);
CREATE INDEX mqtt_acl_username_idx ON mqtt_acl(username);

TIP

上面的示例创建了一个索引,当系统中有大量权限数据时,请确保查询使用的表已优化并使用有效的索引,以提升大量连接时的数据查找速度并降低 EMQX 负载。

添加用户名为 emqx_u、禁止发布到 t/1 主题的规则示例:

SQL
postgres=# INSERT INTO mqtt_acl(username, permission, action, topic) VALUES ('emqx_u', 'deny', 'publish', 't/1');
INSERT 0 1

对应的配置参数为:

query = "SELECT permission, action, topic, qos, retain FROM mqtt_acl WHERE username = ${username}"

配置 PostgreSQL 授权

在部署中点击 访问控制 -> 授权 -> 扩展授权,选择 PostgreSQL 授权,点击配置授权

您可按照如下说明完成相关配置:

  • 服务:填入 PostgreSQL 服务器地址 (host:port) 。
  • 数据库:填入 PostgreSQL 的数据库名称。
  • 用户名(可选):填入用户名称。
  • 密码(可选):填入用户密码。
  • 启用 TLS:配置是否启用 TLS。
  • 连接池大小(可选):填入一个整数用于指定从 EMQX 节点到 PostgreSQL 数据库的并发连接数;默认值:8
  • SQL:根据表结构填入查询 SQL,具体要求见 SQL 表结构与查询语句

TIP

  • 如果当前部署为专有版,需创建 VPC 对等连接,服务器地址填写内网地址。
  • 如果当前部署为 BYOC 版,需在您的公有云控制台中创建 VPC 对等连接,具体请参考 创建 BYOC 部署 - VPC 对等连接配置 章节。服务器地址填写内网地址。
  • 若提示 Init resource failure! 请检查服务器地址是否无误、安全组是否开启。