Overview
Authorization extensions control what MQTT clients can publish and subscribe to. The Extension SDK provides fine-grained authorization for:- Publish Authorization - Control which topics clients can publish to
- Subscribe Authorization - Control which topics clients can subscribe to
- Per-Topic Permissions - Different permissions for different topics
- Dynamic Permissions - Change permissions based on runtime conditions
Authorization Flow
Publish Authorization
- Client sends PUBLISH packet
- HiveMQ calls
PublishAuthorizer.authorizePublish()for each registered authorizer - Authorizer allows, denies, or delegates the decision
- PUBLISH is processed or client is disconnected based on result
PluginAuthorizerService.java:36 for publish authorization service.
Subscribe Authorization
- Client sends SUBSCRIBE packet
- HiveMQ calls
SubscriptionAuthorizer.authorizeSubscribe()for each topic filter - Authorizer allows, denies, or modifies each subscription
- SUBACK is sent with results
PluginAuthorizerService.java:52 for subscription authorization service.
Implementing an Authorizer
Step 1: Create AuthorizerProvider
Register your authorizer inextensionStart():
Step 2: Implement PublishAuthorizer
Step 3: Implement SubscriptionAuthorizer
Combined Authorizer
Implement both interfaces in a single class:Authorization Methods
Allow
Grant permission for the operation:Deny
Deny permission for the operation:Delegate
Pass decision to next authorizer:Disconnect Client
Forcefully disconnect the client:Modifying Subscriptions
Change subscription properties during authorization:Role-Based Authorization
Implement role-based access control:Async Authorization
Perform authorization checks asynchronously:Database-Backed Authorization
Load permissions from a database:Default Permissions
Set default permissions for clients using Client Initializers:Authorizers.java:45 for authorizer provider registration.
Best Practices
Security
- Fail Securely - Deny access on errors rather than allowing
- Validate Topic Patterns - Ensure topic filters don’t grant excessive access
- Audit Authorization - Log authorization decisions for security auditing
- Principle of Least Privilege - Grant minimum necessary permissions
- Separate Read/Write - Use different permissions for publish and subscribe
Performance
- Use Async Mode - Don’t block for permission lookups
- Cache Permissions - Cache frequently checked permissions
- Optimize Database Queries - Index ACL tables properly
- Minimize Latency - Keep authorization fast to reduce message latency
Maintainability
- Centralize Permission Logic - Don’t duplicate authorization rules
- Use Configuration - Externalize permission rules when possible
- Document Permissions - Clearly document permission model
- Test Thoroughly - Test all permission scenarios
Testing Authorization
Test authorization with MQTT clients:Troubleshooting
Authorization Always Fails
- Verify authorizer provider is registered
- Check
authorizeSuccessfully()is called for allowed operations - Review topic matching logic
- Enable debug logging for authorization
Authorization Not Applied
- Ensure extension is loaded and started
- Check extension priority (lower numbers execute first)
- Verify no other authorizers are overriding decisions
Performance Issues
- Use async mode for I/O operations
- Implement permission caching
- Optimize database queries
- Review authorization latency metrics
PluginAuthorizerService.java:28 for internal authorization service interface.
Next Steps
Authentication
Implement custom authentication
Client Initializers
Set default permissions and initialize clients
Packet Interceptors
Intercept and modify MQTT packets
Extension SDK
Learn more about the Extension SDK