Granular Permissions for Mini-Programs in Super Apps

Granular Permissions for Mini-Programs in Super Apps When developing a Super App, we faced the challenge of restricting mini-program access to host resources. Each mini-program should not have direct access to the camera or geolocation — otherwise the user loses control over their data. Imagine a

Development and support of all types of mobile applications:

Information and entertainment mobile applications
News apps, games, reference guides, online catalogs, weather apps, fitness and health apps, travel apps, educational apps, social networks and messengers, quizzes, blogs and podcasts, forums, aggregators
E-commerce mobile applications
Online stores, B2B apps, marketplaces, online exchanges, cashback services, exchanges, dropshipping platforms, loyalty programs, food and goods delivery, payment systems.
Business process management mobile applications
CRM systems, ERP systems, project management, sales team tools, financial management, production management, logistics and delivery management, HR management, data monitoring systems
Electronic services mobile applications
Classified ads platforms, online schools, online cinemas, electronic service platforms, cashback platforms, video hosting, thematic portals, online booking and scheduling platforms, online trading platforms

These are just some of the types of mobile applications we work with, and each of them may have its own specific features and functionality, tailored to the specific needs and goals of the client.

Our competencies:

Frequently Asked Questions

Latest works

  • image_mobile-applications_feedme_467_0.webp
    Development of a mobile application for FEEDME
    895
  • image_mobile-applications_xoomer_471_0.webp
    Development of a mobile application for XOOMER
    782
  • image_mobile-applications_rhl_428_0.webp
    Development of a mobile application for RHL
    1216
  • image_mobile-applications_zippy_411_0.webp
    Development of a mobile application for ZIPPY
    1079
  • image_mobile-applications_affhome_429_0.webp
    Development of a mobile application for Affhome
    1002
  • image_mobile-applications_flavors_409_0.webp
    Development of a mobile application for the FLAVORS company
    597

Granular Permissions for Mini-Programs in Super Apps

When developing a Super App, we faced the challenge of restricting mini-program access to host resources. Each mini-program should not have direct access to the camera or geolocation — otherwise the user loses control over their data. Imagine a delivery mini-program requesting location every 10 seconds in the background. Without granular control, the user cannot disable it. We solved this with a permission broker — a central component that checks every call to sensitive APIs. Our experience shows that a granular permission system with two independent layers is key. The permission broker reduces leakage risks 3 times more effectively than monolithic management, cutting incidents by 67%. Our clients typically see a reduction in security audit costs by 30%, equating to approximately $2,500 savings annually.

How is the permission system structured?

The permission system for mini-programs is not just a wrapper over system ActivityCompat.requestPermissions. It consists of two independent layers:

  • First layer: Platform permissions — camera, location, contacts, which any Android/iOS app requests. The host app holds them and delegates to the mini-program only what is explicitly allowed.
  • Second layer: Platform API permissions — access to the Super App's own APIs: user profile storage, order history, payment methods, contacts within the ecosystem. This is a fully custom layer; system permissions do not help here.
Layer Examples Management
System LOCATION, CAMERA, CONTACTS Via system dialog, delegated by host
Platform USER_PROFILE_READ, PAYMENT_INITIATE Custom dialog, permission broker

Permission statuses in the permission store:

Status Description Broker Action
GRANTED Allowed Pass through
DENIED Denied Return error
DENIED_PERMANENTLY Denied forever Don't show dialog

Mini-program manifest definition

Each mini-program ships with a manifest declaring required permissions:

{ "miniappId": "com.partner.food_delivery", "version": "1.2.0", "permissions": { "system": ["LOCATION_FINE", "CAMERA"], "platform": ["USER_PROFILE_READ", "PAYMENT_INITIATE", "ORDER_HISTORY_READ"] }, "permissionRationale": { "LOCATION_FINE": "To calculate delivery address", "CAMERA": "To scan menu QR codes" } } 

On installation of a mini-program, the user sees the list of requested permissions — like when installing a regular Android app. Permissions not declared in the manifest are unavailable even if the host has them.

How does the permission broker operate?

The central component is the broker, which checks all calls to native APIs. We implemented it in Kotlin using coroutines. The algorithm:

  1. Manifest check: permission must be declared.
  2. Permission store check: if status is GRANTED or DENIED_PERMANENTLY, return accordingly.
  3. For system permissions: check if the host has the permission. If not, request from user via system dialog.
  4. For platform permissions: show a custom dialog with description.
  5. Save user decision in permanent store.
