Page Not Found
We could not find what you were looking for.
Please contact the owner of the site that linked you to the original URL and let them know their link is broken.
diff --git a/404.html b/404.html index 4e78728..68674b9 100644 --- a/404.html +++ b/404.html @@ -2,17 +2,17 @@
- +We could not find what you were looking for.
Please contact the owner of the site that linked you to the original URL and let them know their link is broken.
We could not find what you were looking for.
Please contact the owner of the site that linked you to the original URL and let them know their link is broken.
LmcRbac\\Role\\InMemoryRoleProvider
",id:"lmcrbacroleinmemoryroleprovider",level:3},{value:"LmcRbac\\Role\\ObjectRepositoryRoleProvider
",id:"lmcrbacroleobjectrepositoryroleprovider",level:3},{value:"Creating custom role providers",id:"creating-custom-role-providers",level:2}];function d(e){const r={code:"code",h2:"h2",h3:"h3",p:"p",pre:"pre",...(0,i.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsxs)(r.p,{children:["A role provider is an object that returns a list of roles. A role provider must implement the\n",(0,n.jsx)(r.code,{children:"LmcRbac\\Role\\RoleProviderInterface"})," interface. The only required method is ",(0,n.jsx)(r.code,{children:"getRoles"}),", and must return an array\nof ",(0,n.jsx)(r.code,{children:"LmcRbac\\Role\\RoleInterface"})," objects."]}),"\n",(0,n.jsx)(r.p,{children:"Roles can come from one of many sources: in memory, from a file, from a database, etc. However, you can specify only one role provider per application."}),"\n",(0,n.jsx)(r.h2,{id:"built-in-role-providers",children:"Built-in role providers"}),"\n",(0,n.jsxs)(r.p,{children:["LmcRbac comes with two built-in role providers: ",(0,n.jsx)(r.code,{children:"LmcRbac\\Role\\InMemoryRoleProvider"})," and ",(0,n.jsx)(r.code,{children:"LmcRbac\\Role\\ObjectRepositoryRoleProvider"}),". A role\nprovider must be added to the ",(0,n.jsx)(r.code,{children:"role_provider"})," subkey in the configuration file:"]}),"\n",(0,n.jsx)(r.pre,{children:(0,n.jsx)(r.code,{className:"language-php",children:"return [\n 'lmc_rbac' => [\n 'role_provider' => [\n // Role provider config here!\n ]\n ]\n];\n"})}),"\n",(0,n.jsx)(r.h3,{id:"lmcrbacroleinmemoryroleprovider",children:(0,n.jsx)(r.code,{children:"LmcRbac\\Role\\InMemoryRoleProvider"})}),"\n",(0,n.jsx)(r.p,{children:"This provider is ideal for small/medium sites with few roles/permissions. All the data is specified in a simple associative array in a\nPHP file."}),"\n",(0,n.jsx)(r.p,{children:"Here is an example of the format you need to use:"}),"\n",(0,n.jsx)(r.pre,{children:(0,n.jsx)(r.code,{className:"language-php",children:"return [\n 'lmc_rbac' => [\n 'role_provider' => [\n 'LmcRbac\\Role\\InMemoryRoleProvider' => [\n 'admin' => [\n 'children' => ['member'],\n 'permissions' => ['article.delete']\n ],\n 'member' => [\n 'children' => ['guest'],\n 'permissions' => ['article.edit', 'article.archive']\n ],\n 'guest' => [\n 'permissions' => ['article.read']\n ],\n ],\n ],\n ],\n];\n"})}),"\n",(0,n.jsxs)(r.p,{children:["The ",(0,n.jsx)(r.code,{children:"children"})," and ",(0,n.jsx)(r.code,{children:"permissions"})," subkeys are entirely optional. Internally, the ",(0,n.jsx)(r.code,{children:"LmcRbac\\Role\\InMemoryRoleProvider"})," creates\neither a ",(0,n.jsx)(r.code,{children:"LmcRbac\\Role\\Role"})," object if the role does not have any children, or a ",(0,n.jsx)(r.code,{children:"LmcRbac\\Role\\HierarchicalRole"})," if\nthe role has at least one child."]}),"\n",(0,n.jsx)(r.p,{children:"If you are more confident with flat RBAC, the previous config can be re-written to remove any inheritence between roles:"}),"\n",(0,n.jsx)(r.pre,{children:(0,n.jsx)(r.code,{className:"language-php",children:"return [\n 'lmc_rbac' => [\n 'role_provider' => [\n 'LmcRbac\\Role\\InMemoryRoleProvider' => [\n 'admin' => [\n 'permissions' => [\n 'article.delete',\n 'article.edit',\n 'article.archive',\n 'article.read'\n ]\n ],\n 'member' => [\n 'permissions' => [\n 'article.edit',\n 'article.archive',\n 'article.read'\n ]\n ],\n 'guest' => [\n 'permissions' => ['article.read']\n ]\n ]\n ]\n ]\n];\n"})}),"\n",(0,n.jsx)(r.h3,{id:"lmcrbacroleobjectrepositoryroleprovider",children:(0,n.jsx)(r.code,{children:"LmcRbac\\Role\\ObjectRepositoryRoleProvider"})}),"\n",(0,n.jsxs)(r.p,{children:["This provider fetches roles from a database using ",(0,n.jsx)(r.code,{children:"Doctrine\\Common\\Persistence\\ObjectRepository"})," interface."]}),"\n",(0,n.jsxs)(r.p,{children:["You can configure this provider by giving an object repository service name that is fetched from the service manager\nusing the ",(0,n.jsx)(r.code,{children:"object_repository"})," key:"]}),"\n",(0,n.jsx)(r.pre,{children:(0,n.jsx)(r.code,{className:"language-php",children:"return [\n 'lmc_rbac' => [\n 'role_provider' => [\n 'LmcRbac\\Role\\ObjectRepositoryRoleProvider' => [\n 'object_repository' => 'App\\Repository\\RoleRepository',\n 'role_name_property' => 'name'\n ],\n ],\n ],\n];\n"})}),"\n",(0,n.jsxs)(r.p,{children:["Or you can specify the ",(0,n.jsx)(r.code,{children:"object_manager"})," and ",(0,n.jsx)(r.code,{children:"class_name"})," options:"]}),"\n",(0,n.jsx)(r.pre,{children:(0,n.jsx)(r.code,{className:"language-php",children:"return [\n 'lmc_rbac' => [\n 'role_provider' => [\n 'LmcRbac\\Role\\ObjectRepositoryRoleProvider' => [\n 'object_manager' => 'doctrine.entitymanager.orm_default',\n 'class_name' => 'App\\Entity\\Role',\n 'role_name_property' => 'name'\n ],\n ],\n ],\n];\n"})}),"\n",(0,n.jsxs)(r.p,{children:["In both cases, you need to specify the ",(0,n.jsx)(r.code,{children:"role_name_property"})," value, which is the name of the entity's property\nthat holds the actual role name. This is used internally to only load the identity roles, instead of loading\nthe whole table every time."]}),"\n",(0,n.jsxs)(r.p,{children:["Please note that your entity fetched from the table MUST implement the ",(0,n.jsx)(r.code,{children:"LmcRbac\\Role\\RoleInterface"})," interface."]}),"\n",(0,n.jsxs)(r.p,{children:["Sample ORM entity models are provided in the ",(0,n.jsx)(r.code,{children:"/data"})," folder for flat role, hierarchical role and permission."]}),"\n",(0,n.jsx)(r.h2,{id:"creating-custom-role-providers",children:"Creating custom role providers"}),"\n",(0,n.jsxs)(r.p,{children:["To create a custom role provider, you first need to create a class that implements the\n",(0,n.jsx)(r.code,{children:"LmcRbac\\Role\\RoleProviderInterface"})," interface."]}),"\n",(0,n.jsx)(r.p,{children:"Then, you need to add it to the role provider manager:"}),"\n",(0,n.jsx)(r.pre,{children:(0,n.jsx)(r.code,{className:"language-php",children:"return [\n 'lmc_rbac' => [\n 'role_provider' => [\n 'Application\\Role\\CustomRoleProvider' => [\n // Options\n ],\n ],\n ],\n];\n"})}),"\n",(0,n.jsx)(r.p,{children:"And the role provider is created using the service manager:"}),"\n",(0,n.jsx)(r.pre,{children:(0,n.jsx)(r.code,{className:"language-php",children:"return [\n 'service_manager' => [\n 'factories' => [\n 'Application\\Role\\CustomRoleProvider' => 'Application\\Factory\\CustomRoleProviderFactory'\n ],\n ],\n];\n"})})]})}function p(e={}){const{wrapper:r}={...(0,i.R)(),...e.components};return r?(0,n.jsx)(r,{...e,children:(0,n.jsx)(d,{...e})}):d(e)}},8453:(e,r,o)=>{o.d(r,{R:()=>t,x:()=>l});var n=o(6540);const i={},c=n.createContext(i);function t(e){const r=n.useContext(c);return n.useMemo((function(){return"function"==typeof e?e(r):{...r,...e}}),[r,e])}function l(e){let r;return r=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:t(e.components),n.createElement(c.Provider,{value:r},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/23a87c5d.cf52af67.js b/assets/js/23a87c5d.cf52af67.js
new file mode 100644
index 0000000..7e6fad0
--- /dev/null
+++ b/assets/js/23a87c5d.cf52af67.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[316],{6328:(t,e,n)=>{n.r(e),n.d(e,{assets:()=>m,contentTitle:()=>c,default:()=>u,frontMatter:()=>i,metadata:()=>s,toc:()=>r});var o=n(4848),a=n(8453);const i={slug:"new-documentation",title:"New documentation",authors:["ericr"],tags:["laminas","PHP","LmcRbac","authorization","LM-Commons"]},c=void 0,s={permalink:"/LmcRbac/blog/new-documentation",editUrl:"https://github.com/lm-commons/lmcrbac/tree/master/docs/blog/2024-04-11-New-documentation.md",source:"@site/blog/2024-04-11-New-documentation.md",title:"New documentation",description:"This the new documentation site dedicated to the LmcRbac module.",date:"2024-04-11T00:00:00.000Z",tags:[{inline:!0,label:"laminas",permalink:"/LmcRbac/blog/tags/laminas"},{inline:!0,label:"PHP",permalink:"/LmcRbac/blog/tags/php"},{inline:!0,label:"LmcRbac",permalink:"/LmcRbac/blog/tags/lmc-rbac"},{inline:!0,label:"authorization",permalink:"/LmcRbac/blog/tags/authorization"},{inline:!0,label:"LM-Commons",permalink:"/LmcRbac/blog/tags/lm-commons"}],readingTime:.11,hasTruncateMarker:!1,authors:[{name:"Eric Richer",title:"LM-Commons Administrator",url:"https://github.com/visto9259",imageURL:"https://github.com/visto9259.png",key:"ericr"}],frontMatter:{slug:"new-documentation",title:"New documentation",authors:["ericr"],tags:["laminas","PHP","LmcRbac","authorization","LM-Commons"]},unlisted:!1},m={authorsImageUrls:[void 0]},r=[];function l(t){const e={p:"p",...(0,a.R)(),...t.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(e.p,{children:"This the new documentation site dedicated to the LmcRbac module."}),"\n",(0,o.jsx)(e.p,{children:"There are no changes to the code, just improvements in the documentation."})]})}function u(t={}){const{wrapper:e}={...(0,a.R)(),...t.components};return e?(0,o.jsx)(e,{...t,children:(0,o.jsx)(l,{...t})}):l(t)}},8453:(t,e,n)=>{n.d(e,{R:()=>c,x:()=>s});var o=n(6540);const a={},i=o.createContext(a);function c(t){const e=o.useContext(i);return o.useMemo((function(){return"function"==typeof t?t(e):{...e,...t}}),[e,t])}function s(t){let e;return e=t.disableParentContext?"function"==typeof t.components?t.components(a):t.components||a:c(t.components),o.createElement(i.Provider,{value:e},t.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/23a87c5d.da8b391b.js b/assets/js/23a87c5d.da8b391b.js
deleted file mode 100644
index 175b3e4..0000000
--- a/assets/js/23a87c5d.da8b391b.js
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[316],{6328:(t,e,n)=>{n.r(e),n.d(e,{assets:()=>m,contentTitle:()=>s,default:()=>u,frontMatter:()=>c,metadata:()=>i,toc:()=>r});var o=n(4848),a=n(8453);const c={slug:"new-documentation",title:"New documentation",authors:["ericr"],tags:["laminas","PHP","LmcUser","authentication","LM-Commons"]},s=void 0,i={permalink:"/LmcRbac/blog/new-documentation",editUrl:"https://github.com/lm-commons/lmcrbac/tree/master/docs/blog/2024-04-11-New-documentation.md",source:"@site/blog/2024-04-11-New-documentation.md",title:"New documentation",description:"This the new documentation site dedicated to the LmcUser module.",date:"2024-04-11T00:00:00.000Z",tags:[{label:"laminas",permalink:"/LmcRbac/blog/tags/laminas"},{label:"PHP",permalink:"/LmcRbac/blog/tags/php"},{label:"LmcUser",permalink:"/LmcRbac/blog/tags/lmc-user"},{label:"authentication",permalink:"/LmcRbac/blog/tags/authentication"},{label:"LM-Commons",permalink:"/LmcRbac/blog/tags/lm-commons"}],readingTime:.11,hasTruncateMarker:!1,authors:[{name:"Eric Richer",title:"LM-Commons Administrator",url:"https://github.com/visto9259",imageURL:"https://github.com/visto9259.png",key:"ericr"}],frontMatter:{slug:"new-documentation",title:"New documentation",authors:["ericr"],tags:["laminas","PHP","LmcUser","authentication","LM-Commons"]},unlisted:!1},m={authorsImageUrls:[void 0]},r=[];function l(t){const e={p:"p",...(0,a.R)(),...t.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(e.p,{children:"This the new documentation site dedicated to the LmcUser module."}),"\n",(0,o.jsx)(e.p,{children:"There are no changes to the code, just improvements in the documentation."})]})}function u(t={}){const{wrapper:e}={...(0,a.R)(),...t.components};return e?(0,o.jsx)(e,{...t,children:(0,o.jsx)(l,{...t})}):l(t)}},8453:(t,e,n)=>{n.d(e,{R:()=>s,x:()=>i});var o=n(6540);const a={},c=o.createContext(a);function s(t){const e=o.useContext(c);return o.useMemo((function(){return"function"==typeof t?t(e):{...e,...t}}),[e,t])}function i(t){let e;return e=t.disableParentContext?"function"==typeof t.components?t.components(a):t.components||a:s(t.components),o.createElement(c.Provider,{value:e},t.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/242.8f375f31.js b/assets/js/242.8f375f31.js
new file mode 100644
index 0000000..26c8c8a
--- /dev/null
+++ b/assets/js/242.8f375f31.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[242],{6535:(e,t,a)=>{a.d(t,{A:()=>b});var s=a(6540),n=a(4164),r=a(781),l=a(4581),i=a(8774),o=a(1312),c=a(6347),d=a(9169);function m(e){const{pathname:t}=(0,c.zy)();return(0,s.useMemo)((()=>e.filter((e=>function(e,t){return!(e.unlisted&&!(0,d.ys)(e.permalink,t))}(e,t)))),[e,t])}const u={sidebar:"sidebar_re4s",sidebarItemTitle:"sidebarItemTitle_pO2u",sidebarItemList:"sidebarItemList_Yudw",sidebarItem:"sidebarItem__DBe",sidebarItemLink:"sidebarItemLink_mo7H",sidebarItemLinkActive:"sidebarItemLinkActive_I1ZP"};var h=a(4848);function g(e){let{sidebar:t}=e;const a=m(t.items);return(0,h.jsx)("aside",{className:"col col--3",children:(0,h.jsxs)("nav",{className:(0,n.A)(u.sidebar,"thin-scrollbar"),"aria-label":(0,o.T)({id:"theme.blog.sidebar.navAriaLabel",message:"Blog recent posts navigation",description:"The ARIA label for recent posts in the blog sidebar"}),children:[(0,h.jsx)("div",{className:(0,n.A)(u.sidebarItemTitle,"margin-bottom--md"),children:t.title}),(0,h.jsx)("ul",{className:(0,n.A)(u.sidebarItemList,"clean-list"),children:a.map((e=>(0,h.jsx)("li",{className:u.sidebarItem,children:(0,h.jsx)(i.A,{isNavLink:!0,to:e.permalink,className:u.sidebarItemLink,activeClassName:u.sidebarItemLinkActive,children:e.title})},e.permalink)))})]})})}var x=a(5600);function j(e){let{sidebar:t}=e;const a=m(t.items);return(0,h.jsx)("ul",{className:"menu__list",children:a.map((e=>(0,h.jsx)("li",{className:"menu__list-item",children:(0,h.jsx)(i.A,{isNavLink:!0,to:e.permalink,className:"menu__link",activeClassName:"menu__link--active",children:e.title})},e.permalink)))})}function p(e){return(0,h.jsx)(x.GX,{component:j,props:e})}function f(e){let{sidebar:t}=e;const a=(0,l.l)();return t?.items.length?"mobile"===a?(0,h.jsx)(p,{sidebar:t}):(0,h.jsx)(g,{sidebar:t}):null}function b(e){const{sidebar:t,toc:a,children:s,...l}=e,i=t&&t.items.length>0;return(0,h.jsx)(r.A,{...l,children:(0,h.jsx)("div",{className:"container margin-vert--lg",children:(0,h.jsxs)("div",{className:"row",children:[(0,h.jsx)(f,{sidebar:t}),(0,h.jsx)("main",{className:(0,n.A)("col",{"col--7":i,"col--9 col--offset-1":!i}),children:s}),a&&(0,h.jsx)("div",{className:"col col--2",children:a})]})})})}},4651:(e,t,a)=>{a.d(t,{A:()=>R});a(6540);var s=a(4164),n=a(7131),r=a(4848);function l(e){let{children:t,className:a}=e;return(0,r.jsx)("article",{className:a,children:t})}var i=a(8774);const o={title:"title_f1Hy"};function c(e){let{className:t}=e;const{metadata:a,isBlogPostPage:l}=(0,n.e)(),{permalink:c,title:d}=a,m=l?"h1":"h2";return(0,r.jsx)(m,{className:(0,s.A)(o.title,t),children:l?d:(0,r.jsx)(i.A,{to:c,children:d})})}var d=a(1312),m=a(5846),u=a(6266);const h={container:"container_mt6G"};function g(e){let{readingTime:t}=e;const a=function(){const{selectMessage:e}=(0,m.W)();return t=>{const a=Math.ceil(t);return e(a,(0,d.T)({id:"theme.blog.post.readingTime.plurals",description:'Pluralized label for "{readingTime} min read". Use as much plural forms (separated by "|") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)',message:"One min read|{readingTime} min read"},{readingTime:a}))}}();return(0,r.jsx)(r.Fragment,{children:a(t)})}function x(e){let{date:t,formattedDate:a}=e;return(0,r.jsx)("time",{dateTime:t,children:a})}function j(){return(0,r.jsx)(r.Fragment,{children:" \xb7 "})}function p(e){let{className:t}=e;const{metadata:a}=(0,n.e)(),{date:l,readingTime:i}=a,o=(0,u.i)({day:"numeric",month:"long",year:"numeric",timeZone:"UTC"});return(0,r.jsxs)("div",{className:(0,s.A)(h.container,"margin-vert--md",t),children:[(0,r.jsx)(x,{date:l,formattedDate:(c=l,o.format(new Date(c)))}),void 0!==i&&(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(j,{}),(0,r.jsx)(g,{readingTime:i})]})]});var c}function f(e){return e.href?(0,r.jsx)(i.A,{...e}):(0,r.jsx)(r.Fragment,{children:e.children})}function b(e){let{author:t,className:a}=e;const{name:n,title:l,url:i,imageURL:o,email:c}=t,d=i||c&&`mailto:${c}`||void 0;return(0,r.jsxs)("div",{className:(0,s.A)("avatar margin-bottom--sm",a),children:[o&&(0,r.jsx)(f,{href:d,className:"avatar__photo-link",children:(0,r.jsx)("img",{className:"avatar__photo",src:o,alt:n})}),n&&(0,r.jsxs)("div",{className:"avatar__intro",children:[(0,r.jsx)("div",{className:"avatar__name",children:(0,r.jsx)(f,{href:d,children:(0,r.jsx)("span",{children:n})})}),l&&(0,r.jsx)("small",{className:"avatar__subtitle",children:l})]})]})}const v={authorCol:"authorCol_Hf19",imageOnlyAuthorRow:"imageOnlyAuthorRow_pa_O",imageOnlyAuthorCol:"imageOnlyAuthorCol_G86a"};function A(e){let{className:t}=e;const{metadata:{authors:a},assets:l}=(0,n.e)();if(0===a.length)return null;const i=a.every((e=>{let{name:t}=e;return!t}));return(0,r.jsx)("div",{className:(0,s.A)("margin-top--md margin-bottom--sm",i?v.imageOnlyAuthorRow:"row",t),children:a.map(((e,t)=>(0,r.jsx)("div",{className:(0,s.A)(!i&&"col col--6",i?v.imageOnlyAuthorCol:v.authorCol),children:(0,r.jsx)(b,{author:{...e,imageURL:l.authorsImageUrls[t]??e.imageURL}})},t)))})}function N(){return(0,r.jsxs)("header",{children:[(0,r.jsx)(c,{}),(0,r.jsx)(p,{}),(0,r.jsx)(A,{})]})}var _=a(440),k=a(5533);function P(e){let{children:t,className:a}=e;const{isBlogPostPage:l}=(0,n.e)();return(0,r.jsx)("div",{id:l?_.blogPostContainerID:void 0,className:(0,s.A)("markdown",a),children:(0,r.jsx)(k.A,{children:t})})}var w=a(7559),T=a(4336),I=a(2053);function L(){return(0,r.jsx)("b",{children:(0,r.jsx)(d.A,{id:"theme.blog.post.readMore",description:"The label used in blog post item excerpts to link to full blog posts",children:"Read More"})})}function y(e){const{blogPostTitle:t,...a}=e;return(0,r.jsx)(i.A,{"aria-label":(0,d.T)({message:"Read more about {title}",id:"theme.blog.post.readMoreLabel",description:"The ARIA label for the link to full blog posts from excerpts"},{title:t}),...a,children:(0,r.jsx)(L,{})})}function C(){const{metadata:e,isBlogPostPage:t}=(0,n.e)(),{tags:a,title:l,editUrl:i,hasTruncateMarker:o,lastUpdatedBy:c,lastUpdatedAt:d}=e,m=!t&&o,u=a.length>0;if(!(u||m||i))return null;if(t){const e=!!(i||d||c);return(0,r.jsxs)("footer",{className:"docusaurus-mt-lg",children:[u&&(0,r.jsx)("div",{className:(0,s.A)("row","margin-top--sm",w.G.blog.blogFooterEditMetaRow),children:(0,r.jsx)("div",{className:"col",children:(0,r.jsx)(I.A,{tags:a})})}),e&&(0,r.jsx)(T.A,{className:(0,s.A)("margin-top--sm",w.G.blog.blogFooterEditMetaRow),editUrl:i,lastUpdatedAt:d,lastUpdatedBy:c})]})}return(0,r.jsxs)("footer",{className:"row docusaurus-mt-lg",children:[u&&(0,r.jsx)("div",{className:(0,s.A)("col",{"col--9":m}),children:(0,r.jsx)(I.A,{tags:a})}),m&&(0,r.jsx)("div",{className:(0,s.A)("col text--right",{"col--3":u}),children:(0,r.jsx)(y,{blogPostTitle:l,to:e.permalink})})]})}function R(e){let{children:t,className:a}=e;const i=function(){const{isBlogPostPage:e}=(0,n.e)();return e?void 0:"margin-bottom--xl"}();return(0,r.jsxs)(l,{className:(0,s.A)(i,a),children:[(0,r.jsx)(N,{}),(0,r.jsx)(P,{children:t}),(0,r.jsx)(C,{})]})}},9022:(e,t,a)=>{a.d(t,{A:()=>l});a(6540);var s=a(4164),n=a(8774),r=a(4848);function l(e){const{permalink:t,title:a,subLabel:l,isNext:i}=e;return(0,r.jsxs)(n.A,{className:(0,s.A)("pagination-nav__link",i?"pagination-nav__link--next":"pagination-nav__link--prev"),to:t,children:[l&&(0,r.jsx)("div",{className:"pagination-nav__sublabel",children:l}),(0,r.jsx)("div",{className:"pagination-nav__label",children:a})]})}},6133:(e,t,a)=>{a.d(t,{A:()=>i});a(6540);var s=a(4164),n=a(8774);const r={tag:"tag_zVej",tagRegular:"tagRegular_sFm0",tagWithCount:"tagWithCount_h2kH"};var l=a(4848);function i(e){let{permalink:t,label:a,count:i,description:o}=e;return(0,l.jsxs)(n.A,{href:t,title:o,className:(0,s.A)(r.tag,i?r.tagWithCount:r.tagRegular),children:[a,i&&(0,l.jsx)("span",{children:i})]})}},2053:(e,t,a)=>{a.d(t,{A:()=>o});a(6540);var s=a(4164),n=a(1312),r=a(6133);const l={tags:"tags_jXut",tag:"tag_QGVx"};var i=a(4848);function o(e){let{tags:t}=e;return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)("b",{children:(0,i.jsx)(n.A,{id:"theme.tags.tagsListLabel",description:"The label alongside a tag list",children:"Tags:"})}),(0,i.jsx)("ul",{className:(0,s.A)(l.tags,"padding--none","margin-left--sm"),children:t.map((e=>(0,i.jsx)("li",{className:l.tag,children:(0,i.jsx)(r.A,{...e})},e.permalink)))})]})}},7131:(e,t,a)=>{a.d(t,{e:()=>o,i:()=>i});var s=a(6540),n=a(9532),r=a(4848);const l=s.createContext(null);function i(e){let{children:t,content:a,isBlogPostPage:n=!1}=e;const i=function(e){let{content:t,isBlogPostPage:a}=e;return(0,s.useMemo)((()=>({metadata:t.metadata,frontMatter:t.frontMatter,assets:t.assets,toc:t.toc,isBlogPostPage:a})),[t,a])}({content:a,isBlogPostPage:n});return(0,r.jsx)(l.Provider,{value:i,children:t})}function o(){const e=(0,s.useContext)(l);if(null===e)throw new n.dV("BlogPostProvider");return e}},5846:(e,t,a)=>{a.d(t,{W:()=>c});var s=a(6540),n=a(4586);const r=["zero","one","two","few","many","other"];function l(e){return r.filter((t=>e.includes(t)))}const i={locale:"en",pluralForms:l(["one","other"]),select:e=>1===e?"one":"other"};function o(){const{i18n:{currentLocale:e}}=(0,n.A)();return(0,s.useMemo)((()=>{try{return function(e){const t=new Intl.PluralRules(e);return{locale:e,pluralForms:l(t.resolvedOptions().pluralCategories),select:e=>t.select(e)}}(e)}catch(t){return console.error(`Failed to use Intl.PluralRules for locale "${e}".\nDocusaurus will fallback to the default (English) implementation.\nError: ${t.message}\n`),i}}),[e])}function c(){const e=o();return{selectMessage:(t,a)=>function(e,t,a){const s=e.split("|");if(1===s.length)return s[0];s.length>a.pluralForms.length&&console.error(`For locale=${a.locale}, a maximum of ${a.pluralForms.length} plural forms are expected (${a.pluralForms.join(",")}), but the message contains ${s.length}: ${e}`);const n=a.select(t),r=a.pluralForms.indexOf(n);return s[Math.min(r,s.length-1)]}(a,t,e)}}}}]);
\ No newline at end of file
diff --git a/assets/js/242.99b9aa30.js b/assets/js/242.99b9aa30.js
deleted file mode 100644
index ff0f3f0..0000000
--- a/assets/js/242.99b9aa30.js
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[242],{6535:(e,t,a)=>{a.d(t,{A:()=>f});var s=a(6540),n=a(4164),l=a(781),r=a(4581),i=a(8774),o=a(1312),c=a(6347),m=a(9169);function d(e){const{pathname:t}=(0,c.zy)();return(0,s.useMemo)((()=>e.filter((e=>function(e,t){return!(e.unlisted&&!(0,m.ys)(e.permalink,t))}(e,t)))),[e,t])}const u={sidebar:"sidebar_re4s",sidebarItemTitle:"sidebarItemTitle_pO2u",sidebarItemList:"sidebarItemList_Yudw",sidebarItem:"sidebarItem__DBe",sidebarItemLink:"sidebarItemLink_mo7H",sidebarItemLinkActive:"sidebarItemLinkActive_I1ZP"};var h=a(4848);function g(e){let{sidebar:t}=e;const a=d(t.items);return(0,h.jsx)("aside",{className:"col col--3",children:(0,h.jsxs)("nav",{className:(0,n.A)(u.sidebar,"thin-scrollbar"),"aria-label":(0,o.T)({id:"theme.blog.sidebar.navAriaLabel",message:"Blog recent posts navigation",description:"The ARIA label for recent posts in the blog sidebar"}),children:[(0,h.jsx)("div",{className:(0,n.A)(u.sidebarItemTitle,"margin-bottom--md"),children:t.title}),(0,h.jsx)("ul",{className:(0,n.A)(u.sidebarItemList,"clean-list"),children:a.map((e=>(0,h.jsx)("li",{className:u.sidebarItem,children:(0,h.jsx)(i.A,{isNavLink:!0,to:e.permalink,className:u.sidebarItemLink,activeClassName:u.sidebarItemLinkActive,children:e.title})},e.permalink)))})]})})}var x=a(5600);function j(e){let{sidebar:t}=e;const a=d(t.items);return(0,h.jsx)("ul",{className:"menu__list",children:a.map((e=>(0,h.jsx)("li",{className:"menu__list-item",children:(0,h.jsx)(i.A,{isNavLink:!0,to:e.permalink,className:"menu__link",activeClassName:"menu__link--active",children:e.title})},e.permalink)))})}function p(e){return(0,h.jsx)(x.GX,{component:j,props:e})}function b(e){let{sidebar:t}=e;const a=(0,r.l)();return t?.items.length?"mobile"===a?(0,h.jsx)(p,{sidebar:t}):(0,h.jsx)(g,{sidebar:t}):null}function f(e){const{sidebar:t,toc:a,children:s,...r}=e,i=t&&t.items.length>0;return(0,h.jsx)(l.A,{...r,children:(0,h.jsx)("div",{className:"container margin-vert--lg",children:(0,h.jsxs)("div",{className:"row",children:[(0,h.jsx)(b,{sidebar:t}),(0,h.jsx)("main",{className:(0,n.A)("col",{"col--7":i,"col--9 col--offset-1":!i}),children:s}),a&&(0,h.jsx)("div",{className:"col col--2",children:a})]})})})}},4651:(e,t,a)=>{a.d(t,{A:()=>R});a(6540);var s=a(4164),n=a(7131),l=a(4848);function r(e){let{children:t,className:a}=e;return(0,l.jsx)("article",{className:a,children:t})}var i=a(8774);const o={title:"title_f1Hy"};function c(e){let{className:t}=e;const{metadata:a,isBlogPostPage:r}=(0,n.e)(),{permalink:c,title:m}=a,d=r?"h1":"h2";return(0,l.jsx)(d,{className:(0,s.A)(o.title,t),children:r?m:(0,l.jsx)(i.A,{to:c,children:m})})}var m=a(1312),d=a(5846),u=a(6266);const h={container:"container_mt6G"};function g(e){let{readingTime:t}=e;const a=function(){const{selectMessage:e}=(0,d.W)();return t=>{const a=Math.ceil(t);return e(a,(0,m.T)({id:"theme.blog.post.readingTime.plurals",description:'Pluralized label for "{readingTime} min read". Use as much plural forms (separated by "|") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)',message:"One min read|{readingTime} min read"},{readingTime:a}))}}();return(0,l.jsx)(l.Fragment,{children:a(t)})}function x(e){let{date:t,formattedDate:a}=e;return(0,l.jsx)("time",{dateTime:t,children:a})}function j(){return(0,l.jsx)(l.Fragment,{children:" \xb7 "})}function p(e){let{className:t}=e;const{metadata:a}=(0,n.e)(),{date:r,readingTime:i}=a,o=(0,u.i)({day:"numeric",month:"long",year:"numeric",timeZone:"UTC"});return(0,l.jsxs)("div",{className:(0,s.A)(h.container,"margin-vert--md",t),children:[(0,l.jsx)(x,{date:r,formattedDate:(c=r,o.format(new Date(c)))}),void 0!==i&&(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(j,{}),(0,l.jsx)(g,{readingTime:i})]})]});var c}function b(e){return e.href?(0,l.jsx)(i.A,{...e}):(0,l.jsx)(l.Fragment,{children:e.children})}function f(e){let{author:t,className:a}=e;const{name:n,title:r,url:i,imageURL:o,email:c}=t,m=i||c&&`mailto:${c}`||void 0;return(0,l.jsxs)("div",{className:(0,s.A)("avatar margin-bottom--sm",a),children:[o&&(0,l.jsx)(b,{href:m,className:"avatar__photo-link",children:(0,l.jsx)("img",{className:"avatar__photo",src:o,alt:n})}),n&&(0,l.jsxs)("div",{className:"avatar__intro",children:[(0,l.jsx)("div",{className:"avatar__name",children:(0,l.jsx)(b,{href:m,children:(0,l.jsx)("span",{children:n})})}),r&&(0,l.jsx)("small",{className:"avatar__subtitle",children:r})]})]})}const v={authorCol:"authorCol_Hf19",imageOnlyAuthorRow:"imageOnlyAuthorRow_pa_O",imageOnlyAuthorCol:"imageOnlyAuthorCol_G86a"};function A(e){let{className:t}=e;const{metadata:{authors:a},assets:r}=(0,n.e)();if(0===a.length)return null;const i=a.every((e=>{let{name:t}=e;return!t}));return(0,l.jsx)("div",{className:(0,s.A)("margin-top--md margin-bottom--sm",i?v.imageOnlyAuthorRow:"row",t),children:a.map(((e,t)=>(0,l.jsx)("div",{className:(0,s.A)(!i&&"col col--6",i?v.imageOnlyAuthorCol:v.authorCol),children:(0,l.jsx)(f,{author:{...e,imageURL:r.authorsImageUrls[t]??e.imageURL}})},t)))})}function N(){return(0,l.jsxs)("header",{children:[(0,l.jsx)(c,{}),(0,l.jsx)(p,{}),(0,l.jsx)(A,{})]})}var _=a(440),k=a(5533);function P(e){let{children:t,className:a}=e;const{isBlogPostPage:r}=(0,n.e)();return(0,l.jsx)("div",{id:r?_.blogPostContainerID:void 0,className:(0,s.A)("markdown",a),children:(0,l.jsx)(k.A,{children:t})})}var w=a(7559),T=a(4336),I=a(2053);function L(){return(0,l.jsx)("b",{children:(0,l.jsx)(m.A,{id:"theme.blog.post.readMore",description:"The label used in blog post item excerpts to link to full blog posts",children:"Read More"})})}function y(e){const{blogPostTitle:t,...a}=e;return(0,l.jsx)(i.A,{"aria-label":(0,m.T)({message:"Read more about {title}",id:"theme.blog.post.readMoreLabel",description:"The ARIA label for the link to full blog posts from excerpts"},{title:t}),...a,children:(0,l.jsx)(L,{})})}function C(){const{metadata:e,isBlogPostPage:t}=(0,n.e)(),{tags:a,title:r,editUrl:i,hasTruncateMarker:o,lastUpdatedBy:c,lastUpdatedAt:m}=e,d=!t&&o,u=a.length>0;if(!(u||d||i))return null;if(t){const e=!!(i||m||c);return(0,l.jsxs)("footer",{className:"docusaurus-mt-lg",children:[u&&(0,l.jsx)("div",{className:(0,s.A)("row","margin-top--sm",w.G.blog.blogFooterEditMetaRow),children:(0,l.jsx)("div",{className:"col",children:(0,l.jsx)(I.A,{tags:a})})}),e&&(0,l.jsx)(T.A,{className:(0,s.A)("margin-top--sm",w.G.blog.blogFooterEditMetaRow),editUrl:i,lastUpdatedAt:m,lastUpdatedBy:c})]})}return(0,l.jsxs)("footer",{className:"row docusaurus-mt-lg",children:[u&&(0,l.jsx)("div",{className:(0,s.A)("col",{"col--9":d}),children:(0,l.jsx)(I.A,{tags:a})}),d&&(0,l.jsx)("div",{className:(0,s.A)("col text--right",{"col--3":u}),children:(0,l.jsx)(y,{blogPostTitle:r,to:e.permalink})})]})}function R(e){let{children:t,className:a}=e;const i=function(){const{isBlogPostPage:e}=(0,n.e)();return e?void 0:"margin-bottom--xl"}();return(0,l.jsxs)(r,{className:(0,s.A)(i,a),children:[(0,l.jsx)(N,{}),(0,l.jsx)(P,{children:t}),(0,l.jsx)(C,{})]})}},9022:(e,t,a)=>{a.d(t,{A:()=>r});a(6540);var s=a(4164),n=a(8774),l=a(4848);function r(e){const{permalink:t,title:a,subLabel:r,isNext:i}=e;return(0,l.jsxs)(n.A,{className:(0,s.A)("pagination-nav__link",i?"pagination-nav__link--next":"pagination-nav__link--prev"),to:t,children:[r&&(0,l.jsx)("div",{className:"pagination-nav__sublabel",children:r}),(0,l.jsx)("div",{className:"pagination-nav__label",children:a})]})}},6133:(e,t,a)=>{a.d(t,{A:()=>i});a(6540);var s=a(4164),n=a(8774);const l={tag:"tag_zVej",tagRegular:"tagRegular_sFm0",tagWithCount:"tagWithCount_h2kH"};var r=a(4848);function i(e){let{permalink:t,label:a,count:i}=e;return(0,r.jsxs)(n.A,{href:t,className:(0,s.A)(l.tag,i?l.tagWithCount:l.tagRegular),children:[a,i&&(0,r.jsx)("span",{children:i})]})}},2053:(e,t,a)=>{a.d(t,{A:()=>o});a(6540);var s=a(4164),n=a(1312),l=a(6133);const r={tags:"tags_jXut",tag:"tag_QGVx"};var i=a(4848);function o(e){let{tags:t}=e;return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)("b",{children:(0,i.jsx)(n.A,{id:"theme.tags.tagsListLabel",description:"The label alongside a tag list",children:"Tags:"})}),(0,i.jsx)("ul",{className:(0,s.A)(r.tags,"padding--none","margin-left--sm"),children:t.map((e=>{let{label:t,permalink:a}=e;return(0,i.jsx)("li",{className:r.tag,children:(0,i.jsx)(l.A,{label:t,permalink:a})},a)}))})]})}},7131:(e,t,a)=>{a.d(t,{e:()=>o,i:()=>i});var s=a(6540),n=a(9532),l=a(4848);const r=s.createContext(null);function i(e){let{children:t,content:a,isBlogPostPage:n=!1}=e;const i=function(e){let{content:t,isBlogPostPage:a}=e;return(0,s.useMemo)((()=>({metadata:t.metadata,frontMatter:t.frontMatter,assets:t.assets,toc:t.toc,isBlogPostPage:a})),[t,a])}({content:a,isBlogPostPage:n});return(0,l.jsx)(r.Provider,{value:i,children:t})}function o(){const e=(0,s.useContext)(r);if(null===e)throw new n.dV("BlogPostProvider");return e}},5846:(e,t,a)=>{a.d(t,{W:()=>c});var s=a(6540),n=a(4586);const l=["zero","one","two","few","many","other"];function r(e){return l.filter((t=>e.includes(t)))}const i={locale:"en",pluralForms:r(["one","other"]),select:e=>1===e?"one":"other"};function o(){const{i18n:{currentLocale:e}}=(0,n.A)();return(0,s.useMemo)((()=>{try{return function(e){const t=new Intl.PluralRules(e);return{locale:e,pluralForms:r(t.resolvedOptions().pluralCategories),select:e=>t.select(e)}}(e)}catch(t){return console.error(`Failed to use Intl.PluralRules for locale "${e}".\nDocusaurus will fallback to the default (English) implementation.\nError: ${t.message}\n`),i}}),[e])}function c(){const e=o();return{selectMessage:(t,a)=>function(e,t,a){const s=e.split("|");if(1===s.length)return s[0];s.length>a.pluralForms.length&&console.error(`For locale=${a.locale}, a maximum of ${a.pluralForms.length} plural forms are expected (${a.pluralForms.join(",")}), but the message contains ${s.length}: ${e}`);const n=a.select(t),l=a.pluralForms.indexOf(n);return s[Math.min(l,s.length-1)]}(a,t,e)}}}}]);
\ No newline at end of file
diff --git a/assets/js/295b567d.3992908d.js b/assets/js/295b567d.3992908d.js
new file mode 100644
index 0000000..4d8c886
--- /dev/null
+++ b/assets/js/295b567d.3992908d.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[549],{5721:(e,n,o)=>{o.r(n),o.d(n,{assets:()=>a,contentTitle:()=>r,default:()=>m,frontMatter:()=>t,metadata:()=>s,toc:()=>d});var i=o(4848),c=o(8453);const t={sidebar_label:"Migration Guide",sidebar_position:8,title:"Migration Guide"},r=void 0,s={id:"migration",title:"Migration Guide",description:"Migrating from ZF-Commons RBAC v3",source:"@site/docs/migration.md",sourceDirName:".",slug:"/migration",permalink:"/LmcRbac/docs/migration",draft:!1,unlisted:!1,editUrl:"https://github.com/lm-commons/lmcrbac/tree/master/docs/docs/migration.md",tags:[],version:"current",sidebarPosition:8,frontMatter:{sidebar_label:"Migration Guide",sidebar_position:8,title:"Migration Guide"},sidebar:"documentationSidebar",previous:{title:"Configuration",permalink:"/LmcRbac/docs/configuration"}},a={},d=[{value:"Migrating from ZF-Commons RBAC v3",id:"migrating-from-zf-commons-rbac-v3",level:2}];function l(e){const n={a:"a",code:"code",h2:"h2",li:"li",p:"p",ul:"ul",...(0,c.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.h2,{id:"migrating-from-zf-commons-rbac-v3",children:"Migrating from ZF-Commons RBAC v3"}),"\n",(0,i.jsx)(n.p,{children:"The ZF-Commons Rbac was created for the Zend Framework. When the Zend Framework was migrated to\nthe Laminas project, the LM-Commons organization was created to provide components formerly provided by ZF-Commons."}),"\n",(0,i.jsx)(n.p,{children:"When ZfcRbac was moved to LM-Commons, it was split into two repositories:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.a,{href:"https://github.com/LM-Commons/LmcRbacMvc",children:"LmcRbacMvc"})," contains the old version 2 of ZfcRbac."]}),"\n",(0,i.jsx)(n.li,{children:"LmcRbac contains the version 3 of ZfcRbac, which was only released as v3.alpha.1."}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"To upgrade"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["Uninstall ",(0,i.jsx)(n.code,{children:"zf-commons/zfc-rbac:3.0.0-alpha.1"}),"."]}),"\n",(0,i.jsxs)(n.li,{children:["Install ",(0,i.jsx)(n.code,{children:"lm-commons/lmc-rbac:~1.0"})]}),"\n",(0,i.jsxs)(n.li,{children:["Change ",(0,i.jsx)(n.code,{children:"zfc-rbac.global.php"})," to ",(0,i.jsx)(n.code,{children:"lmcrbac.global.php"})," and update the key ",(0,i.jsx)(n.code,{children:"zfc_rbac"})," to ",(0,i.jsx)(n.code,{children:"lmc_rbac"}),"."]}),"\n",(0,i.jsxs)(n.li,{children:["Review your code for usages of the ",(0,i.jsx)(n.code,{children:"ZfcRbac/*"})," namespace to ",(0,i.jsx)(n.code,{children:"LmcRbac/*"})," namespace."]}),"\n"]})]})}function m(e={}){const{wrapper:n}={...(0,c.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(l,{...e})}):l(e)}},8453:(e,n,o)=>{o.d(n,{R:()=>r,x:()=>s});var i=o(6540);const c={},t=i.createContext(c);function r(e){const n=i.useContext(t);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function s(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(c):e.components||c:r(e.components),i.createElement(t.Provider,{value:n},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/393be207.af3ff5fe.js b/assets/js/393be207.af3ff5fe.js
new file mode 100644
index 0000000..54506d5
--- /dev/null
+++ b/assets/js/393be207.af3ff5fe.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[134],{633:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>p,contentTitle:()=>s,default:()=>l,frontMatter:()=>r,metadata:()=>c,toc:()=>d});var o=t(4848),a=t(8453);const r={title:"Markdown page example"},s="Markdown page example",c={type:"mdx",permalink:"/LmcRbac/markdown-page",source:"@site/src/pages/markdown-page.md",title:"Markdown page example",description:"You don't need React to write simple standalone pages.",frontMatter:{title:"Markdown page example"},unlisted:!1},p={},d=[];function i(e){const n={h1:"h1",p:"p",...(0,a.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.h1,{id:"markdown-page-example",children:"Markdown page example"}),"\n",(0,o.jsx)(n.p,{children:"You don't need React to write simple standalone pages."})]})}function l(e={}){const{wrapper:n}={...(0,a.R)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(i,{...e})}):i(e)}},8453:(e,n,t)=>{t.d(n,{R:()=>s,x:()=>c});var o=t(6540);const a={},r=o.createContext(a);function s(e){const n=o.useContext(r);return o.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:s(e.components),o.createElement(r.Provider,{value:n},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/393be207.cbddf48b.js b/assets/js/393be207.cbddf48b.js
deleted file mode 100644
index 9357221..0000000
--- a/assets/js/393be207.cbddf48b.js
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[134],{6602:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>p,contentTitle:()=>s,default:()=>l,frontMatter:()=>r,metadata:()=>c,toc:()=>d});var o=t(4848),a=t(8453);const r={title:"Markdown page example"},s="Markdown page example",c={type:"mdx",permalink:"/LmcRbac/markdown-page",source:"@site/src/pages/markdown-page.md",title:"Markdown page example",description:"You don't need React to write simple standalone pages.",frontMatter:{title:"Markdown page example"},unlisted:!1},p={},d=[];function i(e){const n={h1:"h1",p:"p",...(0,a.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.h1,{id:"markdown-page-example",children:"Markdown page example"}),"\n",(0,o.jsx)(n.p,{children:"You don't need React to write simple standalone pages."})]})}function l(e={}){const{wrapper:n}={...(0,a.R)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(i,{...e})}):i(e)}},8453:(e,n,t)=>{t.d(n,{R:()=>s,x:()=>c});var o=t(6540);const a={},r=o.createContext(a);function s(e){const n=o.useContext(r);return o.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:s(e.components),o.createElement(r.Provider,{value:n},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/3b8c55ea.803b7b00.js b/assets/js/3b8c55ea.803b7b00.js
deleted file mode 100644
index 9b305ab..0000000
--- a/assets/js/3b8c55ea.803b7b00.js
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[803],{3668:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>l,contentTitle:()=>a,default:()=>u,frontMatter:()=>s,metadata:()=>r,toc:()=>c});var o=t(4848),i=t(8453);const s={sidebar_label:"Requirements and Installation",sidebar_position:2},a="Requirements and Installation",r={id:"installation",title:"Requirements and Installation",description:"Requirements",source:"@site/docs/installation.md",sourceDirName:".",slug:"/installation",permalink:"/LmcRbac/docs/installation",draft:!1,unlisted:!1,editUrl:"https://github.com/lm-commons/lmcrbac/tree/master/docs/docs/installation.md",tags:[],version:"current",sidebarPosition:2,frontMatter:{sidebar_label:"Requirements and Installation",sidebar_position:2},sidebar:"documentationSidebar",previous:{title:"Introduction",permalink:"/LmcRbac/docs/introduction"}},l={},c=[{value:"Requirements",id:"requirements",level:2},{value:"Installation",id:"installation",level:2}];function d(e){const n={a:"a",code:"code",h1:"h1",h2:"h2",li:"li",p:"p",pre:"pre",ul:"ul",...(0,i.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.h1,{id:"requirements-and-installation",children:"Requirements and Installation"}),"\n",(0,o.jsx)(n.h2,{id:"requirements",children:"Requirements"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsx)(n.li,{children:"PHP 7.3 or higher"}),"\n"]}),"\n",(0,o.jsx)(n.h2,{id:"installation",children:"Installation"}),"\n",(0,o.jsxs)(n.p,{children:["LmcRbac only officially supports installation through Composer. For Composer documentation, please refer to\n",(0,o.jsx)(n.a,{href:"http://getcomposer.org/",children:"getcomposer.org"}),"."]}),"\n",(0,o.jsx)(n.p,{children:"Install the module:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-sh",children:"$ composer require lm-commons/lmc-rbac\n"})}),"\n",(0,o.jsxs)(n.p,{children:["Enable the module by adding ",(0,o.jsx)(n.code,{children:"LmcRbac"})," key to your ",(0,o.jsx)(n.code,{children:"application.config.php"})," file. Customize the module by copy-pasting\nthe ",(0,o.jsx)(n.code,{children:"config.global.php"})," file to your ",(0,o.jsx)(n.code,{children:"config/autoload"})," folder."]}),"\n",(0,o.jsxs)(n.p,{children:["You can also find some Doctrine entities in the ",(0,o.jsx)(n.a,{href:"https://github.com/LM-Commons/LmcRbac/tree/master/data",children:"data"})," folder that will help you to more quickly take advantage\nof LmcRbac."]})]})}function u(e={}){const{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(d,{...e})}):d(e)}},8453:(e,n,t)=>{t.d(n,{R:()=>a,x:()=>r});var o=t(6540);const i={},s=o.createContext(i);function a(e){const n=o.useContext(s);return o.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function r(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:a(e.components),o.createElement(s.Provider,{value:n},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/3d87926a.460c4f67.js b/assets/js/3d87926a.460c4f67.js
new file mode 100644
index 0000000..e0153b9
--- /dev/null
+++ b/assets/js/3d87926a.460c4f67.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[167],{7452:(t,e,n)=>{n.r(e),n.d(e,{assets:()=>m,contentTitle:()=>c,default:()=>u,frontMatter:()=>i,metadata:()=>s,toc:()=>r});var o=n(4848),a=n(8453);const i={slug:"new-documentation",title:"New documentation",authors:["ericr"],tags:["laminas","PHP","LmcRbac","authorization","LM-Commons"]},c=void 0,s={permalink:"/LmcRbac/blog/new-documentation",editUrl:"https://github.com/lm-commons/lmcrbac/tree/master/docs/blog/2024-04-11-New-documentation.md",source:"@site/blog/2024-04-11-New-documentation.md",title:"New documentation",description:"This the new documentation site dedicated to the LmcRbac module.",date:"2024-04-11T00:00:00.000Z",tags:[{inline:!0,label:"laminas",permalink:"/LmcRbac/blog/tags/laminas"},{inline:!0,label:"PHP",permalink:"/LmcRbac/blog/tags/php"},{inline:!0,label:"LmcRbac",permalink:"/LmcRbac/blog/tags/lmc-rbac"},{inline:!0,label:"authorization",permalink:"/LmcRbac/blog/tags/authorization"},{inline:!0,label:"LM-Commons",permalink:"/LmcRbac/blog/tags/lm-commons"}],readingTime:.11,hasTruncateMarker:!1,authors:[{name:"Eric Richer",title:"LM-Commons Administrator",url:"https://github.com/visto9259",imageURL:"https://github.com/visto9259.png",key:"ericr"}],frontMatter:{slug:"new-documentation",title:"New documentation",authors:["ericr"],tags:["laminas","PHP","LmcRbac","authorization","LM-Commons"]},unlisted:!1},m={authorsImageUrls:[void 0]},r=[];function l(t){const e={p:"p",...(0,a.R)(),...t.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(e.p,{children:"This the new documentation site dedicated to the LmcRbac module."}),"\n",(0,o.jsx)(e.p,{children:"There are no changes to the code, just improvements in the documentation."})]})}function u(t={}){const{wrapper:e}={...(0,a.R)(),...t.components};return e?(0,o.jsx)(e,{...t,children:(0,o.jsx)(l,{...t})}):l(t)}},8453:(t,e,n)=>{n.d(e,{R:()=>c,x:()=>s});var o=n(6540);const a={},i=o.createContext(a);function c(t){const e=o.useContext(i);return o.useMemo((function(){return"function"==typeof t?t(e):{...e,...t}}),[e,t])}function s(t){let e;return e=t.disableParentContext?"function"==typeof t.components?t.components(a):t.components||a:c(t.components),o.createElement(i.Provider,{value:e},t.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/3d87926a.81ea9642.js b/assets/js/3d87926a.81ea9642.js
deleted file mode 100644
index bd9e699..0000000
--- a/assets/js/3d87926a.81ea9642.js
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[167],{7452:(t,e,n)=>{n.r(e),n.d(e,{assets:()=>m,contentTitle:()=>s,default:()=>u,frontMatter:()=>c,metadata:()=>i,toc:()=>r});var o=n(4848),a=n(8453);const c={slug:"new-documentation",title:"New documentation",authors:["ericr"],tags:["laminas","PHP","LmcUser","authentication","LM-Commons"]},s=void 0,i={permalink:"/LmcRbac/blog/new-documentation",editUrl:"https://github.com/lm-commons/lmcrbac/tree/master/docs/blog/2024-04-11-New-documentation.md",source:"@site/blog/2024-04-11-New-documentation.md",title:"New documentation",description:"This the new documentation site dedicated to the LmcUser module.",date:"2024-04-11T00:00:00.000Z",tags:[{label:"laminas",permalink:"/LmcRbac/blog/tags/laminas"},{label:"PHP",permalink:"/LmcRbac/blog/tags/php"},{label:"LmcUser",permalink:"/LmcRbac/blog/tags/lmc-user"},{label:"authentication",permalink:"/LmcRbac/blog/tags/authentication"},{label:"LM-Commons",permalink:"/LmcRbac/blog/tags/lm-commons"}],readingTime:.11,hasTruncateMarker:!1,authors:[{name:"Eric Richer",title:"LM-Commons Administrator",url:"https://github.com/visto9259",imageURL:"https://github.com/visto9259.png",key:"ericr"}],frontMatter:{slug:"new-documentation",title:"New documentation",authors:["ericr"],tags:["laminas","PHP","LmcUser","authentication","LM-Commons"]},unlisted:!1},m={authorsImageUrls:[void 0]},r=[];function l(t){const e={p:"p",...(0,a.R)(),...t.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(e.p,{children:"This the new documentation site dedicated to the LmcUser module."}),"\n",(0,o.jsx)(e.p,{children:"There are no changes to the code, just improvements in the documentation."})]})}function u(t={}){const{wrapper:e}={...(0,a.R)(),...t.components};return e?(0,o.jsx)(e,{...t,children:(0,o.jsx)(l,{...t})}):l(t)}},8453:(t,e,n)=>{n.d(e,{R:()=>s,x:()=>i});var o=n(6540);const a={},c=o.createContext(a);function s(t){const e=o.useContext(c);return o.useMemo((function(){return"function"==typeof t?t(e):{...e,...t}}),[e,t])}function i(t){let e;return e=t.disableParentContext?"function"==typeof t.components?t.components(a):t.components||a:s(t.components),o.createElement(c.Provider,{value:e},t.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/3ea8b8bd.9c1937a3.js b/assets/js/3ea8b8bd.9c1937a3.js
new file mode 100644
index 0000000..7dc6d20
--- /dev/null
+++ b/assets/js/3ea8b8bd.9c1937a3.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[72],{4718:a=>{a.exports=JSON.parse('{"tag":{"label":"LM-Commons","permalink":"/LmcRbac/blog/tags/lm-commons","allTagsPath":"/LmcRbac/blog/tags","count":1,"unlisted":false},"listMetadata":{"permalink":"/LmcRbac/blog/tags/lm-commons","page":1,"postsPerPage":10,"totalPages":1,"totalCount":1,"blogDescription":"Blog","blogTitle":"Blog"}}')}}]);
\ No newline at end of file
diff --git a/assets/js/41f5a496.3c083080.js b/assets/js/41f5a496.3c083080.js
deleted file mode 100644
index 24bc17b..0000000
--- a/assets/js/41f5a496.3c083080.js
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[159],{7629:a=>{a.exports=JSON.parse('{"tags":[{"label":"laminas","permalink":"/LmcRbac/blog/tags/laminas","count":1},{"label":"PHP","permalink":"/LmcRbac/blog/tags/php","count":1},{"label":"LmcUser","permalink":"/LmcRbac/blog/tags/lmc-user","count":1},{"label":"authentication","permalink":"/LmcRbac/blog/tags/authentication","count":1},{"label":"LM-Commons","permalink":"/LmcRbac/blog/tags/lm-commons","count":1}]}')}}]);
\ No newline at end of file
diff --git a/assets/js/45a5cd1f.2284be79.js b/assets/js/45a5cd1f.2284be79.js
new file mode 100644
index 0000000..f4c0d14
--- /dev/null
+++ b/assets/js/45a5cd1f.2284be79.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[0],{1068:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>a,contentTitle:()=>r,default:()=>h,frontMatter:()=>o,metadata:()=>c,toc:()=>l});var i=n(4848),s=n(8453);const o={sidebar_label:"Concepts",sidebar_position:2,title:"Concepts"},r=void 0,c={id:"concepts",title:"Concepts",description:"Role-Based Access Control (RBAC)",source:"@site/docs/concepts.md",sourceDirName:".",slug:"/concepts",permalink:"/LmcRbac/docs/concepts",draft:!1,unlisted:!1,editUrl:"https://github.com/lm-commons/lmcrbac/tree/master/docs/docs/concepts.md",tags:[],version:"current",sidebarPosition:2,frontMatter:{sidebar_label:"Concepts",sidebar_position:2,title:"Concepts"},sidebar:"documentationSidebar",previous:{title:"Getting Started",permalink:"/LmcRbac/docs/gettingstarted"},next:{title:"Quick start",permalink:"/LmcRbac/docs/quickstart"}},a={},l=[{value:"Authorization",id:"authorization",level:2},{value:"Dynamic Assertions",id:"dynamic-assertions",level:2},{value:"Identities",id:"identities",level:2}];function d(e){const t={a:"a",code:"code",h2:"h2",li:"li",p:"p",strong:"strong",ul:"ul",...(0,s.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.a,{href:"https://en.wikipedia.org/wiki/Role-based_access_control",children:"Role-Based Access Control (RBAC)"}),"\nis an approach to restricting system access to authorized users by putting emphasis\non roles and their permissions."]}),"\n",(0,i.jsx)(t.p,{children:"In the RBAC model:"}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsxs)(t.li,{children:["an ",(0,i.jsx)(t.strong,{children:"identity"})," has one of more roles."]}),"\n",(0,i.jsxs)(t.li,{children:["a ",(0,i.jsx)(t.strong,{children:"role"})," has one of more permissions."]}),"\n",(0,i.jsxs)(t.li,{children:["a ",(0,i.jsx)(t.strong,{children:"permission"}),' is typically an action like "read", "write", "delete".']}),"\n",(0,i.jsxs)(t.li,{children:["a ",(0,i.jsx)(t.strong,{children:"role"})," can have ",(0,i.jsx)(t.strong,{children:"child roles"})," thus providing a hierarchy of roles where a role will inherit the permissions of all its child roles."]}),"\n"]}),"\n",(0,i.jsx)(t.h2,{id:"authorization",children:"Authorization"}),"\n",(0,i.jsx)(t.p,{children:"An identity will be authorized to perform an action, such as accessing a resource, if it is granted\nthe permission that controls the execution of the action."}),"\n",(0,i.jsxs)(t.p,{children:["For example, deleting an item could be restricted to identities that have at least one role that has the\n",(0,i.jsx)(t.code,{children:"item.delete"})," permission. This could be implemented by defining a ",(0,i.jsx)(t.code,{children:"member"})," role that has the ",(0,i.jsx)(t.code,{children:"item.delete"})," and assigning\nthis role of an authenticated user."]}),"\n",(0,i.jsx)(t.h2,{id:"dynamic-assertions",children:"Dynamic Assertions"}),"\n",(0,i.jsxs)(t.p,{children:["In some cases, just checking if the identity has the ",(0,i.jsx)(t.code,{children:"item.delete"})," permission is not enough.\nIt would also be necessary to check, for example, that the ",(0,i.jsx)(t.code,{children:"item"})," belongs to the identity. Dynamic assertion allow\nto specify some extra checks before granting access to perform an action such as, in this case, being the owner of the\nresource."]}),"\n",(0,i.jsx)(t.h2,{id:"identities",children:"Identities"}),"\n",(0,i.jsx)(t.p,{children:"An identity is typically provided by an authentication process within the application."}),"\n",(0,i.jsxs)(t.p,{children:["Authentication is not in the scope of ",(0,i.jsx)(t.code,{children:"LmcRbac"}),' and it is assumed that an identity entity providing assigned roles\nis available when using the authorization service. If no identity is available, as it would be the case when no user is "logged in",\nthen a guest role is assumed.']})]})}function h(e={}){const{wrapper:t}={...(0,s.R)(),...e.components};return t?(0,i.jsx)(t,{...e,children:(0,i.jsx)(d,{...e})}):d(e)}},8453:(e,t,n)=>{n.d(t,{R:()=>r,x:()=>c});var i=n(6540);const s={},o=i.createContext(s);function r(e){const t=i.useContext(o);return i.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function c(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:r(e.components),i.createElement(o.Provider,{value:t},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/942e85bb.2d8a3aa3.js b/assets/js/60894653.56a747fc.js
similarity index 83%
rename from assets/js/942e85bb.2d8a3aa3.js
rename to assets/js/60894653.56a747fc.js
index bd083c2..9b7d4e8 100644
--- a/assets/js/942e85bb.2d8a3aa3.js
+++ b/assets/js/60894653.56a747fc.js
@@ -1 +1 @@
-"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[778],{8791:a=>{a.exports=JSON.parse('{"tag":{"label":"PHP","permalink":"/LmcRbac/blog/tags/php","allTagsPath":"/LmcRbac/blog/tags","count":1,"unlisted":false},"listMetadata":{"permalink":"/LmcRbac/blog/tags/php","page":1,"postsPerPage":10,"totalPages":1,"totalCount":1,"blogDescription":"Blog","blogTitle":"Blog"}}')}}]);
\ No newline at end of file
+"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[754],{3478:a=>{a.exports=JSON.parse('{"tag":{"label":"PHP","permalink":"/LmcRbac/blog/tags/php","allTagsPath":"/LmcRbac/blog/tags","count":1,"unlisted":false},"listMetadata":{"permalink":"/LmcRbac/blog/tags/php","page":1,"postsPerPage":10,"totalPages":1,"totalCount":1,"blogDescription":"Blog","blogTitle":"Blog"}}')}}]);
\ No newline at end of file
diff --git a/assets/js/6875c492.2118b7c0.js b/assets/js/6875c492.2118b7c0.js
deleted file mode 100644
index 7c35849..0000000
--- a/assets/js/6875c492.2118b7c0.js
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[813],{7713:(e,t,n)=>{n.d(t,{A:()=>l});n(6540);var s=n(1312),a=n(9022),i=n(4848);function l(e){const{metadata:t}=e,{previousPage:n,nextPage:l}=t;return(0,i.jsxs)("nav",{className:"pagination-nav","aria-label":(0,s.T)({id:"theme.blog.paginator.navAriaLabel",message:"Blog list page navigation",description:"The ARIA label for the blog pagination"}),children:[n&&(0,i.jsx)(a.A,{permalink:n,title:(0,i.jsx)(s.A,{id:"theme.blog.paginator.newerEntries",description:"The label used to navigate to the newer blog posts page (previous page)",children:"Newer Entries"})}),l&&(0,i.jsx)(a.A,{permalink:l,title:(0,i.jsx)(s.A,{id:"theme.blog.paginator.olderEntries",description:"The label used to navigate to the older blog posts page (next page)",children:"Older Entries"}),isNext:!0})]})}},3892:(e,t,n)=>{n.d(t,{A:()=>l});n(6540);var s=n(7131),a=n(4651),i=n(4848);function l(e){let{items:t,component:n=a.A}=e;return(0,i.jsx)(i.Fragment,{children:t.map((e=>{let{content:t}=e;return(0,i.jsx)(s.i,{content:t,children:(0,i.jsx)(n,{children:(0,i.jsx)(t,{})})},t.metadata.permalink)}))})}},3069:(e,t,n)=>{n.r(t),n.d(t,{default:()=>A});n(6540);var s=n(4164),a=n(1312),i=n(5846),l=n(1213),r=n(7559),o=n(8774),c=n(6535),d=n(7713),g=n(1463),u=n(3892),h=n(996),p=n(1107),m=n(4848);function x(e){const t=function(){const{selectMessage:e}=(0,i.W)();return t=>e(t,(0,a.T)({id:"theme.blog.post.plurals",description:'Pluralized label for "{count} posts". Use as much plural forms (separated by "|") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)',message:"One post|{count} posts"},{count:t}))}();return(0,a.T)({id:"theme.blog.tagTitle",description:"The title of the page for a blog tag",message:'{nPosts} tagged with "{tagName}"'},{nPosts:t(e.count),tagName:e.label})}function j(e){let{tag:t}=e;const n=x(t);return(0,m.jsxs)(m.Fragment,{children:[(0,m.jsx)(l.be,{title:n}),(0,m.jsx)(g.A,{tag:"blog_tags_posts"})]})}function b(e){let{tag:t,items:n,sidebar:s,listMetadata:i}=e;const l=x(t);return(0,m.jsxs)(c.A,{sidebar:s,children:[t.unlisted&&(0,m.jsx)(h.A,{}),(0,m.jsxs)("header",{className:"margin-bottom--xl",children:[(0,m.jsx)(p.A,{as:"h1",children:l}),(0,m.jsx)(o.A,{href:t.allTagsPath,children:(0,m.jsx)(a.A,{id:"theme.tags.tagsPageLink",description:"The label of the link targeting the tag list page",children:"View All Tags"})})]}),(0,m.jsx)(u.A,{items:n}),(0,m.jsx)(d.A,{metadata:i})]})}function A(e){return(0,m.jsxs)(l.e3,{className:(0,s.A)(r.G.wrapper.blogPages,r.G.page.blogTagPostListPage),children:[(0,m.jsx)(j,{...e}),(0,m.jsx)(b,{...e})]})}},996:(e,t,n)=>{n.d(t,{A:()=>h});n(6540);var s=n(4164),a=n(1312),i=n(5260),l=n(4848);function r(){return(0,l.jsx)(a.A,{id:"theme.unlistedContent.title",description:"The unlisted content banner title",children:"Unlisted page"})}function o(){return(0,l.jsx)(a.A,{id:"theme.unlistedContent.message",description:"The unlisted content banner message",children:"This page is unlisted. Search engines will not index it, and only users having a direct link can access it."})}function c(){return(0,l.jsx)(i.A,{children:(0,l.jsx)("meta",{name:"robots",content:"noindex, nofollow"})})}var d=n(7559),g=n(7293);function u(e){let{className:t}=e;return(0,l.jsx)(g.A,{type:"caution",title:(0,l.jsx)(r,{}),className:(0,s.A)(t,d.G.common.unlistedBanner),children:(0,l.jsx)(o,{})})}function h(e){return(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(c,{}),(0,l.jsx)(u,{...e})]})}}}]);
\ No newline at end of file
diff --git a/assets/js/6875c492.3f033c5c.js b/assets/js/6875c492.3f033c5c.js
new file mode 100644
index 0000000..caa6026
--- /dev/null
+++ b/assets/js/6875c492.3f033c5c.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[813],{7713:(e,t,n)=>{n.d(t,{A:()=>r});n(6540);var s=n(1312),a=n(9022),i=n(4848);function r(e){const{metadata:t}=e,{previousPage:n,nextPage:r}=t;return(0,i.jsxs)("nav",{className:"pagination-nav","aria-label":(0,s.T)({id:"theme.blog.paginator.navAriaLabel",message:"Blog list page navigation",description:"The ARIA label for the blog pagination"}),children:[n&&(0,i.jsx)(a.A,{permalink:n,title:(0,i.jsx)(s.A,{id:"theme.blog.paginator.newerEntries",description:"The label used to navigate to the newer blog posts page (previous page)",children:"Newer Entries"})}),r&&(0,i.jsx)(a.A,{permalink:r,title:(0,i.jsx)(s.A,{id:"theme.blog.paginator.olderEntries",description:"The label used to navigate to the older blog posts page (next page)",children:"Older Entries"}),isNext:!0})]})}},3892:(e,t,n)=>{n.d(t,{A:()=>r});n(6540);var s=n(7131),a=n(4651),i=n(4848);function r(e){let{items:t,component:n=a.A}=e;return(0,i.jsx)(i.Fragment,{children:t.map((e=>{let{content:t}=e;return(0,i.jsx)(s.i,{content:t,children:(0,i.jsx)(n,{children:(0,i.jsx)(t,{})})},t.metadata.permalink)}))})}},3069:(e,t,n)=>{n.r(t),n.d(t,{default:()=>A});n(6540);var s=n(4164),a=n(1312),i=n(5846),r=n(1213),l=n(7559),o=n(8774),c=n(6535),d=n(7713),g=n(1463),u=n(3892),p=n(996),h=n(1107),m=n(4848);function x(e){const t=function(){const{selectMessage:e}=(0,i.W)();return t=>e(t,(0,a.T)({id:"theme.blog.post.plurals",description:'Pluralized label for "{count} posts". Use as much plural forms (separated by "|") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)',message:"One post|{count} posts"},{count:t}))}();return(0,a.T)({id:"theme.blog.tagTitle",description:"The title of the page for a blog tag",message:'{nPosts} tagged with "{tagName}"'},{nPosts:t(e.count),tagName:e.label})}function j(e){let{tag:t}=e;const n=x(t);return(0,m.jsxs)(m.Fragment,{children:[(0,m.jsx)(r.be,{title:n,description:t.description}),(0,m.jsx)(g.A,{tag:"blog_tags_posts"})]})}function b(e){let{tag:t,items:n,sidebar:s,listMetadata:i}=e;const r=x(t);return(0,m.jsxs)(c.A,{sidebar:s,children:[t.unlisted&&(0,m.jsx)(p.A,{}),(0,m.jsxs)("header",{className:"margin-bottom--xl",children:[(0,m.jsx)(h.A,{as:"h1",children:r}),t.description&&(0,m.jsx)("p",{children:t.description}),(0,m.jsx)(o.A,{href:t.allTagsPath,children:(0,m.jsx)(a.A,{id:"theme.tags.tagsPageLink",description:"The label of the link targeting the tag list page",children:"View All Tags"})})]}),(0,m.jsx)(u.A,{items:n}),(0,m.jsx)(d.A,{metadata:i})]})}function A(e){return(0,m.jsxs)(r.e3,{className:(0,s.A)(l.G.wrapper.blogPages,l.G.page.blogTagPostListPage),children:[(0,m.jsx)(j,{...e}),(0,m.jsx)(b,{...e})]})}},996:(e,t,n)=>{n.d(t,{A:()=>p});n(6540);var s=n(4164),a=n(1312),i=n(5260),r=n(4848);function l(){return(0,r.jsx)(a.A,{id:"theme.unlistedContent.title",description:"The unlisted content banner title",children:"Unlisted page"})}function o(){return(0,r.jsx)(a.A,{id:"theme.unlistedContent.message",description:"The unlisted content banner message",children:"This page is unlisted. Search engines will not index it, and only users having a direct link can access it."})}function c(){return(0,r.jsx)(i.A,{children:(0,r.jsx)("meta",{name:"robots",content:"noindex, nofollow"})})}var d=n(7559),g=n(7293);function u(e){let{className:t}=e;return(0,r.jsx)(g.A,{type:"caution",title:(0,r.jsx)(l,{}),className:(0,s.A)(t,d.G.common.unlistedBanner),children:(0,r.jsx)(o,{})})}function p(e){return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(c,{}),(0,r.jsx)(u,{...e})]})}}}]);
\ No newline at end of file
diff --git a/assets/js/7fcaebdf.64a524a2.js b/assets/js/7fcaebdf.64a524a2.js
new file mode 100644
index 0000000..3d592af
--- /dev/null
+++ b/assets/js/7fcaebdf.64a524a2.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[143],{6149:a=>{a.exports=JSON.parse('{"tags":[{"label":"laminas","permalink":"/LmcRbac/blog/tags/laminas","count":1},{"label":"PHP","permalink":"/LmcRbac/blog/tags/php","count":1},{"label":"LmcRbac","permalink":"/LmcRbac/blog/tags/lmc-rbac","count":1},{"label":"authorization","permalink":"/LmcRbac/blog/tags/authorization","count":1},{"label":"LM-Commons","permalink":"/LmcRbac/blog/tags/lm-commons","count":1}]}')}}]);
\ No newline at end of file
diff --git a/assets/js/8070e160.6fcd7787.js b/assets/js/8070e160.6fcd7787.js
new file mode 100644
index 0000000..939b888
--- /dev/null
+++ b/assets/js/8070e160.6fcd7787.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[822],{7495:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>d,contentTitle:()=>o,default:()=>h,frontMatter:()=>r,metadata:()=>c,toc:()=>a});var t=i(4848),s=i(8453);const r={sidebar_label:"Quick start",sidebar_position:3,title:"Quick Start"},o=void 0,c={id:"quickstart",title:"Quick Start",description:"Once the library has been installed by Composer, you will need to copy the",source:"@site/docs/quickstart.md",sourceDirName:".",slug:"/quickstart",permalink:"/LmcRbac/docs/quickstart",draft:!1,unlisted:!1,editUrl:"https://github.com/lm-commons/lmcrbac/tree/master/docs/docs/quickstart.md",tags:[],version:"current",sidebarPosition:3,frontMatter:{sidebar_label:"Quick start",sidebar_position:3,title:"Quick Start"},sidebar:"documentationSidebar",previous:{title:"Concepts",permalink:"/LmcRbac/docs/concepts"},next:{title:"Role providers",permalink:"/LmcRbac/docs/role-providers"}},d={},a=[{value:"Defining roles",id:"defining-roles",level:2},{value:"Basic authorization",id:"basic-authorization",level:2},{value:"Using assertions",id:"using-assertions",level:2}];function l(e){const n={a:"a",admonition:"admonition",code:"code",h2:"h2",li:"li",p:"p",pre:"pre",ul:"ul",...(0,s.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsxs)(n.p,{children:["Once the library has been installed by Composer, you will need to copy the\n",(0,t.jsx)(n.code,{children:"config/lmcrbac.global.php"})," file from ",(0,t.jsx)(n.code,{children:"LmcRbac"})," to the ",(0,t.jsx)(n.code,{children:"config/autoload"})," folder."]}),"\n",(0,t.jsx)(n.admonition,{type:"note",children:(0,t.jsxs)(n.p,{children:["On older versions of ",(0,t.jsx)(n.code,{children:"LmcRbac"}),", the configuration file is named ",(0,t.jsx)(n.code,{children:"config/config.global.php"}),"."]})}),"\n",(0,t.jsx)(n.h2,{id:"defining-roles",children:"Defining roles"}),"\n",(0,t.jsx)(n.p,{children:"By default, no roles and no permissions are defined."}),"\n",(0,t.jsxs)(n.p,{children:["Roles and permissions are defined by a Role Provider. ",(0,t.jsx)(n.code,{children:"LmcRbac"})," ships with two roles providers:"]}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["a simple ",(0,t.jsx)(n.code,{children:"InMemoryRoleProvider"})," that uses an associative array to define roles and their permission. This is the default."]}),"\n",(0,t.jsxs)(n.li,{children:["a ",(0,t.jsx)(n.code,{children:"ObjectRepositoyRoleProvider"})," that is based on Doctrine ORM."]}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:["To quickly get started, let's use the ",(0,t.jsx)(n.code,{children:"InMemoryRoleProvider"})," role provider."]}),"\n",(0,t.jsxs)(n.p,{children:["In the ",(0,t.jsx)(n.code,{children:"config/autoload/lmcrbac.global.php"}),", add the following:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-php",children:" [\n 'role_provider' => [\n 'LmcRbac\\Role\\InMemoryRoleProvider' => [\n 'guest',\n 'user' => [\n 'permissions' => ['create', 'edit'],\n ],\n 'admin' => [\n 'children' => ['user'],\n 'permissions' => ['delete'],\n ],\n ],\n ],\n ],\n];\n"})}),"\n",(0,t.jsxs)(n.p,{children:["This defines 3 roles: a ",(0,t.jsx)(n.code,{children:"guest"})," role, a ",(0,t.jsx)(n.code,{children:"user"})," role having 2 permissions, and a ",(0,t.jsx)(n.code,{children:"admin"})," role which has the ",(0,t.jsx)(n.code,{children:"user"})," role as\na child and with its own permission. If the hierarchy is flattened:"]}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"guest"})," has no permission"]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"user"})," has permissions ",(0,t.jsx)(n.code,{children:"create"})," and ",(0,t.jsx)(n.code,{children:"edit"})]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"admin"})," has permissions ",(0,t.jsx)(n.code,{children:"create"}),", ",(0,t.jsx)(n.code,{children:"edit"})," and ",(0,t.jsx)(n.code,{children:"delete"})]}),"\n"]}),"\n",(0,t.jsx)(n.h2,{id:"basic-authorization",children:"Basic authorization"}),"\n",(0,t.jsx)(n.p,{children:"The authorization service can get retrieved from service manager container and used to check if a permission\nis granted to an identity:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-php",children:"get('\\LmcRbac\\Service\\AuthorizationServiceInterface');\n \n /** @var \\LmcRbac\\Identity\\IdentityInterface $identity */\n if ($authorizationService->isGranted($identity, 'create')) {\n /** do something */\n }\n"})}),"\n",(0,t.jsxs)(n.p,{children:["If ",(0,t.jsx)(n.code,{children:"$identity"})," has the role ",(0,t.jsx)(n.code,{children:"user"})," and/or ",(0,t.jsx)(n.code,{children:"admin"})," then the authorization is granted. If the identity has the role ",(0,t.jsx)(n.code,{children:"guest"}),", then authorization\nis denied."]}),"\n",(0,t.jsx)(n.admonition,{type:"info",children:(0,t.jsxs)(n.p,{children:["If ",(0,t.jsx)(n.code,{children:"$identity"})," is null (no identity), then the guest role is assumed which is set to ",(0,t.jsx)(n.code,{children:"'guest'"})," by default. The guest role\ncan be configured in the ",(0,t.jsx)(n.code,{children:"lmcrbac.config.php"})," file. More on this in the ",(0,t.jsx)(n.a,{href:"/LmcRbac/docs/configuration",children:"Configuration"})," section."]})}),"\n",(0,t.jsx)(n.admonition,{type:"warning",children:(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.code,{children:"LmcRbac"})," does not provide any logic to instantiate an identity entity. It is assumed that\nthe application will instantiate an entity that implements ",(0,t.jsx)(n.code,{children:"\\LmcRbac\\Identity\\IdentityInterface"})," which defines the ",(0,t.jsx)(n.code,{children:"getRoles()"}),"\nmethod."]})}),"\n",(0,t.jsx)(n.h2,{id:"using-assertions",children:"Using assertions"}),"\n",(0,t.jsxs)(n.p,{children:["Even if an identity has the ",(0,t.jsx)(n.code,{children:"user"})," role granting it the ",(0,t.jsx)(n.code,{children:"edit"})," permission, it should not have the authorization to edit another identity's resource."]}),"\n",(0,t.jsx)(n.p,{children:"This can be achieved using dynamic assertion."}),"\n",(0,t.jsxs)(n.p,{children:["An assertion is a function that implements the ",(0,t.jsx)(n.code,{children:"\\LmcRbac\\Assertion\\AssertionInterface"})," and is configured in the configuration\nfile."]}),"\n",(0,t.jsxs)(n.p,{children:["Let's modify the ",(0,t.jsx)(n.code,{children:"lmcrbac.config.php"})," file as follows:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-php",children:" [\n 'role_provider' => [\n /* roles and permissions\n ],\n 'assertion_map' => [\n 'edit' => function ($permission, IdentityInterface $identity = null, $resource = null) {\n if ($resource->getOwnerId() === $identity->getId() {\n return true;\n } else {\n return false;\n }\n ],\n ],\n];\n"})}),"\n",(0,t.jsx)(n.p,{children:"Then use the authorization service passing the resource (called a 'context') in addition to the permission:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-php",children:"get('\\LmcRbac\\Service\\AuthorizationServiceInterface');\n \n /** @var \\LmcRbac\\Identity\\IdentityInterface $identity */\n if ($authorizationService->isGranted($identity, 'edit', $resource)) {\n /** do something */\n }\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Dynanmic assertions are further discussed in the ",(0,t.jsx)(n.a,{href:"assertions",children:"Dynamic Assertions"})," section."]})]})}function h(e={}){const{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(l,{...e})}):l(e)}},8453:(e,n,i)=>{i.d(n,{R:()=>o,x:()=>c});var t=i(6540);const s={},r=t.createContext(s);function o(e){const n=t.useContext(r);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:o(e.components),t.createElement(r.Provider,{value:n},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/8492fea1.796f5995.js b/assets/js/8492fea1.796f5995.js
deleted file mode 100644
index 897db87..0000000
--- a/assets/js/8492fea1.796f5995.js
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[555],{7555:e=>{e.exports=JSON.parse('{"version":{"pluginId":"default","version":"current","label":"Next","banner":null,"badge":false,"noIndex":false,"className":"docs-version-current","isLast":true,"docsSidebars":{"documentationSidebar":[{"type":"link","label":"Introduction","href":"/LmcRbac/docs/introduction","docId":"introduction","unlisted":false},{"type":"link","label":"Requirements and Installation","href":"/LmcRbac/docs/installation","docId":"installation","unlisted":false}]},"docs":{"installation":{"id":"installation","title":"Requirements and Installation","description":"Requirements","sidebar":"documentationSidebar"},"introduction":{"id":"introduction","title":"Introduction","description":"Role-based access control module to provide additional features on top of Laminas\\\\Permissions\\\\Rbac","sidebar":"documentationSidebar"}}}}')}}]);
\ No newline at end of file
diff --git a/assets/js/91903d90.7e3b9d0d.js b/assets/js/91903d90.7e3b9d0d.js
deleted file mode 100644
index 92d6fbb..0000000
--- a/assets/js/91903d90.7e3b9d0d.js
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[144],{6091:e=>{e.exports=JSON.parse('{"archive":{"blogPosts":[{"id":"new-documentation","metadata":{"permalink":"/LmcRbac/blog/new-documentation","editUrl":"https://github.com/lm-commons/lmcrbac/tree/master/docs/blog/2024-04-11-New-documentation.md","source":"@site/blog/2024-04-11-New-documentation.md","title":"New documentation","description":"This the new documentation site dedicated to the LmcUser module.","date":"2024-04-11T00:00:00.000Z","tags":[{"label":"laminas","permalink":"/LmcRbac/blog/tags/laminas"},{"label":"PHP","permalink":"/LmcRbac/blog/tags/php"},{"label":"LmcUser","permalink":"/LmcRbac/blog/tags/lmc-user"},{"label":"authentication","permalink":"/LmcRbac/blog/tags/authentication"},{"label":"LM-Commons","permalink":"/LmcRbac/blog/tags/lm-commons"}],"readingTime":0.11,"hasTruncateMarker":false,"authors":[{"name":"Eric Richer","title":"LM-Commons Administrator","url":"https://github.com/visto9259","imageURL":"https://github.com/visto9259.png","key":"ericr"}],"frontMatter":{"slug":"new-documentation","title":"New documentation","authors":["ericr"],"tags":["laminas","PHP","LmcUser","authentication","LM-Commons"]},"unlisted":false},"content":"This the new documentation site dedicated to the LmcUser module.\\n\\nThere are no changes to the code, just improvements in the documentation."}]}}')}}]);
\ No newline at end of file
diff --git a/assets/js/99f61a94.c413e09a.js b/assets/js/99f61a94.c413e09a.js
deleted file mode 100644
index f8d5a6c..0000000
--- a/assets/js/99f61a94.c413e09a.js
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[580],{204:a=>{a.exports=JSON.parse('{"tag":{"label":"LmcUser","permalink":"/LmcRbac/blog/tags/lmc-user","allTagsPath":"/LmcRbac/blog/tags","count":1,"unlisted":false},"listMetadata":{"permalink":"/LmcRbac/blog/tags/lmc-user","page":1,"postsPerPage":10,"totalPages":1,"totalCount":1,"blogDescription":"Blog","blogTitle":"Blog"}}')}}]);
\ No newline at end of file
diff --git a/assets/js/9ed00105.bb7a2b98.js b/assets/js/9ed00105.bb7a2b98.js
new file mode 100644
index 0000000..d14e15c
--- /dev/null
+++ b/assets/js/9ed00105.bb7a2b98.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[873],{2163:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>d,contentTitle:()=>c,default:()=>h,frontMatter:()=>r,metadata:()=>o,toc:()=>a});var i=t(4848),s=t(8453);const r={sidebar_label:"Configuration",sidebar_position:7,title:"Configuring LmcRbac"},c=void 0,o={id:"configuration",title:"Configuring LmcRbac",description:"LmcRbac is configured via the lmc_rbac key in the application config.",source:"@site/docs/configuration.md",sourceDirName:".",slug:"/configuration",permalink:"/LmcRbac/docs/configuration",draft:!1,unlisted:!1,editUrl:"https://github.com/lm-commons/lmcrbac/tree/master/docs/docs/configuration.md",tags:[],version:"current",sidebarPosition:7,frontMatter:{sidebar_label:"Configuration",sidebar_position:7,title:"Configuring LmcRbac"},sidebar:"documentationSidebar",previous:{title:"Dynamic Assertions",permalink:"/LmcRbac/docs/assertions"},next:{title:"Migration Guide",permalink:"/LmcRbac/docs/migration"}},d={},a=[{value:"Reference",id:"reference",level:2}];function l(e){const n={a:"a",code:"code",h2:"h2",p:"p",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,s.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsxs)(n.p,{children:["LmcRbac is configured via the ",(0,i.jsx)(n.code,{children:"lmc_rbac"})," key in the application config."]}),"\n",(0,i.jsxs)(n.p,{children:["This is typically achieved by creating\na ",(0,i.jsx)(n.code,{children:"config/autoload/lmcrbac.global.php"})," file. A sample configuration file is provided in the ",(0,i.jsx)(n.code,{children:"config/"})," folder."]}),"\n",(0,i.jsx)(n.h2,{id:"reference",children:"Reference"}),"\n",(0,i.jsxs)(n.table,{children:[(0,i.jsx)(n.thead,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.th,{children:"Key"}),(0,i.jsx)(n.th,{children:"Description"})]})}),(0,i.jsxs)(n.tbody,{children:[(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"guest_role"})}),(0,i.jsxs)(n.td,{children:["Defines the name of the ",(0,i.jsx)(n.code,{children:"guest"})," role when no identity exists. ",(0,i.jsx)("br",{}),"Defaults to ",(0,i.jsx)(n.code,{children:"'guest'"}),"."]})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"assertion_map"})}),(0,i.jsxs)(n.td,{children:["Defines the dynamic assertions that are associated to permissions.",(0,i.jsx)("br",{}),"Defaults to ",(0,i.jsx)(n.code,{children:"[]"}),".",(0,i.jsx)("br",{}),"See the ",(0,i.jsx)(n.a,{href:"assertions",children:"Dynamic Assertions"})," section."]})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"role_provider"})}),(0,i.jsxs)(n.td,{children:["Defines the role provider.",(0,i.jsx)("br",{}),"Defaults to ",(0,i.jsx)(n.code,{children:"[]"}),(0,i.jsx)("br",{}),"See the ",(0,i.jsx)(n.a,{href:"role-providers",children:"Role Providers"})," section."]})]})]})]})]})}function h(e={}){const{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(l,{...e})}):l(e)}},8453:(e,n,t)=>{t.d(n,{R:()=>c,x:()=>o});var i=t(6540);const s={},r=i.createContext(s);function c(e){const n=i.useContext(r);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function o(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:c(e.components),i.createElement(r.Provider,{value:n},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/a09c2993.f56c0523.js b/assets/js/a09c2993.f56c0523.js
deleted file mode 100644
index 62432e6..0000000
--- a/assets/js/a09c2993.f56c0523.js
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[899],{1456:(n,t,o)=>{o.r(t),o.d(t,{assets:()=>a,contentTitle:()=>c,default:()=>u,frontMatter:()=>i,metadata:()=>r,toc:()=>d});var e=o(4848),s=o(8453);const i={sidebar_position:1},c="Introduction",r={id:"introduction",title:"Introduction",description:"Role-based access control module to provide additional features on top of Laminas\\Permissions\\Rbac",source:"@site/docs/introduction.md",sourceDirName:".",slug:"/introduction",permalink:"/LmcRbac/docs/introduction",draft:!1,unlisted:!1,editUrl:"https://github.com/lm-commons/lmcrbac/tree/master/docs/docs/introduction.md",tags:[],version:"current",sidebarPosition:1,frontMatter:{sidebar_position:1},sidebar:"documentationSidebar",next:{title:"Requirements and Installation",permalink:"/LmcRbac/docs/installation"}},a={},d=[{value:"Support",id:"support",level:2}];function l(n){const t={a:"a",h1:"h1",h2:"h2",li:"li",p:"p",ul:"ul",...(0,s.R)(),...n.components};return(0,e.jsxs)(e.Fragment,{children:[(0,e.jsx)(t.h1,{id:"introduction",children:"Introduction"}),"\n",(0,e.jsx)(t.p,{children:"Role-based access control module to provide additional features on top of Laminas\\Permissions\\Rbac"}),"\n",(0,e.jsxs)(t.p,{children:["Based on ",(0,e.jsx)(t.a,{href:"https://github.com/ZF-Commons/zfc-rbac",children:"ZF-Commons/zfc-rbac"})," v3.x."]}),"\n",(0,e.jsxs)(t.p,{children:["If you are looking for the Laminas version\nof zfc-rbac v2, please use ",(0,e.jsx)(t.a,{href:"https://github.com/LM-Commons/LmcRbacMvc",children:"LM-Commons/LmcRbacMvc"}),"."]}),"\n",(0,e.jsx)(t.h2,{id:"support",children:"Support"}),"\n",(0,e.jsxs)(t.ul,{children:["\n",(0,e.jsxs)(t.li,{children:["File issues at ",(0,e.jsx)(t.a,{href:"https://github.com/LM-Commons/LmcRbac/issues",children:"https://github.com/LM-Commons/LmcRbac/issues"}),"."]}),"\n",(0,e.jsxs)(t.li,{children:["Ask questions in the ",(0,e.jsx)(t.a,{href:"https://join.slack.com/t/lm-commons/shared_invite/zt-2gankt2wj-FTS45hp1W~JEj1tWvDsUHQ",children:"LM-Commons Slack"})," chat."]}),"\n"]})]})}function u(n={}){const{wrapper:t}={...(0,s.R)(),...n.components};return t?(0,e.jsx)(t,{...n,children:(0,e.jsx)(l,{...n})}):l(n)}},8453:(n,t,o)=>{o.d(t,{R:()=>c,x:()=>r});var e=o(6540);const s={},i=e.createContext(s);function c(n){const t=e.useContext(i);return e.useMemo((function(){return"function"==typeof n?n(t):{...t,...n}}),[t,n])}function r(n){let t;return t=n.disableParentContext?"function"==typeof n.components?n.components(s):n.components||s:c(n.components),e.createElement(i.Provider,{value:t},n.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/a6aa9e1f.5825b75e.js b/assets/js/a6aa9e1f.4810414c.js
similarity index 58%
rename from assets/js/a6aa9e1f.5825b75e.js
rename to assets/js/a6aa9e1f.4810414c.js
index f310200..1a330b8 100644
--- a/assets/js/a6aa9e1f.5825b75e.js
+++ b/assets/js/a6aa9e1f.4810414c.js
@@ -1 +1 @@
-"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[643],{5124:(e,t,a)=>{a.r(t),a.d(t,{default:()=>f});a(6540);var n=a(4164),i=a(4586),r=a(1213),o=a(7559),s=a(6535),l=a(7713),d=a(1463),c=a(3892),g=a(5260),p=a(6676),u=a(4848);function m(e){const t=(0,p.k)(e);return(0,u.jsx)(g.A,{children:(0,u.jsx)("script",{type:"application/ld+json",children:JSON.stringify(t)})})}function h(e){const{metadata:t}=e,{siteConfig:{title:a}}=(0,i.A)(),{blogDescription:n,blogTitle:o,permalink:s}=t,l="/"===s?a:o;return(0,u.jsxs)(u.Fragment,{children:[(0,u.jsx)(r.be,{title:l,description:n}),(0,u.jsx)(d.A,{tag:"blog_posts_list"})]})}function b(e){const{metadata:t,items:a,sidebar:n}=e;return(0,u.jsxs)(s.A,{sidebar:n,children:[(0,u.jsx)(c.A,{items:a}),(0,u.jsx)(l.A,{metadata:t})]})}function f(e){return(0,u.jsxs)(r.e3,{className:(0,n.A)(o.G.wrapper.blogPages,o.G.page.blogListPage),children:[(0,u.jsx)(h,{...e}),(0,u.jsx)(m,{...e}),(0,u.jsx)(b,{...e})]})}},7713:(e,t,a)=>{a.d(t,{A:()=>o});a(6540);var n=a(1312),i=a(9022),r=a(4848);function o(e){const{metadata:t}=e,{previousPage:a,nextPage:o}=t;return(0,r.jsxs)("nav",{className:"pagination-nav","aria-label":(0,n.T)({id:"theme.blog.paginator.navAriaLabel",message:"Blog list page navigation",description:"The ARIA label for the blog pagination"}),children:[a&&(0,r.jsx)(i.A,{permalink:a,title:(0,r.jsx)(n.A,{id:"theme.blog.paginator.newerEntries",description:"The label used to navigate to the newer blog posts page (previous page)",children:"Newer Entries"})}),o&&(0,r.jsx)(i.A,{permalink:o,title:(0,r.jsx)(n.A,{id:"theme.blog.paginator.olderEntries",description:"The label used to navigate to the older blog posts page (next page)",children:"Older Entries"}),isNext:!0})]})}},3892:(e,t,a)=>{a.d(t,{A:()=>o});a(6540);var n=a(7131),i=a(4651),r=a(4848);function o(e){let{items:t,component:a=i.A}=e;return(0,r.jsx)(r.Fragment,{children:t.map((e=>{let{content:t}=e;return(0,r.jsx)(n.i,{content:t,children:(0,r.jsx)(a,{children:(0,r.jsx)(t,{})})},t.metadata.permalink)}))})}},6676:(e,t,a)=>{a.d(t,{k:()=>c,J:()=>g});var n=a(6025),i=a(4586),r=a(6803);var o=a(7131);const s=e=>new Date(e).toISOString();function l(e){const t=e.map(p);return{author:1===t.length?t[0]:t}}function d(e,t,a){return e?{image:u({imageUrl:t(e,{absolute:!0}),caption:`title image for the blog post: ${a}`})}:{}}function c(e){const{siteConfig:t}=(0,i.A)(),{withBaseUrl:a}=(0,n.h)(),{metadata:{blogDescription:r,blogTitle:o,permalink:c}}=e,g=`${t.url}${c}`;return{"@context":"https://schema.org","@type":"Blog","@id":g,mainEntityOfPage:g,headline:o,description:r,blogPost:e.items.map((e=>function(e,t,a){const{assets:n,frontMatter:i,metadata:r}=e,{date:o,title:c,description:g,lastUpdatedAt:p}=r,u=n.image??i.image,m=i.keywords??[],h=`${t.url}${r.permalink}`,b=p?s(p):void 0;return{"@type":"BlogPosting","@id":h,mainEntityOfPage:h,url:h,headline:c,name:c,description:g,datePublished:o,...b?{dateModified:b}:{},...l(r.authors),...d(u,a,c),...m?{keywords:m}:{}}}(e.content,t,a)))}}function g(){const e=function(){const e=(0,r.A)(),t=e?.data?.blogMetadata;if(!t)throw new Error("useBlogMetadata() can't be called on the current route because the blog metadata could not be found in route context");return t}(),{assets:t,metadata:a}=(0,o.e)(),{siteConfig:c}=(0,i.A)(),{withBaseUrl:g}=(0,n.h)(),{date:p,title:u,description:m,frontMatter:h,lastUpdatedAt:b}=a,f=t.image??h.image,x=h.keywords??[],j=b?s(b):void 0,A=`${c.url}${a.permalink}`;return{"@context":"https://schema.org","@type":"BlogPosting","@id":A,mainEntityOfPage:A,url:A,headline:u,name:u,description:m,datePublished:p,...j?{dateModified:j}:{},...l(a.authors),...d(f,g,u),...x?{keywords:x}:{},isPartOf:{"@type":"Blog","@id":`${c.url}${e.blogBasePath}`,name:e.blogTitle}}}function p(e){return{"@type":"Person",...e.name?{name:e.name}:{},...e.title?{description:e.title}:{},...e.url?{url:e.url}:{},...e.email?{email:e.email}:{},...e.imageURL?{image:e.imageURL}:{}}}function u(e){let{imageUrl:t,caption:a}=e;return{"@type":"ImageObject","@id":t,url:t,contentUrl:t,caption:a}}}}]);
\ No newline at end of file
+"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[643],{5124:(e,t,a)=>{a.r(t),a.d(t,{default:()=>f});a(6540);var n=a(4164),i=a(4586),r=a(1213),o=a(7559),s=a(6535),l=a(7713),d=a(1463),c=a(3892),g=a(5260),p=a(6676),u=a(4848);function m(e){const t=(0,p.k)(e);return(0,u.jsx)(g.A,{children:(0,u.jsx)("script",{type:"application/ld+json",children:JSON.stringify(t)})})}function h(e){const{metadata:t}=e,{siteConfig:{title:a}}=(0,i.A)(),{blogDescription:n,blogTitle:o,permalink:s}=t,l="/"===s?a:o;return(0,u.jsxs)(u.Fragment,{children:[(0,u.jsx)(r.be,{title:l,description:n}),(0,u.jsx)(d.A,{tag:"blog_posts_list"})]})}function b(e){const{metadata:t,items:a,sidebar:n}=e;return(0,u.jsxs)(s.A,{sidebar:n,children:[(0,u.jsx)(c.A,{items:a}),(0,u.jsx)(l.A,{metadata:t})]})}function f(e){return(0,u.jsxs)(r.e3,{className:(0,n.A)(o.G.wrapper.blogPages,o.G.page.blogListPage),children:[(0,u.jsx)(h,{...e}),(0,u.jsx)(m,{...e}),(0,u.jsx)(b,{...e})]})}},7713:(e,t,a)=>{a.d(t,{A:()=>o});a(6540);var n=a(1312),i=a(9022),r=a(4848);function o(e){const{metadata:t}=e,{previousPage:a,nextPage:o}=t;return(0,r.jsxs)("nav",{className:"pagination-nav","aria-label":(0,n.T)({id:"theme.blog.paginator.navAriaLabel",message:"Blog list page navigation",description:"The ARIA label for the blog pagination"}),children:[a&&(0,r.jsx)(i.A,{permalink:a,title:(0,r.jsx)(n.A,{id:"theme.blog.paginator.newerEntries",description:"The label used to navigate to the newer blog posts page (previous page)",children:"Newer Entries"})}),o&&(0,r.jsx)(i.A,{permalink:o,title:(0,r.jsx)(n.A,{id:"theme.blog.paginator.olderEntries",description:"The label used to navigate to the older blog posts page (next page)",children:"Older Entries"}),isNext:!0})]})}},3892:(e,t,a)=>{a.d(t,{A:()=>o});a(6540);var n=a(7131),i=a(4651),r=a(4848);function o(e){let{items:t,component:a=i.A}=e;return(0,r.jsx)(r.Fragment,{children:t.map((e=>{let{content:t}=e;return(0,r.jsx)(n.i,{content:t,children:(0,r.jsx)(a,{children:(0,r.jsx)(t,{})})},t.metadata.permalink)}))})}},6676:(e,t,a)=>{a.d(t,{k:()=>c,J:()=>g});var n=a(6025),i=a(4586),r=a(6803);var o=a(7131);const s=e=>new Date(e).toISOString();function l(e){const t=e.map(p);return{author:1===t.length?t[0]:t}}function d(e,t,a){return e?{image:u({imageUrl:t(e,{absolute:!0}),caption:`title image for the blog post: ${a}`})}:{}}function c(e){const{siteConfig:t}=(0,i.A)(),{withBaseUrl:a}=(0,n.hH)(),{metadata:{blogDescription:r,blogTitle:o,permalink:c}}=e,g=`${t.url}${c}`;return{"@context":"https://schema.org","@type":"Blog","@id":g,mainEntityOfPage:g,headline:o,description:r,blogPost:e.items.map((e=>function(e,t,a){const{assets:n,frontMatter:i,metadata:r}=e,{date:o,title:c,description:g,lastUpdatedAt:p}=r,u=n.image??i.image,m=i.keywords??[],h=`${t.url}${r.permalink}`,b=p?s(p):void 0;return{"@type":"BlogPosting","@id":h,mainEntityOfPage:h,url:h,headline:c,name:c,description:g,datePublished:o,...b?{dateModified:b}:{},...l(r.authors),...d(u,a,c),...m?{keywords:m}:{}}}(e.content,t,a)))}}function g(){const e=function(){const e=(0,r.A)(),t=e?.data?.blogMetadata;if(!t)throw new Error("useBlogMetadata() can't be called on the current route because the blog metadata could not be found in route context");return t}(),{assets:t,metadata:a}=(0,o.e)(),{siteConfig:c}=(0,i.A)(),{withBaseUrl:g}=(0,n.hH)(),{date:p,title:u,description:m,frontMatter:h,lastUpdatedAt:b}=a,f=t.image??h.image,x=h.keywords??[],j=b?s(b):void 0,A=`${c.url}${a.permalink}`;return{"@context":"https://schema.org","@type":"BlogPosting","@id":A,mainEntityOfPage:A,url:A,headline:u,name:u,description:m,datePublished:p,...j?{dateModified:j}:{},...l(a.authors),...d(f,g,u),...x?{keywords:x}:{},isPartOf:{"@type":"Blog","@id":`${c.url}${e.blogBasePath}`,name:e.blogTitle}}}function p(e){return{"@type":"Person",...e.name?{name:e.name}:{},...e.title?{description:e.title}:{},...e.url?{url:e.url}:{},...e.email?{email:e.email}:{},...e.imageURL?{image:e.imageURL}:{}}}function u(e){let{imageUrl:t,caption:a}=e;return{"@type":"ImageObject","@id":t,url:t,contentUrl:t,caption:a}}}}]);
\ No newline at end of file
diff --git a/assets/js/a94703ab.362f3fb4.js b/assets/js/a94703ab.a8e86096.js
similarity index 54%
rename from assets/js/a94703ab.362f3fb4.js
rename to assets/js/a94703ab.a8e86096.js
index c41282b..258070f 100644
--- a/assets/js/a94703ab.362f3fb4.js
+++ b/assets/js/a94703ab.a8e86096.js
@@ -1 +1 @@
-"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[48],{2559:(e,t,n)=>{n.r(t),n.d(t,{default:()=>be});var a=n(6540),o=n(4164),i=n(1213),s=n(7559),l=n(1754),r=n(6588),c=n(1312),d=n(3104),u=n(5062);const m={backToTopButton:"backToTopButton_sjWU",backToTopButtonShow:"backToTopButtonShow_xfvO"};var b=n(4848);function h(){const{shown:e,scrollToTop:t}=function(e){let{threshold:t}=e;const[n,o]=(0,a.useState)(!1),i=(0,a.useRef)(!1),{startScroll:s,cancelScroll:l}=(0,d.gk)();return(0,d.Mq)(((e,n)=>{let{scrollY:a}=e;const s=n?.scrollY;s&&(i.current?i.current=!1:a>=s?(l(),o(!1)):aYour Docusaurus site did not load properly.
\nA very common reason is a wrong site baseUrl configuration.
\nCurrent configured baseUrl = ${e} ${"/"===e?" (default value)":""}
\nWe suggest trying baseUrl =
\nYour Docusaurus site did not load properly.
\nA very common reason is a wrong site baseUrl configuration.
\nCurrent configured baseUrl = ${e} ${"/"===e?" (default value)":""}
\nWe suggest trying baseUrl =
\n