Kontrak permission plugin diperkenalkan pada 2.3.73 dan diperketat pada 2.3.74. Plugin mendeklarasikan permission miliknya di plugin.json; Core memvalidasi lalu menyinkronkannya ke authorization dinamis.
Namespace dan route guard
Key harus lowercase dan berbentuk plugin.{nama-plugin}.{resource}.{action}. Nama provider harus sama dengan nama plugin. Route dashboard dapat mendeklarasikan permission; permission route tidak boleh berscope karena route tidak membawa konteks resource. roles tetap menjadi compatibility policy dan filter pengetatan.
{
"name": "example",
"permissions": [{
"key": "plugin.example.settings.access",
"label": "Access Example Settings",
"supports_scope": false,
"default_roles": ["admin"],
"delegable": true
}]
}
Default roles
default_roles hanya menerima Author, Editor, atau Administrator dan menyemai grant system role saat sinkronisasi. Bila permission menjaga route dan default tidak ditulis, Core menurunkannya dari compatibility roles. Bila keduanya ditulis, nilainya harus identik.
Delegability
delegable:true mengizinkan grant custom role dipertahankan. delegable:false membatasi assignment ke system role default dan sinkronisasi menghapus grant stale pada custom role. Ini berguna untuk operasi plugin yang tidak aman untuk didelegasikan.
Lifecycle dan fail closed
Plugin aktif disinkronkan setelah load dan sebelum admin_init. Permission plugin disabled tetap dikenal tetapi is_active=0; uninstall menghapus permission dan grant. Perubahan label/delegability dapat diperbarui, tetapi collision semantic provider/resource/action/scope menyebabkan rollback. Route permission belum dianggap siap bila sinkronisasi gagal.
Collision key, ownership, route Core, route plugin lain, atau kontrak invalid ditolak. ACL plugin adalah syarat tambahan: route tetap harus lolos Core guard, Site Owner policy bila dipakai, compatibility role filter, dan pemeriksaan permission. Tidak ada deklarasi plugin yang boleh melewati guard Core.