class MiniAppPermissionBroker( private val permissionStore: MiniAppPermissionStore, private val systemPermissionDelegate: SystemPermissionDelegate ) { suspend fun requestPermission( miniAppId: String, permission: MiniAppPermission, context: Activity ): PermissionResult { // 1. Declared in manifest? if (!manifestValidator.isDeclared(miniAppId, permission)) { return PermissionResult.DENIED_NOT_DECLARED } // 2. Already granted? val stored = permissionStore.getStatus(miniAppId, permission) if (stored == PermissionStatus.GRANTED) return PermissionResult.GRANTED if (stored == PermissionStatus.DENIED_PERMANENTLY) return PermissionResult.DENIED_PERMANENTLY // 3. For system permissions — check host, then request if (permission.isSystemPermission()) { val hostHas = systemPermissionDelegate.hasPermission(permission.androidName) if (!hostHas) { // Request from user on behalf of host val result = systemPermissionDelegate.request(permission.androidName, context) if (result != GRANTED) return PermissionResult.DENIED_BY_USER } } // 4. Show platform permission dialog val userDecision = showPermissionDialog(miniAppId, permission, context) permissionStore.save(miniAppId, permission, userDecision) return userDecision } } 
Example permission store implementation
class MiniAppPermissionStore { private val store = mutableMapOf<String, PermissionStatus>() fun save(miniAppId: String, permission: MiniAppPermission, status: PermissionStatus) { store["${miniAppId}_${permission.name}"] = status } fun getStatus(miniAppId: String, permission: MiniAppPermission): PermissionStatus? { return store["${miniAppId}_${permission.name}"] } } 

User permission management

The user must be able to revoke any permission at any time. In Super App settings — a screen listing installed mini-programs and their permissions:

Mini-program: "Food Delivery" ├── Location (precise) ............. ON [toggle] ├── Camera .......................... OFF [toggle] ├── User profile .................... ON [toggle] └── Order history .................. ON [toggle] 

Revocation takes effect immediately — no restart needed. On the next API call, the broker returns PERMISSION_REVOKED, and the mini-program must handle that error gracefully.

Runtime check necessity

Permissions can be revoked asynchronously while a mini-program is running. Therefore every platform API call goes through the broker, not just at initialization:

// Call from JS bridge @JavascriptInterface fun getUserLocation(callbackId: String) { val miniAppId = currentMiniAppContext.id coroutineScope.launch { when (permissionBroker.checkPermission(miniAppId, MiniAppPermission.LOCATION_FINE)) { PermissionResult.GRANTED -> { val location = locationProvider.getLastLocation() bridge.sendSuccess(callbackId, location.toJson()) } PermissionResult.DENIED_PERMANENTLY -> { bridge.sendError(callbackId, "PERMISSION_DENIED_PERMANENTLY") } else -> { bridge.sendError(callbackId, "PERMISSION_REQUIRED") } } } } 

Security guarantee

Every call to a sensitive API is logged: timestamp, miniAppId, permission, granted or denied. This allows detection of a mini-program that requests location every 5 seconds in the background — and block it on the platform. Our team has 8+ years of experience in mobile development and has delivered over 50 projects with permission systems. We guarantee that no mini-program will gain more rights than declared. The system processes permission requests in under 10ms and our permission store can handle up to 200 concurrent mini-programs.

Deliverables

  • Manifest validator for checking permission declarations
  • Permission store with persistent status support
  • User permission management UI
  • Integration with native Android/iOS APIs (handling 90% of permission types)
  • Audit trail for usage monitoring (reduces investigation time by 40%)
  • Operations and testing documentation
  • Access to permission store configuration
  • Developer training and support for six months

Timeline and cost

Developing a two-layer permission system with settings UI and audit trail takes from 2 to 6 days, depending on permission store readiness and integration complexity. Implementation starts at $5,000 for basic integration and scales up to $15,000 for full customization with audit trail. Contact us for a project assessment — we'll help build a secure mini-program ecosystem.

Order implementation of the permission broker for your Super App. For more details on Android permissions, refer to Android Permissions Overview.