From be21be4108cf0fad33e1b723fc63f896017e6546 Mon Sep 17 00:00:00 2001 From: Joon Park Date: Fri, 11 Feb 2022 15:58:24 +0100 Subject: [PATCH 01/50] Permission framework docs overview (#9412) * Permission framework docs overview Signed-off-by: Joon Park * Address comments Signed-off-by: Joon Park --- .../permission-framework-overview.drawio.svg | 4 ++ docs/permission/adopters/index.md | 0 docs/permission/overview.md | 41 +++++++++++++++++++ docs/permission/plugin-authors/index.md | 0 microsite/sidebars.json | 1 + 5 files changed, 46 insertions(+) create mode 100644 docs/assets/permission/permission-framework-overview.drawio.svg create mode 100644 docs/permission/adopters/index.md create mode 100644 docs/permission/overview.md create mode 100644 docs/permission/plugin-authors/index.md diff --git a/docs/assets/permission/permission-framework-overview.drawio.svg b/docs/assets/permission/permission-framework-overview.drawio.svg new file mode 100644 index 0000000000..c7e628f8a6 --- /dev/null +++ b/docs/assets/permission/permission-framework-overview.drawio.svg @@ -0,0 +1,4 @@ + + + +
User
User
Plugin
Plugin
Permission Response
Permission Response
Permission Framework
Permission Framework
Action
(Read request)
Action...
Resources
Resources
Resource read permission
Resource read...
Permission Policy
Permission Policy
Permission Request
Permission Request
Provided by Backstage
Provided by Backstage
Configured by integrators
Configured by integrators
Configured by plugin authors
Configured by plugin authors
Permission Backend
Permission hooks
Integration helpers
...
Permission Backend...
1
1
2
2
3
3
4
4
Text is not SVG - cannot display
\ No newline at end of file diff --git a/docs/permission/adopters/index.md b/docs/permission/adopters/index.md new file mode 100644 index 0000000000..e69de29bb2 diff --git a/docs/permission/overview.md b/docs/permission/overview.md new file mode 100644 index 0000000000..808a93119e --- /dev/null +++ b/docs/permission/overview.md @@ -0,0 +1,41 @@ +--- +id: overview +title: Permission Framework Overview +description: A high level overview of the Backstage permission framework +--- + +[The previous section](../auth/index.md) covered the various _authentication_ methods of Backstage, but Backstage can also _authorize_ specific data, APIs, or interface actions - meaning that Backstage has the ability to enforce rules about what type of access is allowed for a given user of a system. + +By default, Backstage endpoints are not protected, and all actions are available to anyone. However, configuring which users can access which resources and actions is a common need for many organizations. The permission framework allows integrators to achieve this through the use of granular permissioning for those resources and actions. + +The permission framework was designed with a few key properties in mind: + +- Flexibility: the framework allows integrators to configure many different authorization methods. This could include implementations like role-based access control (RBAC), attribute-based access control (ABAC), bespoke logic expressed in code, or integrations with external authorization providers. + +- Usability: the permission framework allows integrators to focus on configuring what they care about (the permission policy) by providing all of its moving parts out of the box. It also allows plugin authors to integrate support for permissions in their plugins without having to make any changes in Backstage core. + +## How does it work? + +- **Plugin authors** can add permission support in their plugins by declaring which resources from their plugins can be placed behind authorization and what types of actions users may take upon those resources. + +- **Contributors** can implement and share authorization methods (such as RBAC). + +- **Integrators** can author or configure policies that define which users can take certain actions upon which resources. + +![](../assets/permission/permission-framework-overview.drawio.svg) + +1. The user triggers a request to perform some action. The request specifies the authorization details using the permission specified by the plugin (in this case, a resource read action). + + - The action may be triggered by a user interacting with the UI, but it can also be a direct request to the plugin's backend. + +2. The plugin backend sends a request to the permission framework's backend with the authorization details. + +3. The permission framework's backend delegates the authorization decision to the permission policy, which is specified by the integrator using code, a provided authorization method (such as RBAC), or integrations with external authorization providers. + +4. An authorization decision is sent to the plugin from the permission backend. + +## How do I get started? + +If you are a Backstage integrator, see the permission framework [documentation for adopters](./adopters/index.md). + +If you are a plugin author, see the permission framework [documentation for plugin authors](./plugin-authors/index.md). diff --git a/docs/permission/plugin-authors/index.md b/docs/permission/plugin-authors/index.md new file mode 100644 index 0000000000..e69de29bb2 diff --git a/microsite/sidebars.json b/microsite/sidebars.json index 43e9dd3978..c6643eca5d 100644 --- a/microsite/sidebars.json +++ b/microsite/sidebars.json @@ -256,6 +256,7 @@ "auth/auth-backend-classes", "auth/glossary" ], + "Permissions": ["permission/overview"], "Deployment": [ "deployment/index", "deployment/docker", From 8f216f89bee40b9a240cd770d507bfb75b5cd8f7 Mon Sep 17 00:00:00 2001 From: Joon Park Date: Fri, 11 Feb 2022 20:38:29 +0100 Subject: [PATCH 02/50] Outline permission docs structure (#9485) Signed-off-by: Joon Park --- docs/permission/adopters/index.md | 0 docs/permission/concepts.md | 5 +++++ docs/permission/getting-started.md | 5 +++++ docs/permission/overview.md | 4 ++-- docs/permission/plugin-authors/index.md | 0 docs/permission/writing-a-policy.md | 5 +++++ docs/plugins/permissions/index.md | 5 +++++ microsite/sidebars.json | 12 +++++++++++- 8 files changed, 33 insertions(+), 3 deletions(-) delete mode 100644 docs/permission/adopters/index.md create mode 100644 docs/permission/concepts.md create mode 100644 docs/permission/getting-started.md delete mode 100644 docs/permission/plugin-authors/index.md create mode 100644 docs/permission/writing-a-policy.md create mode 100644 docs/plugins/permissions/index.md diff --git a/docs/permission/adopters/index.md b/docs/permission/adopters/index.md deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/docs/permission/concepts.md b/docs/permission/concepts.md new file mode 100644 index 0000000000..d9b49a3c63 --- /dev/null +++ b/docs/permission/concepts.md @@ -0,0 +1,5 @@ +--- +id: concepts +title: Permission Framework Concepts +description: A list of important permission framework concepts +--- diff --git a/docs/permission/getting-started.md b/docs/permission/getting-started.md new file mode 100644 index 0000000000..e0138171b6 --- /dev/null +++ b/docs/permission/getting-started.md @@ -0,0 +1,5 @@ +--- +id: getting-started +title: Getting Started +description: How to get started with the permission framework as an integrator +--- diff --git a/docs/permission/overview.md b/docs/permission/overview.md index 808a93119e..7b1c25669e 100644 --- a/docs/permission/overview.md +++ b/docs/permission/overview.md @@ -36,6 +36,6 @@ The permission framework was designed with a few key properties in mind: ## How do I get started? -If you are a Backstage integrator, see the permission framework [documentation for adopters](./adopters/index.md). +See the "[getting started](./getting-started.md)" permission documentation for Backstage integrators. -If you are a plugin author, see the permission framework [documentation for plugin authors](./plugin-authors/index.md). +If you are a plugin author, see the permission [documentation for plugin authors](../plugins/permissions/index.md) on how to integrate permissions into your plugin. diff --git a/docs/permission/plugin-authors/index.md b/docs/permission/plugin-authors/index.md deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/docs/permission/writing-a-policy.md b/docs/permission/writing-a-policy.md new file mode 100644 index 0000000000..aa66e92e58 --- /dev/null +++ b/docs/permission/writing-a-policy.md @@ -0,0 +1,5 @@ +--- +id: writing-a-policy +title: Writing a permission policy +description: How to write your own permission policy as a Backstage integrator +--- diff --git a/docs/plugins/permissions/index.md b/docs/plugins/permissions/index.md new file mode 100644 index 0000000000..56ec077895 --- /dev/null +++ b/docs/plugins/permissions/index.md @@ -0,0 +1,5 @@ +--- +id: index +title: Integrating Permissions into Plugins +description: Learn how to integrate permissions into a Backstage plugin by following along with this Todo Plugin tutorial. +--- diff --git a/microsite/sidebars.json b/microsite/sidebars.json index c6643eca5d..9553b4b566 100644 --- a/microsite/sidebars.json +++ b/microsite/sidebars.json @@ -223,6 +223,11 @@ "plugins/add-to-marketplace", "plugins/observability" ] + }, + { + "type": "subcategory", + "label": "Permissions", + "ids": ["plugins/permissions/index"] } ], "Configuration": [ @@ -256,7 +261,12 @@ "auth/auth-backend-classes", "auth/glossary" ], - "Permissions": ["permission/overview"], + "Permissions": [ + "permission/overview", + "permission/getting-started", + "permission/writing-a-policy", + "permission/concepts" + ], "Deployment": [ "deployment/index", "deployment/docker", From f26bcf41a02db62d9bb2fca3d235e883ec1d254f Mon Sep 17 00:00:00 2001 From: Joon Park Date: Mon, 28 Feb 2022 14:05:27 +0000 Subject: [PATCH 03/50] Add getting started docs for permissions (for adopters) (#9810) * Add getting started docs for permissions (for adopters) Signed-off-by: Joon Park * Minor formatting and wording fixes Signed-off-by: Joon Park --- .../permission/disabled-unregister-entity.png | Bin 0 -> 291260 bytes docs/permission/getting-started.md | 134 ++++++++++++++++++ 2 files changed, 134 insertions(+) create mode 100644 docs/assets/permission/disabled-unregister-entity.png diff --git a/docs/assets/permission/disabled-unregister-entity.png b/docs/assets/permission/disabled-unregister-entity.png new file mode 100644 index 0000000000000000000000000000000000000000..f7975a0ced86b81dde2a1130c8de17c9a202807d GIT binary patch literal 291260 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%0DiREs^F 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%0D~@dvl#yk0)|fP#XBO!S#mJ|7Y8UqwW8Y^p;g-v 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

76Ph8hf2X_x#83B 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±Rgnz zKSl$csAPFuRg$>s-DRBjx8*Q1>&yJw4|wmryIUfaT4gcEhkGLZDBtF5n+vtCC{0op z_pNw2HBTzX3a+(Y^xzQv_Ew=QwuR<8-xW82r@+lHuf82nkWsw9MyQS=h12^1^ z!dMQ)Tk!$PBP$u{fA3)J7brS0#QfE!yC7I;A_zsPPUuFNOnk&_;g-=+C4PeAk9B2yR}6eK9k%S``vVutKZ8X{<=!*dx2JPTUA>yyYnb8`~4lRGzN(P=62sujc z3=qss+5i-1_;&hle(P5pReH{qG|o9}+PSJoGinX7t@s`X!ikzU^)=E(_-_*n|6t=V zFI3qCwCgB$>-ez@y{nynyjiLpX_g@r8OB<^+sACPdjJG#$4%^txbGFLkcf&ZG^)^e z#=rf+_%4?bu8~qrYWO>%v7;V7w{6+j;BS@DJcj(=K5gcl`mO06u<(kW@;q=YYLTEF z*2ZKKk(eqpz!#9rd!No1Gc0+kN*r;~!tn04torRh1tBg9sfwmYiqF;We-QcLwtB@O zNV$V7I5YpjkSAZxspOjG2?15cIi>o2onq@CIKtHWYXiPEsf`_s_q&}u<;rIrQEZ9H{4e^QLs6%nnaAXts)z=-gDYRW7chL7 zwMR{fw~nwM!$9kSH{mKS}#N-%6zSli)@!yiFqZN zKVx`85@~wwc-axy#%Gj_SHu3+NQVj4o;4TODl|@R-(1Zf`B?H;hIk0{WedcS45=cC zn!Db<76J=+Nk6jACzi#$uubpv{R$#0wj4Y6FT)vdf|Uhy>^D;73hcwpd?i-Xz)1g%ph&om0Or9nI_8HoFGcd?g0vIXQY z6ao(PfiG3Sd0Z~jq zxeFr0ER`pw*Ps4}a0u9_oJ=P9wBF`q4cj@PRC!K0p8VMcg{iI>O=~Z8Ervr;-^b_X z^-6>GOk38Ee}ppTGc2dGna6#tC#;yJ+HU&PW=PCvKbc*}sXqMcL%%fQRH43>vvtsY z)cb3xdV90c_-7@l!)k1!>Cm+G)cpA$h%%m5=}!OW&~UbVezx;1uj(KEA;+=~j=*8l z<;&wfR&XdjBwVT&nW)<67h6qQjbr?5Y4P2~Dt>*mRRG^R!SiCDkL_d#pM0+%K=&{q zLv2hG6D4o2C@|x5piDfSzIOWMe!pFD2_AQZ=fydn>CEZPI|lnQhoezNUa^NP@|txn z%*xj830VTi;V08WYhusa{A@*AMrb_WvzmBXSVZlNcJU>?+2rFtPngNxItVzk8N-pI z&0bAy{ANUFaDK}E-#c%g){bfD+(=exT2I*SW%RyYqtv6Yb#iK%=(x#xX0)GjHuo*h z&Gr(n)bC}w{v|Kp**V#Qsc}hz6(8omFCj@G8?JKd&Y=$uwgbe@*aIrrKmLJ>w!4$? z+0vTyk+p~2+jD32v*iF;3a1Wrh11RmV(-;Q7u5%>cGT%J#l9u3K1o5-Zh=j%Z=#zg z$Q%xFe2iwY=;dU4XSvcTwMwro^0UHr$F>y`^IAh)zp^-g3rO^HG|&je(fQ>yjXq>o<{8r>`M{4Bx|^)4sZ zZpRtluziB_EX%k(2*Y}x#HnJK>kw57-39{zZq5ou@9P~9adYTq#F+hjsN6RgeP4(ckwocTGwj%-jc&6j&t+m zDmmcAP)?N{Kh$rFlr8Bczt+*iVEso9n)UvC0kW8MG3<`edHg^NTWcvCJmaOEJPOZW z_fx&5*h4zTZv-^IjeXdbivoIM1E+X5tpl1@8v9@04vAKSZ*~5l1w`i}qR0?Ec1D71 zBJ>&_3dL#H^RN{2{Ep(F+-ibyXW)G)%gXH6f+!SW6z{L;XZ@{Z4b4A^*ktS<65q8Q zmFlX%gQ(~OYme9xMuWb<1aCjmAMKnID(Z2D^s&rKUU6<~f{#}yoTPM^^e(T`DPLS| z5AIBL*}ZkEgsI6+5Vp)fC9#B<2wM)rJ*&kx+ZwHc<4?MKvJSrECA08my{1f_mF0T; z!OAV|N=`1&*d9})N&Ar2FXMq@h8B=s9kcR4gz6c zHWL`IR5dg@kR}D%ZY1KM_GUky&1CRQMo-^3Fv}oYf!Dn0F@rcVgkN2l|MZPcUhB{hxGicjhIGVCd?Onu+Pe|t`Yo~<7D&9lO>v&iSix*6--+zMk!i4z~+ z**Z+&XngCtrhCV0-oh)n@0YEZxY@n->-atynf?7~WO^g4Xlq{z{sgM^nHg`0dv7nQ ztrdv;fR}xrPR6$JIJ-jHCmi?Hj*=fw?9H*g{!zPf6-;?J-fp~TFG>*Yc%LdvEIk`Z zcG1I3$7p{#rtx!hxS6D}G39-KhaQ1_pJK9YfAtvj3Np{QKJi_LF7F)8t#3Ci_odIL;FpXUr)X!Wc2_3yknR8QBe^(S<{ zhO{m6uOGPA8dDX`c#9oVoab9xWaoamGFZW{qS4!X=@v|5;3cx8C=#uB>ayE9URm|J zFKLSJ4-=lQ(9%OwygR*z>8Es0U9F6Ne{a$|jiJ?=u;*Y6D^2zbr{VwL`&HLPeH~H_ zyuG&fKMai&FT08@ej(HS{@Ez6)Z#LILFXeAcLh(`R&;G5kMYAVK1W!ef>1|iG~SP2 zzFuh(_bUzPcx}vAB%u_YGHlDu^ zt5p+Nb*Z}4f|&=)EDPh``#G^d;DwC-d-t>u3=+MmXu{=7-iNcGv-`#H{`Y&8@A zCxozNDGi)itm&LyMO&%%gBI#=#v@fCmh=xlp683kA6rRFL{GY#OIQ!Sdd79>vDoin zeIdI{EWv5;&t2snidR!D_mwiE`YSX{5XNh$!@$&O^|{(HlwUGVm~)oiz%F2( zKd#(%0J~dd@&30NuASCytXz| z%?0rR`Eg3iVA&Mrnd)?NNs``gpRC-rN5T`|+(4lQG}YQKZWjG|;lrVIudkL(`aa>N z;pK2;Ck+oycPTVpf`4@q4E=GKr)qppy52bPYLptal@W($grO{`1&dR1B}x2$#bk$O z=W|m(lu^y}+U+)%!ID)SyS%7POe^@fPxF`~My|X%T4eJg-fi-u*M!h=16uUjJN}B6 zbRPC!gb`QqpgSAg8>gWV{_8|6o#izmh-YK)Zm#=}_`vJ&f88qkXlVuCtUOPd0sD~| zdZQU4H51Ez{2VmmRm<67(OGkFT&y(zD#D7BxLX^)^n68k`=j6`AC@#E6Beb9W^4u35G*4yLZ$_6Ae0YMqz zKbS`u2~4-+fHWD5J=KKi*=DKs7<4k>hD&{E{{@G9#*_ZveXGh$$Nk3BN?SwQb%~4e zGZXAG2Y1sJA?T*EvN`H}uIzRw=J?1QL?^U9Q`euVz88t_h8XD{B2)USzE04e_1xeRa9w0xPVRF|nKn^Yyl%43Q&;26W02v)8JL@8 zDJXgJcQ@fs-)La%y191gW`eRn2CcyHa~{5}xW;MaWUiR=;7>mFB zLmS1*cQPPj*%PLjWXH!0@}6~4Q8$gskdPRk8nGRgPVe@`9n>((iM+_w>?dyzj&(`cXGq7xY$K6P zNQF2~QAR@4`j4-EbgmSev0?FKua@qY(p$DdABd9HORdEEOfL!fv_WG&h{-X;c< zmqsg+aIu0;R7)RNJS+Uy@KNlYb;)ttsmgPj3p>(zQZK@ZQqBEJ_Lu0p{PT;AYTsP1 zd6=U`n%Eoeep#E@dYn-CF48E)yn!H@U8+0FVVLdW3TmUJgcYPs8#sdl&pP50yp#6m zN*-EG$Q*db3wHXDx-}DH{?e|X7!%*$?r&9A9HDY?EKGZ?^ z&_>vEf>-=6 zHej44dtw?0wmF!JCj(KF|0RcpW^X|%K@1oyKx@yxS+@&>+5(tJkj(;dXI{C6VFzw^ z$7%N^fb42rH#d0l5IGs5t-zMfDxmAq5#lXb3hWGv6Mlp~(B~2w9tT>Xc`==upo)?1?y}Pi^0r*;sf6}?Q zu|5F#v7YIt2U+~nv4JJPNZm5>EqDuB}WSF{oZgO+h9Af%MN5n zCGX{m=Z`vC?&aPt?7rPCl;`<}^5@cqXo!@9S0>ZzM|VS1wv?6it(Z`e8~u0VOi}rQ zGWiBY-e}4FMs=T>-=g;({R%q9*~{=v9{t;vOJdn>hGb<-D@9=w}|PUJb11s zyPjNjsLj16?vNImyQdw6I#u1Dq~j;LC5MmN2x%*2c(>wFzb)e}4O?l*>0^7!u9 z3m%%+Oqg~Y;Vo3d%%P!a%O9%`(6lpY@H`INzJ+Z>?S)&SzZEY!k2K1m!oX=b;keBj z^o;{TR*vV5p+8@cZ7KP#z55F}|p>NELHtbGBBbe@K-2k$}T-S@Vuw znSVVGNq83vJst51DXu84&j`3UTg^yUv3Z2MfJcI?)`ZEu?WUg4PHpq z(xj8z&299+Tt5)h8a&OT$n()A?Y(VX-a3AK5inwRNn$WR@-$;Uo$RvjPpX&963JDk zs5~Zlja>O1XAbf#I>MZ?`kUPqqXq_Vq&DS>9RGHylIV1(4F8f6tU?4-OqNOI{d`*t>Pzv zHAZhH7hxW%`igH&o$Y#TM?^~)NhWv9oIi_v;>W^2^cTSguJR+`Qx`-g&*EFqPAS=4cl)OU)?7Tgy6#41Bk11}8PYn3mEp9Ry% za{Fb+1b1leHW!6_8y*-Nev7)zCjPKdHl~3|@BYmM2o#zJW+W6c5xqp6^dO8hG&FRy z&fU>9HwZFFsPW2drUVhWnQxQfp{Tk#=v8OIbBP{vHLP$I5IM+a@XuzN^1ciEcW!<@ z({aWV^)`-ho56ihse`x?i~=3@;QWP-1ZiibcE+Ss^KA;3X7Bg!QD?@;sqvjI_quVR$T9U?2*1YVw$JhI{>*IX7)~&H3ynT@cZtB8GhFZO6Sc|H z9U@)fbz`U<;|*BfM3yn8f3JEcS#3Pti6BSE`oir^?ScRorP8GO+?>Y=Dz(|{YcSFd zDk`uwr&Ru`-^`rD$W>(^dRTYl+D9$scjJ1?PxXlCYuLwatCz+DUyq?Po{Kvi+3MwD z%Q2v*OZqh1KlFRC+_F!V*OG|pEfXew>j`{4>@n(@qF(7*UZCf?}<&E)cq1W zk^Y#+v45^XBjaOTL*PW8zEmsCLX5#wQ;xv}O&>X*UuJY&6U*}M4cC-I;ism~^afFD z2_3mR^^>PvvBnrJXMgK8R3A6#pV!$&&ubYsKN9e4epoy^HKju#X2*16Vqt)!XlqD~ z?Nwj!w%jHeZRzAKYZD6#!lj5*8QHp6R+F|mjXGBMKC4=xmiZNDTOy9L-<99CS~O^u z`nZZ1*6?3_;vb2LBGJgVn?HG_JDpvLm5nt~H7$QH^fBeIg6y_4*{%O)dauPBsc zmc1`rHn|eAHz9kk-}8OWcYJ=|zs|XxQ(V{k{Tk2lc-|k!jkZbmU0#%6|B8P1wVb0T z$%D-IblUZx!(eTJc&(-l){6Vz>wDZ*%|gegB;{$fAtR>;*L%DttIv5^jvtJA%`Zq` zidRenX*E;r3|PCQ1~+4^xUC6raWQ549c+~A!LIt|nAc#f__d#ACzC%Z}oCm7}PP@|yM z6|)j+d~)w=8tvapEsaZ@f^kI({TNP|eXTvB3R699V1mNu z1vMu+5>6cq_AIN915^*1LM^sBj=oeYebA}v$oyOz@lApRQ{uMYp`&GY_I31Rt-fS2 z08{be7uH`-XP!uF6BE_JU;V4)Q|YL`GZceVk?W_*ryaBR>)T57QqJ#ZIEwd%eqfp0 za}Qsm#XCGcp6fV6H$C!co_4miZw;XS=1QHSdH2`UyHoS5KE%NtErTepc$< z-{WYCcFHPF-(o(Hvip8cbJp&Qbm-x$YDEf;=8rf$i!5Q(Srs?T!z+$BdiRZWYzJ=h ze8AqQ9BgjB|0>a#k#mUl$<8*WS}90bD_?6%e(85`-^7(igdS348AW;*j<-YDWd=X6 z922HMbm|ZE=8yULgzCvNvP^8Cj)mc7-FqS^$`jZf}pKdxM-()U4F*P8D9;FKtAoUTzb=$z{X8Y~3wV zZX`_1wykwwU5PmF_oSRWHJLUVsuMkUrP z_tlQ)_(HYvS^6-l)qX9`;6w5Er2KE;rq>5cKe9Vk6le2jw|1_(h6?K)seQNLbhSaB z=ZhZA&4Uu>c^uzcsVi1shti(HN4}Bnu4X@WPv~x_8x3kfIWqfJyLZ{;WF^L554?2< zk}|np8!`!(<*}fPzs_p?wOSmu)rNj$`{T|PYE2RS;Pf3U4+pW%6>XEfq4pWusIqCy zWhY;TN>Q`2pcoO#VxoIw_Pi(<&bZKkD&(98-2tj|VxM|JSv={v=R3Pk>?X1z2IkXv z0sMhk$tS5>Yr$0HT_PpDBe~epDxbc7l^)#r;Gnms0z(!ctwtb>PBi%c(y z#{--6%QDZ8ol!*%*}m8vBh1X15x({4?%$N#9szDGM1>VM@LBt+rQ!$WYcwy)=25&; z)4po_EBN`_zd4N|Z0yFZLF}(Wyro8;J~KWHKl+`+Y9gifwmI40zs{2X`Nu3(G`Au& zku9T~&*2;SzIv0JA*CnJXAzl#WYQA6os2M}@oPA`OO{(`^ZI@@)+Y7TH`6|yW~DIf zVM}T~g0Q{eK|UqTqVbmE*j4o_iYiN#O02WQZ)Ka?!%UsbIEQMFBpou?2}7(Xg8uTk zCb(BjEUZ;4t?{@I4m%$Q8Ew;+f2q&BKI`fp;S{w%n`?F1JBn3wr@~lg9yfnrI_8zcAnNNw{%4tKC;%W zeg9!6ji>UHgkCzW0kl%g-=&JBI7*o#1N#Kyf@SHS&Mm*e3QGBLz80fZbD;|N@2)F- zZO|VZgK~xVa;dA^sT^ys-4zw3c%*Z@{<*yWE$#fXmC*R;8(i$cg&96<`1rVgtP;hX z_%(ZkZ@OFf4AL&Q49vZ1+T*MU8aBzLn@T(Syl^CY6lplxc(PeB7v2kzpnSadAwx#! znL~j||6c4fj4z)?URh-Kaj`0O>R1Nc#U8xgOc{5jstGhdt;c^Z38a_aw~wXMjdk!wkSfYIdw-rk zZt#cJ^8dW=f4;(_OCyc8`&8q;46gOZR8fW64@VUy1-*vKA}m=YL$@9&G2WySb2y8N zB1hj~6^&H|!d;irTb7Xws6^o2QI=OY^_4f?VTF_zm+QtQ4ornzvH24==p{viW_NR={NPp=YQB=S zc;l}t`rQQ4ziPVw`K+^v)02Y7sdsIzp&W3F%5(g_oUW5=Ol;s0-|>#$jU@V8vwyGO z-zaFF=-iR&wGu}fyL@6>R^eUQ^M5emn(u^kSM+~gY9`alTA#WiNpd)28P)eoC%S{Z zIb`N~2=NyQpWc{2y=rpASaE zPLnda&Edf3NR_17@WJ4aem*>@X|PM^4()0xxB26QsdB2PFd&BJu}K{lFx_BL__#T} zj!&0$61aE=>+{aVACye$IU(f}Q@^)KC2HnA)iedHTC&FHZ7R**(ad(XF0Yz*4p`0d znEC6PEbT-eltV_S9(d;+M-GJbh%D z9^p{4h=sYuQZ?f%jfazz^S;v@C5feNR=Dgc@`Jc}jKw^hMu~!SK|wt_&r_lBTudI* zl_so~^UW^_U5&f9Myn-)O@9SdH=xouipvrcai+uQu8Oh=WDQsS-%lb;MiZjL5^s{} z9dLUqEQ{n)K!g4I^2J+XY(BDL4=9rFjo{t>9V{3}a}{lG7c*fJoc>3Cycut=vbuM9 z_0FM-#F~SKeyNkndXb1@*a)#j5a){vWx0xvrx@bShbG!E=6tKjF4UbuvAc!52>-NF z@#5_#s!+ejc@&iPN{Wf9$?yN|X#dkP`scHqoyRx4cXvaIMv`y8ZAw68{q1z{Y^+q^ zUA`dY=)I0J!CPT|S-1LBYvsOuBdMRYS<&BHaV(XPYDC@fo{PD?ySB?G`&BT+G0eli zS~PCWt)u_x=kQ0mfih|qQX7qWHAlL-?{B%mhpL%_Mnp4hC+#EM8m+^}shEqpW{>~x za`D28oOv=a{?L>0Vi*T4lW<+}oj2-NT0Snz0Pc>@bI!$KUCuW8fN@*%rB~2|-@_UCvW+87#t?WYyoJK+!rEZs!mZ!;-xM=2i z7);;YIM?DnM#HShA*a6FSuLafBTV(M!UI5`Q&S?R{3(fPXEn&{`ZMQ(&(wP*$6j} z9F_ebP0(hDnMsL=W9D~~Qkh%Wf6i#GnYcZ0@x3i5#R)+vE|`LSXl@H2eVZ=$w@zR7`NJPl6s%8M7B*_c zQUh_emApvMyRD~VreVbW*NGBvq8(1vaDLQ~hlPcI>JPcCbi34H&CS?Xq*vMu{pIIS z`mTOU`@cfV|2-I@y_ibE&-Ky`Jq|W=7~94PZ|ix4;eR`z!IYsv0T~FJl~}Xth{mSF z(p4{B|0S)-YZ0undORH|2hkmpqt-LmGTxL?>J!`l*dE=XCfx~8b957x@?fh7b`01! zbx{=&A15R%ZjRF&TF+^zz{RhnH1X62q*LvvyIy09fL=m<1f)9u`2u31WW{ebq~N;t z$1hHfs_-T9J?AI&#nTgfN^s+IS^FQ37?a1m-&Th1(we8^9Z;ZK~Jfy}4w0g|@X@1ul;Yg@=wpR;-dhWz%|#JkaAwf6fEk3qk&Nhd+R>sU5! zX{yX#I!tXYUl-$O`|Qo)-VM&t6z!PXlC$JjBor_JouNTLP@y>XspmigP~<<~nQ(#Z zpm+X#r&pV0Eb(h2t!<-NGILj-B*sVNe8P67F9TPkYg13C#<*XZYI|UKEiJ9%czD`* znlg*|9?R$Ziv|;w)MqBsUd9#f`xTP;sek`?XfgujS=%^PQS<3ig?DqFqJG4AWqO{> zhl)QmIU48wIxcK#I+PlbNEHEXXk*eW#zT=U)eXk`r<^=nd)evt`{ z%OukDe%wVzDsQ;7jmKsDc5HyCx#OvRRP;OMq8i%K*HRh8w!hzaHjH~1IDL1fG{-Xu zTUGQR;QH(1>isvhira!_9iw^WUJgu^2V5ct-y_gN0O%a7nqcx2SRV)-4`x4Lycn|Q zXxS$Kno(4YIKBX2<^TN72Wo)m6(Xv-yjtw?Go<5EZjZ@)7kOK6ukyuX3L!03$!E{* zSw`dao-G^H)ENnY(9iNcr!dQ{hwcn)UNou!9Grqgw)ln821Gpm7h;N!v<4jocWr;f z>fUHwZ`st$s+fwj=)aljRx8%5K&F{$kH(H_V8mz0q7G%320)mElSjbL!&G)9!M}h(}6hfn2WSXWw0$1{nrV4Bq1{^_E+!Q*Q{0FkuNb_eR1c`&a=*w59)JIb$aUVEgYQu9#ePz zld3vrqdwr?d*mJGR;#a+E+WU9^es|x&>7Ga058r3CCd{LA@{ZrAA_132=6KdC#V%S70jMRJ(P`POH*IfkL`* z%8n!ojb8n53%{qB>LdJ-`UfcP{6owLggCM>0hpz4hbHse(M;`R*fSeKM8PJhDV^Nm z_C^~F%wAQx1?78Em&DXSO3WBdRjw3oma4=W!$kU~rROkx*jGMh-P%WUb%YQl0n6qw z1s*n5V=xg)mRV6?`)4g(YxPxGiFKn#F{-^+OJY3aj9+Q3pMv3on!0qnnS+A^>=^`0 z%chzGwRL~g6vMTMexSZOI`SbCVqnDqfHvrs!@utFGrD$r#p6{ir)Sk=#|+2$bH(%u9_Fr|W=nEE zx)XJC9B+*CHH%RrwUAg2B{D+QK5&nG{HMKL-YQfI4#5`gb#+SnY*qex1wb=xi$i$|V>> zfM*?|$W|6V;fLY&@4C!H!Tw+?2Vf)B90enw79wy-;6x(6Vd-9*a{3-i%vME%fAM&@ z-kR&p-_;xZN|63}KShc9sG)?7BgqNhNyItEm}@SD~DFm ztIW(Bh*u&IVx*;|CH@Fr#Sa_;Aaa7PLnyOGTZsZVDgxIY=m@H+s**5E&zbNBp=baO z5fJ#`qy<0~a6<{p%j01_?=@vK(0J_i+Sb}f{O}bS7 zaHcIE=>`od@C3kV4SqS8q7p!~kB6NI8x_n_L3M%rS9snel{i?hCDt<~2GzewVcW{k zQ433(&c@$p$5%?AoXIEoiPbprCLkb(MYi>()T4)l&gCSu)D2UcH$vC%`0br@RDgH| zW=WuV^Zw(<0Qf>ci31ZW;3oA=Oeh1N9fln(Kokp`2d)G_?7#y6$1ebx0ty1`BKGy^ z<0Tl}t`|pKNvtf#;9R5<-?gQ$7Zkv86t7M+iV`!k5$ylNGxF1#>%L2EW4eTQ)4Hae z3m(UjtgMH~9nW#%>e!nnlPelmO2gSShH!}4taUtaF?w{nWvk8#ZiZ`DN;m-T-we>2 zib+2L`2K%V^3W6)`UAV%Lp}VX_6bBv~Fxdk}CBVl8 ze9>btKL7^`SiK0~&4>yyAptK(a6th;3hYME2*U{;ubKnf78(-g0G$a3P?7m0L60&a zs$qEt@i_ygFc>d=H?O@^S%@?g3A}E4?CkP0QwJ)_YRNg?{Ai)@QVPX#S2_Gguu>! zjTu^l0P_A2B?eC~qv#U>HrDIO8W!s7H>y8{bu7JU=Sos=@wt>F94K27j+qN|6$&qr zc*T_YSuQ5@7HHFg4y*8-%kAB^45+F9pqF-Q2Sq8o@QR`?1GF7@-z^}OMA%L6#K9*O z=rl0m0qEJjpFf+&YdyiltZB|+YQt^aqgF!?HvZ3Fzha`J8~J)gB$bt;+zLqWdX)Rg z<42^49fkGSxp9cAKR5ln(sk1BjQi4A;oaJO(FHe;6!HPS%nP%+IIF&mEFJyn=|9Hm z#8YV>cPa#=(-C*+XN*np{8)6Yx-jScn#~8{D}mc193xw0<(VM7&0K;73M6HOS`JW{ zo1G;B@2!Hq^QN&u?15U|dHUoDkY}5w>?ZAmU`J`B!8ePae5#`(53Ut_e6he2tkLH} z&U~OH$a*dQtn0oH!t1e4;x6Y5Em3+XJ!GY4F34P4ylN(7%UM4@0(*Ol%|BB z>;Wo{5O)Fb3+_lWJ08(Yp$Je5k!%4latd3xmuIUd(cQM^`#3itV4t+Xt7yY*6n_rt zS#EQXf&g#MraVQ8(WqMn{%$b6Pa=TwH9$EJKpDiQ3Se{=2b*(UY4;NV&&Ht-GL=c%cytH3J+W+0pb z&~8Tvl>qnz@e0j-mvHD1z}BC0h>ni7*QlKjxB~~)($W-6FTwH6PVrrWL1?Xr;L4KU zBM&ks$Ncg1?a>0-A@mkzt##$0j7Q4HIORfBB^|m)hl{~udPcSkwbM?onM5B{j-?ri zv&~<6i`i9lefP24>g=U!l)@~dyCyfTfq)`v%8o&f3~+S_P#Pg-BiM8Rv1JHo9cu6p zqLN8hobG|2qu1FAM;~5{@mHBt|Yy_~r1I;n?Bj=Vvk} z!vm!>ta)HFL}cAUmcuWOSU9=?j336)iOkDekCa7&sU}!e0z&ViAqb~o(vlPp8_q~# z7zY7Z6A;7QwtqYVd}t=HX#vKEOg95$5#EWBp;YTvZF!Qrk|fx0js zCPrxKaxOIM-_>I+DpYoT{V}*BxyUnokUsoUM(|C1*DU3E!+h$y9Sd9bU`m9rxsi|;MDJBq9=g8D=_2iLT`53(3-S_hSV1^tLNqcl zOmL)F+S=w;Rb4}I3pxLxfH7EX5VYi!l#u0OIk0L@~+1R<^neHqIf; zQt4ve$q)^~Jq#`;RobNll<-^RVp+i0Ntyqe8H99z$?yC9y8~SO@<)Zu({?8kb1dO$ zYda@zJngP~93urm6kPK{G(=!)6X+*#{ zz9O9oC@;vrkgzwBUc6_0of{%P#MW)2h4R0E$<40n|EwU|7hVCIhuOM^OKa1;g!t&- zN$+5zSNUxeipd=@U+SBGv3l{Z`N{>L$RO(cVFD2*Bu5|@0(e}|l`0VuJgtX_y_vB0 zAwN7TK;MH=lHI*DA)3g+)k#?UU@8QG%3HHx4;$D^3&dp;-$cV=g@0wx^>jpv3gV{H zUh6!5Nq;0bm|ZQq(z%dFIZ_h6>)u47wR>>|*PMlxN3Ivgm{`&*UXZxMNJl(6*<>xT zmdN7S@U||)E|qb7+osJ~*DB?CoEJ_`6y+n~ds)m4xfes!t<^DOD*~T`7Lf-ro?6s6Ys%rvClU)`6F73}BMWI30dGr;t`*A>1=z zF~iO8GX(k}9D#f$t%MNcv?8a(ix*gMHp3)$IFlSiyKfa(Ag0ij700FudX1jRgkTs7 zKRK2G4>Rq}nB*YjK^O;GH;NRBk?_ZMLQI#F5}YJ}R|%(n5^z7^9mCHl0-Bqe`dsBg zI%;ME@wW#^xS`=IxHg%SY^L<<~a)XB6Z;vhLd<>(in)aia{^doH zx(n)<=;qRZNoT`(`v@sUgjw62+yWOgNWahvTT?F8|8k-9-RG_#A@1s`8JKti_%7=f zWOwKpchyz-7$!zKJZyTR6_Ybwi*VvR>)M0iziqOca zT^i}SQ}&CS5aLq#c#a3^>WC31JaO`jeQda{ZiQ`@35x@u72@akKBFF?;Ga0Tg@wc@ zZp7{ffxRQqLQ&CrexD9`D9^5Qa*lRnq+=XCH8l*`fR)kL2QM;ugY)u!-Q|-4yeK@< z89O1UbHTF!{xU3^X?V9EAT0!Ur)P}N=7*TqVQcwE&ErCCroAzFeYo#J~!iHK9MED&cShQvy1V#T#^B zii;qg5xXe(0dRUDe!S%)5lnLNAr={C^bsr^DblrBHMkE zklS2`M}VF&LX5G1F)6Y;WTFcOz+THb6O78|Y`fXl|p3q%CMazz@#c3#8^yKNdZ@l(xB`4`6@!Low#qY9D z0p2nMQE#r^F@~fA#D?wo{+x1TkWnF4N#Gv>6#uUq*SCbV@F*dAyKLOMcISdz>%t+o zG|9^mMa2i@U-?>yRmF>l^+yEoFj_aV2QFARUGf~dBc#J5Y=M`*ZOSs_QuKxY@iTYT zRPO5nftRYWK5*+BstC_)a=$!kBma3n+Rwx_Dbc#_3jp;X`GH6lP8t^FbOk-Vv5~90 zk7Jm?na?rfDD^uOd#vtOyHCBaw9JIuAE^?qPMk&n>3?vUnJ!9a=OeLQ(z2;G6c*uB zL9Ek@wYsi_r+@N-n*cGT860#(+_x|o6cEg*si+L0<^jtK7A-7b`1M9cna-TBzJZ|% zH$*9fBVT%;jtCwV5IcgGU@2H_l7$AuY0iQ*r$^_))AduR8v*`te@WT*g?Ayd9AtP% zvI9WtNQeQJcN_r2f(0*yL#1oU$zjZSFyd(Z@Wcmx$GQ5`okAYM3x$L7LNqMw?41tx zT8w!RgX0;O>J7-9Mj(_pUamj=!dwFp#l#vbSi1H4o^Cx)Hvhf`BB}!~uQkt!QXlcR z4t$q3B-b?nZ-_`n!QTbEg5VB8@D&g|LVXMz7?E|Vk)92K3Sv0|zaI`fvKdDQ2ZY-W z=y|yBp{U&FOq7BZ8U4GFW(W_o=#lfa`C1-AjJp{5X1npg^!U*Pz zoxe0m+z#}u$UF)}ZBX6dOz5ndpcK9b#X6k^n!@sGv3~N56w;3?^Z3<`jbbhtHZ`)! zZ*7QQXJ-%C+M>o;Qh!|1$DB8IY07Wld^My_edKZUywdWuTtckk_eZ7HrC)f=Q zj~;v^;CIPvR!bVUUzvVYu#C82zZl4~pK=?&4P~8BsrC%W?At2(bAvu78 zuhlSTzFdrHsQ25$J2?Ii2vH38J-x^j`I0i(@bDLcksGW>p78Az+$4AD1+&F3ZX98l zIrj+z^ko#oRch%NGZB6I=pUpM+KqD?b-O)ZTEIspEJe9+umMBntKJtkuQ46v0QS|hF^$`tl|xQEh@Zf>2=*_ma40~n?MxwuA8z%7Mt;yGlx07%;+;q{ zFu({gW-&CTUoKxJGp}8`7f`EMUGTPmIhD^S#Jl$79A>YS;D*aUi< z&`ZzqLd{nF$YL|}P^a$Nw>a0x+G;eBLkG+`_-KIY8r&Yni>bc?F*aL1Ve?0n4~4qu zhsv7d^&6eMaQ`6$Zio+R|C*LU?qSO7{>vi@ZE}gpr=A{O{hxs^_V?0|1QC`a!rV92 zo?pt%n1{L<6#HOnD&>;v4TASd6BO3*u%YVood3lf_G>jU(ygY?me-Y`)TJp({gEe>;GRiK*AY=jKA+wz&0 z@bU$>>a?ULW#u6y&9$Roo`1p=czBmED%L(eU-pc5wbAguY<09ITnY5#$v9G*6@B+~ zn52^oPbaFC4`;#)lvhOFzAPqLIg4l=B6sDzx={JZ2OXF&F2TT#$z!d}Hwqt+{w;Z; zCHmAudnw$cvCc~)&1AV-wsYaPaty<@(2~=rdWOPJsb-o5W+;QTo8?8}mZeue2)(|49gJNhVQYO*KcU|f;1@{}9HkO@I{+8X%6mkZtr zR1O{g{A6?aJL-PDubFyJ+V5RaW<;&pNOg4C%XpqN8gp86VWE*b#>5e3e~8Gb=~rYf zd0vYM?MRKorfo%!^2UZWxZ&W8EI0*+q?V1p?4$E%7tO3RW=~0<8yjERK6CdZEODg? zMm+$ZYVZ*#JeoG9x=2e)3x(GDOoDzZ=G^aZ@E|Tn>fykshS(Fz`4ERV9Bx~(OGSkW zOAf)V$9mmRQMJ0ka79}93)lQhQxtbk^7pk3H*P{y9xDAwXIHr)@f)+XL8;K6NIjdI zPSpt(5zu=zdRXs6Q_ATctX1+LA*7Q6<(sBH=NjtaPsw5OD&yZyH(Uaf`<)}wF}YNi zh|iO>b+OdDk!6l^66&#*zvpLu+-6sGAe1!hUQsJ{Pbca_-t92S8|6iWxt)?nq5d@$ zr^FQTgHP@rU~RtX3_(vjl?z5IFxk7;P*7-2?z%57ubd+!3l)lvHmU(KOQV-elYclN zF;wi>3O+T?+4Ir-v3Osfl2vkhl#ckO__8 zk}&1(vip>; zZr1zd&zrU^sP5^l=AH{RWt3sOikjPf^5j`4dO=2o=AEXZV%&i9MchNGl{N64gd<3L zZUE}hu19jW^OmDcspb6E`_64V$5zC&apk=)+@kQ-v!<$gAj6$-JpGiAmaLfSL^L-v zJm~y7E-%~dLM#c4(>>)hrmM7y!kt@TZ9R7+R9b_yT4f}Ia1W`kEi#uEQDlhEq)xE= zzw>Ng+BHgz+GTznhl1J&9N0H+B5s9He1p0y1H=h%cCsiYn=0Og?nf4cuTT+#mO&fP zG9aLK6QT2Kd|y#ciHE($vcySplvu;&FoZ+sIeTlYj5sxv0cS?wLMcGzws67+3Hx_~ zE};w>o3TP_--{-NKub!>Bb~^zg!HJrh*dD7P1Ja;$o=Vx^>1QM(HkBf_2WE{vIDUT z0o8SNbq%JHn%!dn^JDOdUJGG_m4|?Vgxxop!1fJ774Rv7I*|LAO{`#NC5#k1lU}8? zgyYCjBf!(x&zo#eC-Q(yG- zY{Q$c&0Y}H4*E3{taXO=%`M8mCP4b3_5d&AnBJAUZ?NUHHP`ya_4>y$E_YFq{-Y;c z26OCZ`vx>a8(6)CN3_nR@qO-puw!%YJ{hb?{BTrG_Q%p<3qxG8Xfhb1sn!}vIaqqq zvO}Tyvkyio4mu0We@(}&cpS(*i(F}(+nu~@iWzr$^*cy9Aox&@g$#THdjt%Q#rWp+ zq%fIj$1`6O)_pT9B|F=UXH53&R~qhiwZ z{_p@?_haR=MnhZHgX~!0I$r|%v!4@BweQE;<|nlm(%n~Dn!QF=%yd*H8kLi`e?hxB z>x0N3F?-q=D8h{RNHndv5!MI zQEnp87C~$dAXkT65E+(&6>rEb%T2`;4T@bMStwh>Q3!REKCst;s^OF!RTSDEvqZ7C z3CGr0YYlY?!R006U_D&!y&p)Y%++}aWt9CWvt;3{=naQULfaS1E8MS1Hea+~S)rBd ztu$IIqVDKWcv;Y>Jyp_Gvh*+{TBE0~=lJEX3>!-x<@Ba%rdJY=vB63doJtm);{+w| z)yBF=K~o1}1MuF3%Ys6h)SVAGHAR}7ymX;-@NXkQ7Ov+je%zuIACUSOq^(A7Zix_R zB0N*rpsmbO|DLrq(|5$Euibm;?L!-A7T5KxW?GT;X@Z$hneFvwj6KbZ%C!Enw&Q<#9)lJ8lNnWlG8K^e=gwKq{PrX}?a zr$sM&uies)L6&JhMb&Sm%}rI}&Ci8re8cX6-)P3rZ-Dl738#YrGO)Rk`O!$t6xnq#))``HCwnXBks z+nHkV)BE4~7G5*mkmC(H@9(Y0G_6ulyR+8T!)7`|zE?Wa;;fM2Nt)m@Ex$6fPjyAW zz=EG@KM6xnF-?H_OvTgoI*E2xU7>nj+uJk$k)JEA>Iyeb6qL7NQJ0kTlZirTzJ7E9(IA9-`Ryfe$vh8Ex877*%)DhS$T!w7u=E1Coi4f?hbRLjOWyfn`bCA&gspiUF9Dq z49lvSi6lniz?viIl0a(~G1db?4lkq-=QL7X6z}hu^+7=Tk8^wWw{P#j2BFM$q6bVV zpm#f61>PjE)-Si5f3){^axRzdeSK*l{aATgc>ao@0E;!%TLax5c~RPzK8H6Rv*<~{ zGn>5XvJ%GyQqzF$ru(g|Kza(-}*B#d#1%gMNKR^nuL)$il`9ketvey9)? zbJ%>df#daZY#o2YEqr$#^-Yl8$n;k8XYwPsA|=&hIqF{CnHz|ele+wvb?~X+^1~N@ z7AAYQ$-20vowjZ`Az?|#Xp>t1eyX2wLB-N_DVZSQ5(_?7qQCD8PXe43X3~!PwPe|n z%E)n(>R0d|vt&0(sw*V*#0+F8USbKN9+%7984^n-`fIuy)A@uVG<@Zyc~^Df!l?(B zH7gOX$dK}<@(Zsd%->eZi$|iSK6?Cq`Iw#khrp+^HtCg-lGo{xzuu`D=PMsD$5yNa z6_Q*ccC0$M)%|GqZAfI6)iwFTeg3_(P5O#I^M&MZWVl})Pvb*S@cz>@R!&!G&FL-8XhV0{#T=e6hDxPiV8_k!E^>L_9yCBf>A)enE_{RNZ^mK9d*ak&v|Fr zdy85hNtscAc`LWRZBey!mz_4bu=I)WhCqt}gkx6aQ< z>JAU4SX-K$l$2X)USE;>$$C%XpWLK}0AwEEwJ>Ujx(p5FtXmyl=8t93PJxgvX59kt zXOVFWK9q5Z#gDn$O*g$+7m=p7#JWC1JNFR1F}f8kT)YP43MSat;uTBF6RdQeGdoN7 zx)RI7S89yQY}^tl2hY+s|15cJZz}Vej0gVw=^OCjsO-rT-q0RZR;~SFD{iNXzrWTT zpAX8vbf53tb}3g8KVpp6bLP`GkhyJHVq|zOvrZ{UQj})2m{d_c`buC2!L=u*)OxBL zW~P}|hK39`rZx`jD@HZ^Y*mH0!{04S$K2p0GoP8+BmMLDeNjyqtee#7_CotXaPDT+p~uk{d^pp)Vy)%Ur5Z#hb9?--4$&WHlCv?d^)0 zD2n^=_QJBBsHsT-m>aCuKCSNCOQN%yFyQf@5tb^qOy$;2;_dorkuS zf;J0W)iqE}gr_oZ-EAN~$20S>@6!1CmAViT=CjGOzG9SfE4%K~q z>9#NE#)rRd_V{?G{_lJHDf~a?TyCm-`#Mo;H*?>=vl2TKEvTETM#7~M@0l5e4A&ct z$Hq)oqA$)Tu)g^o5SN{Sr)=)k*lCBDmd$(h^6jY zSRB_JI$X&>ceF!)CI91}eu20jQx6C)=-Lp&wR@v;@FVsW@cr7M5)RC^I5ea(y|@KI z&5fj@ZOWgfSizn0KK3|p$7e;PJ=c!^!5;^y5I=8N*2jS4^+}SlVlXVQOk!!*{3PtgI$8R-Aob}FsC-XKaB8c zz-s2cHhX%j>iV!dH%<<+E_^`UVL#(dF|t9s)B6hsUs%<-A~v3D%X%K8U0*r}`Z zuJ>U&Qu!`biT+fpnl={a_E)32?Ws@@8k79-%?)$v1#Ig?E?f%-uc2kWz0zu_<}u`l ztHV}_VXB==5|~#k6*kPbyjE49Q|gNCSAM~9ei&*;09o}K;MTOwv5||>DmA|hmaGfw zQz+wBV0A;U>1P}7HyY744Dm^FT>-{TV(pA zarMDU`C9YL)}(`H2s*2cY&Jpdsle*ZkV6v%}iF8KD~&sbmTPNjZr`T z+q34dWqlT0*Mm7e?O7|@tm29`cp808$S(C#Z;}GjIk&l_GxPp;OKJn%=DqW|!bNlT zHiw7A&uxVtGtxD36E;a+fE@s5_@>$dD=Lj}* z@Ojh)QIXT!v&oK>`oLs`_0BVAJ_s(qn9j{&CI{<6(G(8f`58MjUcjesDwic+DWk~DOQ2uVB*<=s1C3*p*Q+_WCX!z zgH{1_Aju%ATh{Iy<(gB9$rt&`xSbE8RR*Kelj$z1T45L4Kj&F;gda>RxN$hvf+P#Q zPo7H3zEVI|dZ&8a@GtI6H#Ir)qm1XZfqLhXZoPX~`C(YD8k7gL#^v=w)^jWP5o~TB zS>?(T1e7B$R#2~z6$jTnm8+D?7YorQ!+LE9HqN<_$D8uDL)F_(s3-1paRBr%RqmkT zQ^ec?Zw4s$LW!bjs)*zPwk<(k9vHPZz(=2mwn`CBnE@EFDM(&47@c8*z!HC%m>}LV zW!e}fz)?5rL8w!_eYsD)gAXL!Zsyvf(vEih%eU;ke@P$h$Aw@!lq_t{o zcOP#)0nq|w+T2qX$h4Bn%k4H_4yxbWE9XEZM7QK!uWMq?*ylYvNue*=W%pH{X^K1E zPZ=cdx?}ohrG=wz+XEh%(G*$TMr`nYA-%W%RHJ^*U5;st?~zHW4HwlUf$6kErHW~2 z;g~(w-s!fE*GY#56z1|P4jsEv>p27x4eyuFpS>BGfrvN2`E1RCpZ2$s`;JrH4yJy( zvrS4R^=Fq>2!`4I$6Us2I{ic|x$hxP?2GG(VyM)hnw5kGTkZGzAiyu?(0GNg17yVxDTJartdXWU*+s!q1|4+SKLq=38nt7oY+nT z{YFFKn&IDm_Whn-`l+b1Q&*9l2H&U8)X{N*zA1+Kq{WN32sH8^3^uOXI}Tqqm@1(6 zN+QQ~q*d%HpT1UVKKTZkFN2~8$)O06U6CW5uB zOYUMT2lu)h%(d8C%DO2Yb&))qujbw59Tdil>zS+xfGFk^Q6A?irIB5Di`6LnkCNk| z2%WEvO;6W#S#@@`;kB>QEgZST*v`hP61lxXoFus5iX-tp$*y2_u(N8X%8iQK7)ez3)t)W%;>J zE$rrZTT|0_;T-jGI#QUPml&unFwrS8w&Qb_hvzu_5{~=$?gFxRWKc~}#n0#Bnq^EX zYU$oSb#6EDej5APRnK3FBMiMDt-^5c8hXzD1B*bD|A*GZ}c;gTFnshq9idNz%lO3k!~ z`*hIEa~w}ml+TRp=`_}>X{Ye(y2`x*(PHZb!;DrV;wiziyB<8@YQD54=oeIRH zzgz33nOJ*x`^1EXmJj!aqJ-^5mnw8^mg!pOHVl=6bC$I_=Xt82i(HFYm5G^bOYdHB zpQFz4p8cTqQ{j4fl()G5#>o$UyUMZ8J0|GKT{rYY_3U`FVB@sw4Ud1N`_vSMVkhU7 zm@W9Yh@EB#i6#}Aus*m~RRBxjPV~*IZ?wrVD_ovhw^c{qnk9jp0iONDG78bT>|J-U zZ=|@fat$lo)giTWz=-opxT{OU@U*l?N=_1^=+k$#-P_i`uIvxQyw9EJS9G#-Ie%01 zTU@26Xr{2G*($CnrMT>u5g(G>9SsKQ8-Adj;&9SK!^nWg&I_=sgenJvxOfH_uR>+x zppn=|0(>QbllLJm)du?Z0Vt!Z99j)%@l$(f9tIipjf`|wIWJe7ogN{oGz6vx+Fn9J zLc|BSb65ow`9KAJ!z4HAJgAo{;vNHL@Q7&4Ze@rE1{5l1W8{&v6E?#m6$-e+5SI}! zxB6IIO!^9ja-NljA}2pI1FzqGIjJ*oi1=L(SNMn?E`B&(4;G(|y#Ln_rU6og?EPR6 z0tD(pUi;k8eumu?Dnf|Gumg4f9w0b9Z~C|ZQwIYBEubcGgg65fcQ8g1&#Bh|HnJUH zGKhE)efs=)3bG1B!mR7H(E`H6(t=o6<2pK>i;JH~B>v5RQQS^dBPo`m-!A*QoIm#i z8zS+ZU*DBG3a?J>n-+ z8OtV&M$I&BiMK35#+;1ec@#-@-)iq}k}r{(r|jOFe0igpTT`jI(#E}KAlmV(av@)B z!S*JZMY*-64a*D6LoHGqKVrInr;9-18pE{Fb~6fb28N*vw1wCfH6on2pYr?nGpIv> zqQ)3RpWm$pr*}Nu*Bf!&|5h&Cx_x^ZV%d*SJpEEwmkfS3hz=Lg=SRsu`RjD=Ymz9m zaJ4vOU~myM9iZfZSOQ!!vWtq|qUk)tEi%00k+w7HvY;J|4(zT?0AmihrY1N&466@Yp)tSr*Y}M-d?ws`})cg1EU%{k+>v09LI2hc{Ze-pf5_!#_R4y1-iuJ@4H`vv>>GLbp+<7L4 zunwUrPx6~njgGi6KD1O9O-*sNi@XF>uP^A>5Ht?Al{~aY={{yr=W9%TI~Z8-0M+zH zyTVJL@wiD)uebVj0QJL8`*@QFHRD6_0eMh0_bb2b*|WCY_N4IcZbrcc!!IUT#lD`k zyLT}>{o@9M3!&H~)hI^q>e?8m1+)}x*`T1x^p+E=oJU6MuzJsr90(7IA!tMdccbnL zXILZmQW0H2p&L#0jVCgts8VMT2i1NI>}% zW@A8ujevTQNb3M}A*SC=qO7fnI8#bjx`l${;^M%DIK$TWXykasLL7N|MsSI|9IJ|( zK}Uf>EO^rzo*aUPC!k>YQ(i|PrM@gU-6MMIiGv>33NRxY{%(~pz{QvPLseO{MX+w; z^55z;v2!4lLHeunOIK^6KvO2I(vuV`8N-B(X}~Z5{8}{)4PJ0YW|GSS;apkS-T9t0 ztH3BeLjU>sdB=IQL-p9Fyn9o3|IM$$7lWYL_nAo`pY5z&>RrvWoKTvrsB4PR$0qiq zN>S_unL)SCEa}^8k8jh&O`_1A)NHc@4jVAN)`*M8XRKP4a-k=DV?&3>Tj>nn~td)OQ>_5$CmvN8$ocyRonz=zBj zI^hy36cB2_m_DS)u*%_IX3WngmHP23mOfMl#ZzFxpS3ksR#sfN^AqZi&7AZs4!4(J zu$&3t?nGWD8>u&(9aF%-f};}*gONcn_?w4ukZg|~6A=@GmiPtp9d!z`rYDd5h+zm- zJM3A^_evu$yBnGse4pGjj*CXQ0C|7SDxMToWCPo)H6TSAcjc= zhLxa#WmA51d9SyIQiEbHb&g4{Y1QR}f1Qe6a93zSzuSn1|Q1>rX~ z78J8e!}Id?Pfj&OFCzOiiU&QhdZVC=hR!7#Mc3GViaS_vIaOYQ2feG_8g-UZDc2IR{N7Z-0W7)R<-$vOph3pX(naRi=QIRGon>5H)*?T1`WkiH_ zqG)huRA$*NWM`HhvaH&=W!m#cO1v>Cr2G<>`!)h-itIl z!1JgxPeRS)I9WS4{`$)-j-_|9*YA3oUcN4)*Up2ODTSDsl%!)~vdQ1yp9H-Y#OCkp zKWv8{gg-vAr^gcB2zbc=0KmXe*U$h;x8?Ka@VjT>ap|94pbggsT--Okz_od^_Q##L zp(o~Gqf&+u0hyrYxm%Z@RNs3Q_vT1TwhnrKJwexNX!ClPdgk)VF?pn=CBcjFs%UFx zCpsElOHTgq<;$*oD`dxC1fSV(nH*pb7UVNa=H}x&1-&@dxu{$`!iL}z2u2nY@sJV{ zx=LaiyFHRhSZF32-#lC<#Oz_+7z>((^gy+iAiETsCsvX<%?Jm5M$Asb;M zSTCp8>n9IUDiLIT>xB*Ac=-JASl-E(%oV-xNg$uZNcsAexn5+&zLqa({{@C(psqx+ zjA54>=xG6X!f$rO!lIFiMb%m@w5)sQu3d$JYXSCVdp_<&O6&L~&j$H;a_%dHgjW;g zohmP3L6XQX4uKi62$mH@k6#gbg2Wa{F%XDUG-4Z0t=M+X@HSt&9{opJ8?hbY=LKG6 zYiC+p6{)>q6X~{33j_f@oBO%Muq*#W>yl z=F*&jPl)HoS)1`kw`Y&AQAHzga3U*s)ot!S`x*JXNxnJVZEZd8vK}|ZhvBkPQ5Z-QG6qrQQ(6E(odk4FW=SNBWV z;0bA-Gg(11RwbXAtq`L3q2uKiBzL%j344KzoE)lj{p3^dIW;1`QFztU@A?a)tTLr> z75M!w$^vOY2#zI676sPk^&ytFo2`svbzOJC-pm2p2F|1-$B$q7a^cvqlJ9rZ&zwI$ zR9G)X_$eeU$Q`3EOD-;t5Vqhdf!c*BO63>L=2{UC)Ud_ zQe`zm8be$kB*F)VBw>J%c!h$YLzcio*kv(yqS#yt^Kk%9e1lUP_x#DZY{(D5YPe36 z&ACHWiBpp#X7p`DV@lR|0z&*R z0MPSo><(7io{Q}@9gQsXr+GKWJ)ILBsAm4iZOf_W*}3YF7M-JPG{}EQNhCFO55ue1 zw!dA3bt271!kAf=?9R&WcDXEgp|#T4_o={>6_V&lvm(2uXa5ZQyz;6UpO;xWeerrK znmsC>exwb4h$=#|9(E9Lpv5b{JKbJ&t1kU4A|k`!my<4f$Bw}aBiRIZ3Q~os7^~%w z-Q&enl`>F|)2z+Mug$M@yqfNNI6fV)JWY*`b(9ZQ_Z%+aDo)2Xs8O_SV7Y3V8Hc!K7POY)r&yslHo*SO{ zH+_voHcP)rJtPN|BsA&fLr-FEbO^7;thZp41j`d^tJ3_J`Y15d8l~`n)#{Mdug5O_ z3|1>YOl4(cf>5C_$E*G33K4uwG-YY_8^?Dw94NG53Jj4Tjg$lrD zzw>JlbBLe|f9NwwValeJX(G-e8zHKUrxO!jpEJDdzQD7(khR7QR}`^eEU^C5!X9xP zrdar1+=d&t5q~LOU)!=)P&&1*Cy|+(NHF2a?)+NQe&A4DLVh{!`pxlu&n)d zS&O*2`{K9NrHNW1H-L7B6+ZO&cg6uB_p$;uzb<)r1xtjOitZzQR%^3XlW5-DkFfG@ zS*1EvCvpjC{~@%IfQxPUhiS!I!VEGIF!yS7YzzP%-8gwHe=Bw3THIo_bU?7vE}oU5 zA4}?+q|BqtiX3d(=n7LbPZLI6bfA9o;{5W=J&kJkuP`Mx9LNXkfEsW5`mASqFRfv%qY>AZ zhpbk&5RO2sd<4x@u19n9ka7 z(r1@bOj##zhr*D03)x!x%ctvn4)?apXCy9BT?x`#<1wM6v*-{~JT+imXJaGm7OZk$ zQ`<_(x8dMRsRq$AH{5qTpiWFaUNSAfH@LlAnwDCcPl@i`NesW>-%h6U0ENQ7Sv!6VGjR8NcQ!&U)PpPtC}mHQ(OLQ zwX)H@g!k|R4p1T3@lV0rs!lh^&v!HjM0l#iI_<(L1sex0ek}gyMJL)5#KEE1FQ2tw zI3vA`;p5n5LN^cOzI@4v77;-s-YAHJ2b2gCKb+7}STaT?CL4tGb#q?G1p0BT%r z;fgqBhbmm@(l0^D`nL*g=ArPP2i65L%p4NF&W)EsLat*uyN4?RR>1Xy6BZy9UEBci zp^(ndhLE&aU(fmDNFLz!E6$Gr-T(_76-bgY_IN#AT~9N!~J}dgS}pLWRFS zyvoh3IrqRpX*{x*ej6<%asxEqAYr)gTUZA|hyt$q=Ea_9xOr^h&Mls9+C2$tF`o_B zx81!9%tRLxJY|7+^~J4l7FKtara6`QY7ED!F5K?=Y4EdU&tVnSf#u&KGi-FgFU zCcs;r%aQYIw{mESY(>2oTvM6zh}wiFiCdz z(H|_zroBm2PhuHcKi3sXGBPvg6ck8r4olg0CnqrT$O8^Qk;hy!$H>L2i(|QcA9-D+ zD8l?KplK|#I((R&NhW0)(9edlELbJc4#W4nnd!&=>Z5bVOid#J6qS07mrge^1SXBf z$BmJR9SUcJEK%(xy(`TghF5VOl_-Jnz=>(sQ|jHS=_&hJdL8;;!hTbV{uKuIKBlaA zM@2>D)7HP8Z>Qa}=$jyATWo9^FGwrf?y=rNocZkqc24zvxg@KDyFG>(iA_T!HZJ80 zVgzSEyfCtGjrlh$GP`zdYW%iUT3R0=1V{!^HW7#y@z`W{?hH$JCetAl!#hmW$%K9g zM-Q3mzuk4tp4Ec#C^KO3EOD9Go4PwNmm5W&mey~B;67kN&Bmylx))9#U);K&@Kb|lV>gem!pff|_JNtxv zcK{qs1w^R3eWOO|j3bMDTIO^UZ*e})bHiP2_4aZGVo6;5{Cm**0RK;GPfr{W<@JKP zGl%Yl(g|vOO8BW6-<%LDBM@$<;OE8kj>3~>n}u~Y!`7KISKi6d^OcS&4?NxRZKa6LZ3-o4u10)UpvrJexf6LO-LZ!0s8G(MD8>q3NTd&8Supf{ zG_r2aBX<8v&yw=6d&YihQnW5*x}r-BhKmughBHhMswl_+j6MbYQ)Z&25*LbRO2j$L zc^wIKWn*g3sWv#s_~ew(&^Q1n3u?jziobjqx;?onfA{So*gtiN&(w2-3Rv| za+~ZIFE$}rth1LRHLc_{VLg7G4*Y$Z7zTuH1DJF`lx&1If_V7ERZ67C)hI>cfi&t> z{7i0iAXW*KGwC&+!LO-$>0Bfpu*Hyq3NUev6od{L@NNpzQX;-VW^N5>O=})A-C6eN z<=0yobr5-NkYHb0o~*SSal|f#)*G@k%q#&A!}8*MF1ky=%~uSRlDOjVBG^S|#v_-f zdQiE*Sj@YkXeF1XE0v-$*0Hg%tzvA5< zWT*#+p3KrOES{n^T6YmJt3#eaAIVMFi6~; zM3V=iZ3BTpzM&DQLWvh6!$=&#-j(r-?PMX5A8>}elD_Jppsv42EZzoQMJJr?W@ajCop9fRX zxXz3og8Qj|I&00ZM_RbL(Y0a7ok)5BMGsWR%~8eKw9)IRvof{;7*Px}M=x zOpuxM^O?#B(`#G4<=$9WaNUM*Nr0pKY9+7_FARw*A5bwd;Qye*fXa zxAXItw0v#S#J?#qgF(ujtCZ12h6CPea&fG{`0Eb^T1o;HcxTU!?DRO?gZR+6I9pp< zf&i$fuFQNS44y=c4zr0ul6h0QS@^n;4cFUgRkTWhaXFMg72&`S2Xl^7`E9?|B0JuC zD1j*#%|(r#+j*=n+k--|!j>9mvw>T{$Evqs!`-h-ZQh}or=+ZmRj4gC$(=m>J&9_- zOO3Yrwu_~>68T5Svcp#aoxmrwpJtZ@(*QB)tJ$J zMdt-+gL>C0)?zAMRy1z!d!+I6KPBx+s z_At7d|63s0%W)r5hlLd~ZTu^N8qZJ02VMbC&sbv4jK7ez>Y-5{BIxc@&#Ms%%F$Ry zUxQOX-H!{+y=t#;%Rhmkc)7cGg^z^pAWSdL4A7f?n|HSp#>%+NyslKa)y)I2uiFVopA_)Si zsTA+Rzg%zn=aMG`lhDt$dNGq zMhRSCDsw4o1F9<{jLt%04OaycT!PGMNR<^Specklk62G6;jpKHEDIV?dit0OS;T6> z@#NUobFRPs8A;&dt6E&Dxct57oX}dynN`kRtwVPM4;MMTuJ<0*=!|YOUJg9dJ-e(g zwM<*dN?dHXZ&2n?wRyF+w?`pofqZGR#@a$NnupMLz92w6)Kf%)3*B2SE_~O%*THAz z=i!_H0T%<20uL5MDPZ~1n=a-ObrKS3TlDFIqn+s2gi?U8KjSDM_MK6GSJbQ?V^`}E z8#4ZXT7bBI=#CCOl6XK%G;RW}F6O_d^TksvKOQo`LtxRgxO{&33%FFQ>>|H$Q>1td0b((x4L#F678DvXbX0D_n#!NYAk2?EL(A zvFDMq5kHAC8tj`JT!rxX$x{pE#EZ^O+%5L*W519(tsJ!6!K-QGDwI{yctY- zexJQ&m>z6j$Ym+TpqNN)$4X|W?2SCNo7RtIrJGOb$?Qd?au3O`Q1J{5)DuqUCNBKms9>OJu$lLNZf$# z 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�Qs{*>G(F{SMM++KRWrNQd&M$cE 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 + +Backstage integrators control permissions by writing a policy. In general terms, a policy is simply an async function which receives a request to authorize a specific action for a user and (optional) resource, and returns a decision on whether to authorize that permission. Integrators can implement their own policies from scratch, or adopt reusable policies written by others. + +## Prerequisites + +The permissions framework depends on a few other Backstage systems, which must be set up before we can dive into writing a policy. + +### Upgrade to the latest version of Backstage + +The permissions framework itself is new to Backstage and still evolving quickly. To ensure your version of Backstage has all the latest permission-related functionality, it’s important to upgrade to the latest version. The [Backstage upgrade helper](https://backstage.github.io/upgrade-helper/) is a great tool to help ensure that you’ve made all the necessary changes during the upgrade! + +### Enable backend-to-backend authentication + +Backend-to-backend authentication allows Backstage backend code to verify that a given request originates from elsewhere in the Backstage backend. This is useful for tasks like collation of catalog entities in the search index. This type of request shouldn’t be permissioned, so it’s important to configure this feature before trying to use the permissions framework. + +To set up backend-to-backend authentication, follow the [backend-to-backend authentication docs](../tutorials/backend-to-backend-auth.md). + +### Supply an identity resolver to populate group membership on sign in + +**Note**: If you are working off of an existing Backstage instance, you likely already have some form of an identity resolver set up. + +Like many other parts of Backstage, the permissions framework relies on information about group membership. This simplifies authoring policies through the use of groups, rather than requiring each user to be listed in the configuration. Group membership is also often useful for conditional permissions, for example allowing permissions to act on an entity to be granted when a user is a member of a group that owns that entity. + +[The IdentityResolver docs](../auth/identity-resolver.md) describe the process for resolving group membership on sign in. + +## Integrating the permission framework with your Backstage instance + +### 1. Set up the permission backend + +The permissions framework uses a new `permission-backend` plugin to accept authorization requests from other plugins across your Backstage instance. The Backstage backend does not include this permission backend by default, so you will need to add it: + +1. Add `@backstage/plugin-permission-backend` as a dependency of your Backstage backend. +2. Add the following to a new file, `packages/backend/src/plugins/permission.ts`. This adds the permission-backend router, and configures it with a policy which allows everything. + +```typescript +import { IdentityClient } from '@backstage/plugin-auth-node'; +import { createRouter } from '@backstage/plugin-permission-backend'; +import { AuthorizeResult } from '@backstage/plugin-permission-common'; +import { + PermissionPolicy, + PolicyDecision, +} from '@backstage/plugin-permission-node'; +import { Router } from 'express'; +import { PluginEnvironment } from '../types'; + +class TestPermissionPolicy implements PermissionPolicy { + async handle(): Promise { + return { result: AuthorizeResult.ALLOW }; + } +} + +export default async function createPlugin( + env: PluginEnvironment, +): Promise { + const { config, logger, discovery } = env; + return await createRouter({ + config, + logger, + discovery, + policy: new TestPermissionPolicy(), + identity: IdentityClient.create({ + discovery, + issuer: await discovery.getExternalBaseUrl('auth'), + }), + }); +} +``` + +3. Wire up the permission policy in `packages/backend/src/index.ts`. [The index in the example backend](https://github.com/backstage/backstage/blob/master/packages/backend/src/index.ts) shows how to do this. You’ll need to import the module from the previous step, create a plugin environment, and add the router to the express app. + +### 2. Enable and test the permissions system + +Now that the permission backend is running, it’s time to enable the permissions framework and make sure it’s working properly. + +1. Set the property `permission.enabled` to `true` in `app-config.yaml`. + +```yaml +permission: + enabled: true +``` + +2. Update the PermissionPolicy in `packages/backend/src/plugins/permission.ts` to disable a permission that’s easy for us to test. This policy rejects any attempt to delete a catalog entity: + +```diff + import { IdentityClient } from '@backstage/plugin-auth-node'; + import { createRouter } from '@backstage/plugin-permission-backend'; + import { AuthorizeResult } from '@backstage/plugin-permission-common'; + import { + PermissionPolicy, ++ PolicyAuthorizeQuery, + PolicyDecision, + } from '@backstage/plugin-permission-node'; + import { Router } from 'express'; + import { PluginEnvironment } from '../types'; + + class TestPermissionPolicy implements PermissionPolicy { +- async handle(): Promise { ++ async handle(request: PolicyAuthorizeQuery): Promise { ++ if (request.permission.name === 'catalog.entity.delete') { ++ return { ++ result: AuthorizeResult.DENY, ++ }; ++ } ++ + return { result: AuthorizeResult.ALLOW }; + } + } + + export default async function createPlugin( + env: PluginEnvironment, + ): Promise { + const { config, logger, discovery } = env; + return await createRouter({ + config, + logger, + discovery, + policy: new TestPermissionPolicy(), + identity: IdentityClient.create({ + discovery, + issuer: await discovery.getExternalBaseUrl('auth'), + }), + }); + } +``` + +3. Now that you’ve made this change, you should find that the unregister entity menu option on the catalog entity page is disabled. + +![Entity detail page showing disabled unregister entity context menu entry](../assets/permission/disabled-unregister-entity.png) + +Now that the framework is fully configured, you can craft a permission policy that works best for your organization by utilizing a provided authorization method or by [writing your own policy](./writing-a-policy.md)! From 6658a827132c3cc79cc50defe0a9738b5bb169c3 Mon Sep 17 00:00:00 2001 From: Joe Porpeglia Date: Fri, 18 Feb 2022 15:21:41 -0500 Subject: [PATCH 04/50] Add permission concepts docs Signed-off-by: Joe Porpeglia --- docs/permission/concepts.md | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/docs/permission/concepts.md b/docs/permission/concepts.md index d9b49a3c63..cdf4b58153 100644 --- a/docs/permission/concepts.md +++ b/docs/permission/concepts.md @@ -3,3 +3,21 @@ id: concepts title: Permission Framework Concepts description: A list of important permission framework concepts --- + +### Permission + +Any action that a user performs within Backstage may be represented as a permission. More complex actions, like executing a software template, may require authorization for multiple permissions throughout the flow. Permissions are identified by a unique name and optionally include a set of attributes that describe the correponding action. Plugins are responsible for defining and exposing the permissions they enforce. + +### Policy + +User permissions are authorized by a central, user-defined permission policy. At a high level, a policy is a function that receives a Backstage user and permission, and returns a decision to allow or deny. Policies are express as code, which decouples the framework from any particular authorization model, like role-based access control (RBAC) or attribute-based access control (ABAC). + +### Policy decision versus enforcement + +Two important responsibilities of any authorization system are to decide if a user can do something and to enforce that decision. In the Backstage permission framework, policies are responsible for decisions and plugins (typically backends) are responsible for enforcing them. + +### Resource, rules, and conditional decisions + +In many cases, a permission represents a user's interaction with another object. This object likely has information that policy authors can use to define more granular access. The permission framework introduces two abstractions to account for this: resources and rules. Resources represent the objects that users interact with. Rules are predicate-based controls that tap into a resource's data. For example, the catalog plugin defines a resource for catalog entities and a rule to check if an entity has a given annotation. + +A policy uses rules to form a conditional decision. This tells the permission framework to delegate evaluation to the plugin that owns the corresponding resource. Permission requests that result in a conditional decision are allowed if all of the criteria evaluates to be true. This conditional behavior avoids coupling between policies and resource schemas, and allows plugins to evaluate complex rules in an efficient way. For example, a plugin may convert a conditional response to a database query instead of loading and filtering objects in memory. From 8c248b88262358aa026925cae4b23a5e35cbdeff Mon Sep 17 00:00:00 2001 From: Joe Porpeglia Date: Fri, 25 Feb 2022 11:21:30 -0500 Subject: [PATCH 05/50] Copy updates MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Joe Porpeglia Co-authored-by: Fredrik Adelöw --- docs/permission/concepts.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/permission/concepts.md b/docs/permission/concepts.md index cdf4b58153..b82df730c5 100644 --- a/docs/permission/concepts.md +++ b/docs/permission/concepts.md @@ -10,14 +10,14 @@ Any action that a user performs within Backstage may be represented as a permiss ### Policy -User permissions are authorized by a central, user-defined permission policy. At a high level, a policy is a function that receives a Backstage user and permission, and returns a decision to allow or deny. Policies are express as code, which decouples the framework from any particular authorization model, like role-based access control (RBAC) or attribute-based access control (ABAC). +User permissions are authorized by a central, user-defined permission policy. At a high level, a policy is a function that receives a Backstage user and permission, and returns a decision to allow or deny. Policies are expressed as code, which decouples the framework from any particular authorization model, like role-based access control (RBAC) or attribute-based access control (ABAC). ### Policy decision versus enforcement -Two important responsibilities of any authorization system are to decide if a user can do something and to enforce that decision. In the Backstage permission framework, policies are responsible for decisions and plugins (typically backends) are responsible for enforcing them. +Two important responsibilities of any authorization system are to decide if a user can do something, and to enforce that decision. In the Backstage permission framework, policies are responsible for decisions and plugins (typically backends) are responsible for enforcing them. -### Resource, rules, and conditional decisions +### Resources, rules, and conditional decisions In many cases, a permission represents a user's interaction with another object. This object likely has information that policy authors can use to define more granular access. The permission framework introduces two abstractions to account for this: resources and rules. Resources represent the objects that users interact with. Rules are predicate-based controls that tap into a resource's data. For example, the catalog plugin defines a resource for catalog entities and a rule to check if an entity has a given annotation. -A policy uses rules to form a conditional decision. This tells the permission framework to delegate evaluation to the plugin that owns the corresponding resource. Permission requests that result in a conditional decision are allowed if all of the criteria evaluates to be true. This conditional behavior avoids coupling between policies and resource schemas, and allows plugins to evaluate complex rules in an efficient way. For example, a plugin may convert a conditional response to a database query instead of loading and filtering objects in memory. +A policy uses rules to form a conditional decision. This tells the permission framework to delegate evaluation to the plugin that owns the corresponding resource. Permission requests that result in a conditional decision are allowed if all of the criteria evaluate to be true. This conditional behavior avoids coupling between policies and resource schemas, and allows plugins to evaluate complex rules in an efficient way. For example, a plugin may convert a conditional response to a database query instead of loading and filtering objects in memory. From f6b256641159a8502668702f5fa1e98c68bf1beb Mon Sep 17 00:00:00 2001 From: Joe Porpeglia Date: Mon, 28 Feb 2022 18:11:19 -0500 Subject: [PATCH 06/50] Split section for conditional decisions Signed-off-by: Joe Porpeglia --- docs/permission/concepts.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/docs/permission/concepts.md b/docs/permission/concepts.md index b82df730c5..e27272f753 100644 --- a/docs/permission/concepts.md +++ b/docs/permission/concepts.md @@ -16,8 +16,10 @@ User permissions are authorized by a central, user-defined permission policy. At Two important responsibilities of any authorization system are to decide if a user can do something, and to enforce that decision. In the Backstage permission framework, policies are responsible for decisions and plugins (typically backends) are responsible for enforcing them. -### Resources, rules, and conditional decisions +### Resources and rules In many cases, a permission represents a user's interaction with another object. This object likely has information that policy authors can use to define more granular access. The permission framework introduces two abstractions to account for this: resources and rules. Resources represent the objects that users interact with. Rules are predicate-based controls that tap into a resource's data. For example, the catalog plugin defines a resource for catalog entities and a rule to check if an entity has a given annotation. -A policy uses rules to form a conditional decision. This tells the permission framework to delegate evaluation to the plugin that owns the corresponding resource. Permission requests that result in a conditional decision are allowed if all of the criteria evaluate to be true. This conditional behavior avoids coupling between policies and resource schemas, and allows plugins to evaluate complex rules in an efficient way. For example, a plugin may convert a conditional response to a database query instead of loading and filtering objects in memory. +### Conditional decisions + +Rules need additional data before they can be used in a decision. For example, the catalog plugin's "has annotation" rule needs to know what annotation to look for on a given entity. Once a rule is bound to relevant information it forms a condition. Conditions are then used to return a conditional decision from a policy. Conditional decisions tell the permission framework to delegate evaluation to the plugin that owns the corresponding resource. Permission requests that result in a conditional decision are allowed if all of the provided conditions evaluate to be true. This conditional behavior avoids coupling between policies and resource schemas, and allows plugins to evaluate complex rules in an efficient way. For example, a plugin may convert a conditional decision to a database query instead of loading and filtering objects in memory. From 23fc22c6dd04c0926b67f32559f5491825aced73 Mon Sep 17 00:00:00 2001 From: Vincenzo Scamporlino Date: Thu, 3 Mar 2022 11:55:43 +0100 Subject: [PATCH 07/50] Permission framework docs for plugin authors (#9702) * Permission framework docs: plugin adopters Signed-off-by: Vincenzo Scamporlino * Add item to sidebar Signed-off-by: Vincenzo Scamporlino * Update docs/permission/permission-framework-for-plugin-authors.md Co-authored-by: MT Lewis Signed-off-by: Vincenzo Scamporlino * Update docs/permission/permission-framework-for-plugin-authors.md Co-authored-by: MT Lewis Signed-off-by: Vincenzo Scamporlino * Update docs/permission/permission-framework-for-plugin-authors.md Co-authored-by: MT Lewis Signed-off-by: Vincenzo Scamporlino * Update docs/permission/permission-framework-for-plugin-authors.md Co-authored-by: MT Lewis Signed-off-by: Vincenzo Scamporlino * Update docs/permission/permission-framework-for-plugin-authors.md Co-authored-by: MT Lewis Signed-off-by: Vincenzo Scamporlino * Update docs/permission/permission-framework-for-plugin-authors.md Co-authored-by: MT Lewis Signed-off-by: Vincenzo Scamporlino * Update docs/permission/permission-framework-for-plugin-authors.md Co-authored-by: MT Lewis Signed-off-by: Vincenzo Scamporlino * Update docs/permission/permission-framework-for-plugin-authors.md Co-authored-by: MT Lewis Signed-off-by: Vincenzo Scamporlino * Update docs/permission/permission-framework-for-plugin-authors.md Co-authored-by: MT Lewis Signed-off-by: Vincenzo Scamporlino * Update docs/permission/permission-framework-for-plugin-authors.md Co-authored-by: MT Lewis Signed-off-by: Vincenzo Scamporlino * Apply suggestions from code review Co-authored-by: MT Lewis Co-authored-by: Joon Park Signed-off-by: Vincenzo Scamporlino * Apply suggestions from code review Co-authored-by: MT Lewis Signed-off-by: Vincenzo Scamporlino * Docs improvements Signed-off-by: Vincenzo Scamporlino * Add todo-list plugins Signed-off-by: Vincenzo Scamporlino * Refactor structure and minor changes Signed-off-by: Vincenzo Scamporlino * Fix links Signed-off-by: Vincenzo Scamporlino * Update docs/permission/plugin-authors/setup-for-the-tutorial.md Co-authored-by: MT Lewis Signed-off-by: Vincenzo Scamporlino * Apply suggestions from code review Co-authored-by: MT Lewis Signed-off-by: Vincenzo Scamporlino * minor tutorial fixes Signed-off-by: Vincenzo Scamporlino * Fully implement permission rule Signed-off-by: Vincenzo Scamporlino * Add todos for missing content Signed-off-by: Vincenzo Scamporlino * Improve minified script Signed-off-by: Vincenzo Scamporlino * More todos Signed-off-by: Vincenzo Scamporlino * Fix rules exports Signed-off-by: Vincenzo Scamporlino Co-authored-by: MT Lewis Co-authored-by: Joon Park --- contrib/plugins/README.md | 1 + .../plugins/todo-list-backend/.eslintrc.js | 3 + contrib/plugins/todo-list-backend/README.md | 9 + .../plugins/todo-list-backend/package.json | 45 +++++ .../plugins/todo-list-backend/src/index.ts | 17 ++ contrib/plugins/todo-list-backend/src/run.ts | 33 ++++ .../src/service/router.test.ts | 47 +++++ .../todo-list-backend/src/service/router.ts | 86 ++++++++ .../src/service/standaloneServer.ts | 61 ++++++ .../todo-list-backend/src/service/todos.ts | 64 ++++++ .../todo-list-backend/src/setupTests.ts | 17 ++ contrib/plugins/todo-list/.eslintrc.js | 14 ++ contrib/plugins/todo-list/README.md | 9 + contrib/plugins/todo-list/package.json | 50 +++++ .../src/components/TodoList/TodoList.tsx | 88 +++++++++ .../src/components/TodoList/index.ts | 17 ++ .../components/TodoListPage/TodoListPage.tsx | 187 ++++++++++++++++++ .../src/components/TodoListPage/index.ts | 16 ++ contrib/plugins/todo-list/src/index.ts | 16 ++ contrib/plugins/todo-list/src/plugin.test.ts | 22 +++ contrib/plugins/todo-list/src/plugin.ts | 37 ++++ contrib/plugins/todo-list/src/routes.ts | 20 ++ contrib/plugins/todo-list/src/setupTests.ts | 16 ++ .../permission/permission-todo-list-page.png | Bin 0 -> 185751 bytes ...ackstage-application-initial-structure.png | Bin 0 -> 48537 bytes docs/permission/overview.md | 2 +- .../authorize-the-create-endpoint.md | 185 +++++++++++++++++ .../authorize-the-read-endpoint.md | 118 +++++++++++ .../authorize-the-update-endpoint.md | 160 +++++++++++++++ .../plugin-authors/setup-for-the-tutorial.md | 126 ++++++++++++ microsite/sidebars.json | 12 +- 31 files changed, 1476 insertions(+), 2 deletions(-) create mode 100644 contrib/plugins/README.md create mode 100644 contrib/plugins/todo-list-backend/.eslintrc.js create mode 100644 contrib/plugins/todo-list-backend/README.md create mode 100644 contrib/plugins/todo-list-backend/package.json create mode 100644 contrib/plugins/todo-list-backend/src/index.ts create mode 100644 contrib/plugins/todo-list-backend/src/run.ts create mode 100644 contrib/plugins/todo-list-backend/src/service/router.test.ts create mode 100644 contrib/plugins/todo-list-backend/src/service/router.ts create mode 100644 contrib/plugins/todo-list-backend/src/service/standaloneServer.ts create mode 100644 contrib/plugins/todo-list-backend/src/service/todos.ts create mode 100644 contrib/plugins/todo-list-backend/src/setupTests.ts create mode 100644 contrib/plugins/todo-list/.eslintrc.js create mode 100644 contrib/plugins/todo-list/README.md create mode 100644 contrib/plugins/todo-list/package.json create mode 100644 contrib/plugins/todo-list/src/components/TodoList/TodoList.tsx create mode 100644 contrib/plugins/todo-list/src/components/TodoList/index.ts create mode 100644 contrib/plugins/todo-list/src/components/TodoListPage/TodoListPage.tsx create mode 100644 contrib/plugins/todo-list/src/components/TodoListPage/index.ts create mode 100644 contrib/plugins/todo-list/src/index.ts create mode 100644 contrib/plugins/todo-list/src/plugin.test.ts create mode 100644 contrib/plugins/todo-list/src/plugin.ts create mode 100644 contrib/plugins/todo-list/src/routes.ts create mode 100644 contrib/plugins/todo-list/src/setupTests.ts create mode 100644 docs/assets/permission/permission-todo-list-page.png create mode 100644 docs/assets/permission/permission-tutorial-backstage-application-initial-structure.png create mode 100644 docs/permission/plugin-authors/authorize-the-create-endpoint.md create mode 100644 docs/permission/plugin-authors/authorize-the-read-endpoint.md create mode 100644 docs/permission/plugin-authors/authorize-the-update-endpoint.md create mode 100644 docs/permission/plugin-authors/setup-for-the-tutorial.md diff --git a/contrib/plugins/README.md b/contrib/plugins/README.md new file mode 100644 index 0000000000..df302c635e --- /dev/null +++ b/contrib/plugins/README.md @@ -0,0 +1 @@ +# Plugins contributions diff --git a/contrib/plugins/todo-list-backend/.eslintrc.js b/contrib/plugins/todo-list-backend/.eslintrc.js new file mode 100644 index 0000000000..16a033dbc6 --- /dev/null +++ b/contrib/plugins/todo-list-backend/.eslintrc.js @@ -0,0 +1,3 @@ +module.exports = { + extends: [require.resolve('@backstage/cli/config/eslint.backend')], +}; diff --git a/contrib/plugins/todo-list-backend/README.md b/contrib/plugins/todo-list-backend/README.md new file mode 100644 index 0000000000..07adc0755a --- /dev/null +++ b/contrib/plugins/todo-list-backend/README.md @@ -0,0 +1,9 @@ +# todo-list + +Welcome to the todo-list backend plugin! + +_This plugin was created through the Backstage CLI_ + +## Getting started + +// TODO(vinzscam): replace this diff --git a/contrib/plugins/todo-list-backend/package.json b/contrib/plugins/todo-list-backend/package.json new file mode 100644 index 0000000000..b07675c8f1 --- /dev/null +++ b/contrib/plugins/todo-list-backend/package.json @@ -0,0 +1,45 @@ +{ + "name": "@internal/plugin-todo-list-backend", + "version": "1.0.0", + "main": "src/index.ts", + "types": "src/index.ts", + "license": "Apache-2.0", + "private": true, + "publishConfig": { + "access": "public", + "main": "dist/index.cjs.js", + "types": "dist/index.d.ts" + }, + "scripts": { + "start": "backstage-cli backend:dev", + "build": "backstage-cli backend:build", + "lint": "backstage-cli lint", + "test": "backstage-cli test", + "prepack": "backstage-cli prepack", + "postpack": "backstage-cli postpack", + "clean": "backstage-cli clean" + }, + "dependencies": { + "@backstage/backend-common": "^0.10.6", + "@backstage/config": "^0.1.13", + "@backstage/errors": "^0.2.0", + "@backstage/plugin-auth-node": "^0.1.2", + "@types/express": "*", + "cross-fetch": "^3.0.6", + "express": "^4.17.1", + "express-promise-router": "^4.1.0", + "uuid": "^8.3.2", + "winston": "^3.2.1", + "yn": "^4.0.0" + }, + "devDependencies": { + "@backstage/cli": "^0.13.1", + "@types/supertest": "^2.0.8", + "@types/uuid": "^8.3.4", + "msw": "^0.35.0", + "supertest": "^4.0.2" + }, + "files": [ + "dist" + ] +} diff --git a/contrib/plugins/todo-list-backend/src/index.ts b/contrib/plugins/todo-list-backend/src/index.ts new file mode 100644 index 0000000000..ca73cb27ba --- /dev/null +++ b/contrib/plugins/todo-list-backend/src/index.ts @@ -0,0 +1,17 @@ +/* + * Copyright 2020 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +export * from './service/router'; diff --git a/contrib/plugins/todo-list-backend/src/run.ts b/contrib/plugins/todo-list-backend/src/run.ts new file mode 100644 index 0000000000..0a3ed2b7f0 --- /dev/null +++ b/contrib/plugins/todo-list-backend/src/run.ts @@ -0,0 +1,33 @@ +/* + * Copyright 2020 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { getRootLogger } from '@backstage/backend-common'; +import yn from 'yn'; +import { startStandaloneServer } from './service/standaloneServer'; + +const port = process.env.PLUGIN_PORT ? Number(process.env.PLUGIN_PORT) : 7007; +const enableCors = yn(process.env.PLUGIN_CORS, { default: false }); +const logger = getRootLogger(); + +startStandaloneServer({ port, enableCors, logger }).catch(err => { + logger.error(err); + process.exit(1); +}); + +process.on('SIGINT', () => { + logger.info('CTRL+C pressed; exiting.'); + process.exit(0); +}); diff --git a/contrib/plugins/todo-list-backend/src/service/router.test.ts b/contrib/plugins/todo-list-backend/src/service/router.test.ts new file mode 100644 index 0000000000..e381aad143 --- /dev/null +++ b/contrib/plugins/todo-list-backend/src/service/router.test.ts @@ -0,0 +1,47 @@ +/* + * Copyright 2020 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { getVoidLogger } from '@backstage/backend-common'; +import { IdentityClient } from '@backstage/plugin-auth-node'; +import express from 'express'; +import request from 'supertest'; + +import { createRouter } from './router'; + +describe('createRouter', () => { + let app: express.Express; + + beforeAll(async () => { + const router = await createRouter({ + logger: getVoidLogger(), + identity: {} as IdentityClient, + }); + app = express().use(router); + }); + + beforeEach(() => { + jest.resetAllMocks(); + }); + + describe('GET /health', () => { + it('returns ok', async () => { + const response = await request(app).get('/health'); + + expect(response.status).toEqual(200); + expect(response.body).toEqual({ status: 'ok' }); + }); + }); +}); diff --git a/contrib/plugins/todo-list-backend/src/service/router.ts b/contrib/plugins/todo-list-backend/src/service/router.ts new file mode 100644 index 0000000000..2fd9dfea9a --- /dev/null +++ b/contrib/plugins/todo-list-backend/src/service/router.ts @@ -0,0 +1,86 @@ +/* + * Copyright 2020 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { errorHandler } from '@backstage/backend-common'; +import { InputError } from '@backstage/errors'; +import express from 'express'; +import Router from 'express-promise-router'; +import { Logger } from 'winston'; +import { + IdentityClient, + getBearerTokenFromAuthorizationHeader, +} from '@backstage/plugin-auth-node'; +import { add, getAll, update } from './todos'; + +export interface RouterOptions { + logger: Logger; + identity: IdentityClient; +} + +export async function createRouter( + options: RouterOptions, +): Promise { + const { logger, identity } = options; + + const router = Router(); + router.use(express.json()); + + router.get('/health', (_, response) => { + logger.info('PONG!'); + response.send({ status: 'ok' }); + }); + + router.get('/todos', async (req, res) => { + res.json(getAll()); + }); + + router.post('/todos', async (req, res) => { + const token = getBearerTokenFromAuthorizationHeader( + req.header('authorization'), + ); + let author: string | undefined = undefined; + + const user = token ? await identity.authenticate(token) : undefined; + author = user?.identity.userEntityRef; + + if (!isTodoCreateRequest(req.body)) { + throw new InputError('Invalid payload'); + } + + const todo = add({ title: req.body.title, author }); + res.json(todo); + }); + + router.put('/todos', async (req, res) => { + if (!isTodoUpdateRequest(req.body)) { + throw new InputError('Invalid payload'); + } + res.json(update(req.body)); + }); + + router.use(errorHandler()); + return router; +} + +function isTodoCreateRequest(request: any): request is { title: string } { + return typeof request?.title === 'string'; +} + +function isTodoUpdateRequest( + request: any, +): request is { title: string; id: string } { + return typeof request?.id === 'string' && isTodoCreateRequest(request); +} diff --git a/contrib/plugins/todo-list-backend/src/service/standaloneServer.ts b/contrib/plugins/todo-list-backend/src/service/standaloneServer.ts new file mode 100644 index 0000000000..393b71ee8e --- /dev/null +++ b/contrib/plugins/todo-list-backend/src/service/standaloneServer.ts @@ -0,0 +1,61 @@ +/* + * Copyright 2020 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { + createServiceBuilder, + loadBackendConfig, + SingleHostDiscovery, +} from '@backstage/backend-common'; +import { IdentityClient } from '@backstage/plugin-auth-node'; +import { Server } from 'http'; +import { Logger } from 'winston'; +import { createRouter } from './router'; + +export interface ServerOptions { + port: number; + enableCors: boolean; + logger: Logger; +} + +export async function startStandaloneServer( + options: ServerOptions, +): Promise { + const logger = options.logger.child({ service: 'todo-list-backend' }); + logger.debug('Starting application server...'); + const config = await loadBackendConfig({ logger, argv: process.argv }); + const discovery = SingleHostDiscovery.fromConfig(config); + const router = await createRouter({ + logger, + identity: new IdentityClient({ + discovery, + issuer: await discovery.getExternalBaseUrl('auth'), + }), + }); + + let service = createServiceBuilder(module) + .setPort(options.port) + .addRouter('/todo-list', router); + if (options.enableCors) { + service = service.enableCors({ origin: 'http://localhost:3000' }); + } + + return await service.start().catch(err => { + logger.error(err); + process.exit(1); + }); +} + +module.hot?.accept(); diff --git a/contrib/plugins/todo-list-backend/src/service/todos.ts b/contrib/plugins/todo-list-backend/src/service/todos.ts new file mode 100644 index 0000000000..54d07cf059 --- /dev/null +++ b/contrib/plugins/todo-list-backend/src/service/todos.ts @@ -0,0 +1,64 @@ +/* + * Copyright 2022 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { v4 as uuid } from 'uuid'; +import { NotFoundError } from '@backstage/errors'; + +export type Todo = { + title: string; + author?: string; + id: string; + timestamp: number; +}; + +export type TodoFilter = Parameters['filter']>[0]; + +const todos: { [key: string]: Todo } = {}; + +export function add(todo: Omit) { + const id = uuid(); + + const obj: Todo = { ...todo, id, timestamp: Date.now() }; + todos[id] = obj; + return obj; +} + +export function getTodo(id: string) { + return todos[id]; +} + +export function update({ id, title }: { id: string; title: string }) { + let todo = todos[id]; + if (!todo) { + throw new NotFoundError('Item not found'); + } + + todo = { ...todo, title, timestamp: Date.now() }; + todos[id] = todo; + return todo; +} + +export function getAll(filter?: TodoFilter) { + let values = Object.values(todos); + if (filter) { + values = values.filter(filter); + } + + return values.sort((a, b) => b.timestamp - a.timestamp); +} + +// prepopulate the db +add({ title: 'just a note' }); +add({ title: 'another note' }); diff --git a/contrib/plugins/todo-list-backend/src/setupTests.ts b/contrib/plugins/todo-list-backend/src/setupTests.ts new file mode 100644 index 0000000000..d3232290a7 --- /dev/null +++ b/contrib/plugins/todo-list-backend/src/setupTests.ts @@ -0,0 +1,17 @@ +/* + * Copyright 2020 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +export {}; diff --git a/contrib/plugins/todo-list/.eslintrc.js b/contrib/plugins/todo-list/.eslintrc.js new file mode 100644 index 0000000000..8c18e76229 --- /dev/null +++ b/contrib/plugins/todo-list/.eslintrc.js @@ -0,0 +1,14 @@ +module.exports = { + extends: [require.resolve('@backstage/cli/config/eslint')], + rules: { + 'import/no-extraneous-dependencies': [ + 'error', + { + devDependencies: true, + optionalDependencies: true, + peerDependencies: true, + bundledDependencies: true, + }, + ], + }, +}; diff --git a/contrib/plugins/todo-list/README.md b/contrib/plugins/todo-list/README.md new file mode 100644 index 0000000000..288782874a --- /dev/null +++ b/contrib/plugins/todo-list/README.md @@ -0,0 +1,9 @@ +# todo-list + +Welcome to the todo-list plugin! + +_This plugin was created through the Backstage CLI_ + +## Getting started + +// TODO(vinzscam): replace this diff --git a/contrib/plugins/todo-list/package.json b/contrib/plugins/todo-list/package.json new file mode 100644 index 0000000000..a6ee069c00 --- /dev/null +++ b/contrib/plugins/todo-list/package.json @@ -0,0 +1,50 @@ +{ + "name": "@internal/plugin-todo-list", + "version": "1.0.0", + "main": "src/index.ts", + "types": "src/index.ts", + "license": "Apache-2.0", + "private": true, + "publishConfig": { + "access": "public", + "main": "dist/index.esm.js", + "types": "dist/index.d.ts" + }, + "scripts": { + "build": "backstage-cli plugin:build", + "start": "backstage-cli plugin:serve", + "lint": "backstage-cli lint", + "test": "backstage-cli test", + "diff": "backstage-cli plugin:diff", + "prepack": "backstage-cli prepack", + "postpack": "backstage-cli postpack", + "clean": "backstage-cli clean" + }, + "dependencies": { + "@backstage/core-components": "^0.8.7", + "@backstage/core-plugin-api": "^0.6.0", + "@backstage/theme": "^0.2.14", + "@material-ui/core": "^4.12.2", + "@material-ui/icons": "^4.9.1", + "@material-ui/lab": "4.0.0-alpha.57", + "react-use": "^17.2.4" + }, + "peerDependencies": { + "react": "^16.13.1 || ^17.0.0" + }, + "devDependencies": { + "@backstage/cli": "^0.13.1", + "@backstage/core-app-api": "^0.5.2", + "@backstage/dev-utils": "^0.2.12", + "@backstage/test-utils": "^0.2.4", + "@testing-library/jest-dom": "^5.10.1", + "@testing-library/react": "^11.2.5", + "@testing-library/user-event": "^13.1.8", + "@types/jest": "*", + "@types/node": "*", + "msw": "^0.35.0" + }, + "files": [ + "dist" + ] +} diff --git a/contrib/plugins/todo-list/src/components/TodoList/TodoList.tsx b/contrib/plugins/todo-list/src/components/TodoList/TodoList.tsx new file mode 100644 index 0000000000..7bda8df5b4 --- /dev/null +++ b/contrib/plugins/todo-list/src/components/TodoList/TodoList.tsx @@ -0,0 +1,88 @@ +/* + * Copyright 2022 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import React from 'react'; +import { Table, TableColumn, Progress } from '@backstage/core-components'; +import Alert from '@material-ui/lab/Alert'; +import useAsync from 'react-use/lib/useAsync'; +import { + discoveryApiRef, + fetchApiRef, + useApi, +} from '@backstage/core-plugin-api'; +import { Button } from '@material-ui/core'; + +export type Todo = { + title: string; + id: string; + author?: string; + timestamp: number; +}; + +type TodosTableProps = { + todos: Todo[]; + onEdit(todo: Todo): any; +}; + +export const TodoList = ({ onEdit }: { onEdit(todo: Todo): any }) => { + const discoveryApi = useApi(discoveryApiRef); + const { fetch } = useApi(fetchApiRef); + + const { value, loading, error } = useAsync(async (): Promise => { + const response = await fetch( + `${await discoveryApi.getBaseUrl('todolist')}/todos`, + ); + return response.json(); + }, []); + + if (loading) { + return ; + } else if (error) { + return {error.message}; + } + + return ; +}; + +export function TodosTable({ todos, onEdit }: TodosTableProps) { + const columns: TableColumn[] = [ + { title: 'Title', field: 'title' }, + { title: 'Author', field: 'author' }, + { + title: 'Last edit', + field: 'timestamp', + render: e => new Date(e.timestamp).toLocaleString(), + }, + { + title: 'Action', + render: todo => { + return ( + + ); + }, + }, + ]; + + return ( + + ); +} diff --git a/contrib/plugins/todo-list/src/components/TodoList/index.ts b/contrib/plugins/todo-list/src/components/TodoList/index.ts new file mode 100644 index 0000000000..df49717d83 --- /dev/null +++ b/contrib/plugins/todo-list/src/components/TodoList/index.ts @@ -0,0 +1,17 @@ +/* + * Copyright 2022 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +export { TodoList } from './TodoList'; +export type { Todo } from './TodoList'; diff --git a/contrib/plugins/todo-list/src/components/TodoListPage/TodoListPage.tsx b/contrib/plugins/todo-list/src/components/TodoListPage/TodoListPage.tsx new file mode 100644 index 0000000000..7ebb517532 --- /dev/null +++ b/contrib/plugins/todo-list/src/components/TodoListPage/TodoListPage.tsx @@ -0,0 +1,187 @@ +/* + * Copyright 2022 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import React, { useReducer, useRef, useState } from 'react'; +import { + Typography, + Grid, + TextField, + Button, + Dialog, + Box, + DialogTitle, + DialogContent, + DialogActions, +} from '@material-ui/core'; +import { + Header, + Page, + Content, + ContentHeader, + HeaderLabel, + SupportButton, +} from '@backstage/core-components'; +import { Todo, TodoList } from '../TodoList'; +import { + alertApiRef, + discoveryApiRef, + fetchApiRef, + useApi, +} from '@backstage/core-plugin-api'; + +export const TodoListPage = () => { + const discoveryApi = useApi(discoveryApiRef); + const { fetch } = useApi(fetchApiRef); + const alertApi = useApi(alertApiRef); + const title = useRef(''); + const [key, refetchTodos] = useReducer(i => i + 1, 0); + const [editElement, setEdit] = useState(); + + const handleAdd = async () => { + try { + const response = await fetch( + `${await discoveryApi.getBaseUrl('todolist')}/todos`, + { + method: 'POST', + body: JSON.stringify({ title: title.current }), + headers: { + 'Content-Type': 'application/json', + }, + }, + ); + if (!response.ok) { + const { error } = await response.json(); + alertApi.post({ + message: error.message, + severity: 'error', + }); + return; + } + refetchTodos(); + } catch (e: any) { + alertApi.post({ message: e.message, severity: 'error' }); + } + }; + + const handleEdit = async (todo: Todo) => { + setEdit(undefined); + try { + const response = await fetch( + `${await discoveryApi.getBaseUrl('todolist')}/todos`, + { + method: 'PUT', + body: JSON.stringify({ title: todo.title, id: todo.id }), + headers: { + 'Content-Type': 'application/json', + }, + }, + ); + if (!response.ok) { + const { error } = await response.json(); + alertApi.post({ + message: error.message, + severity: 'error', + }); + return; + } + refetchTodos(); + } catch (e: any) { + alertApi.post({ message: e.message, severity: 'error' }); + } + }; + + return ( + +
+ + +
+ + + A description of your plugin goes here. + + + + Add todo + + (title.current = e.target.value)} + /> + + + + + + + + + {!!editElement && ( + setEdit(undefined)} + /> + )} +
+ ); +}; + +function EditModal({ + todo, + onCancel, + onSubmit, +}: { + todo?: Todo; + onSubmit(todo: Todo): any; + onCancel(): any; +}) { + const title = useRef(''); + return ( + + Edit item + + (title.current = e.target.value)} + margin="dense" + fullWidth + /> + + + + + + + ); +} diff --git a/contrib/plugins/todo-list/src/components/TodoListPage/index.ts b/contrib/plugins/todo-list/src/components/TodoListPage/index.ts new file mode 100644 index 0000000000..061450605a --- /dev/null +++ b/contrib/plugins/todo-list/src/components/TodoListPage/index.ts @@ -0,0 +1,16 @@ +/* + * Copyright 2022 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +export { TodoListPage } from './TodoListPage'; diff --git a/contrib/plugins/todo-list/src/index.ts b/contrib/plugins/todo-list/src/index.ts new file mode 100644 index 0000000000..3fc36a39c9 --- /dev/null +++ b/contrib/plugins/todo-list/src/index.ts @@ -0,0 +1,16 @@ +/* + * Copyright 2022 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +export { todoListPlugin, TodoListPage } from './plugin'; diff --git a/contrib/plugins/todo-list/src/plugin.test.ts b/contrib/plugins/todo-list/src/plugin.test.ts new file mode 100644 index 0000000000..cd37abda72 --- /dev/null +++ b/contrib/plugins/todo-list/src/plugin.test.ts @@ -0,0 +1,22 @@ +/* + * Copyright 2022 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { todoListPlugin } from './plugin'; + +describe('todo-list', () => { + it('should export plugin', () => { + expect(todoListPlugin).toBeDefined(); + }); +}); diff --git a/contrib/plugins/todo-list/src/plugin.ts b/contrib/plugins/todo-list/src/plugin.ts new file mode 100644 index 0000000000..046c00d98c --- /dev/null +++ b/contrib/plugins/todo-list/src/plugin.ts @@ -0,0 +1,37 @@ +/* + * Copyright 2022 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { + createPlugin, + createRoutableExtension, +} from '@backstage/core-plugin-api'; + +import { rootRouteRef } from './routes'; + +export const todoListPlugin = createPlugin({ + id: 'todolist', + routes: { + root: rootRouteRef, + }, +}); + +export const TodoListPage = todoListPlugin.provide( + createRoutableExtension({ + name: 'TodoListPage', + component: () => + import('./components/TodoListPage').then(m => m.TodoListPage), + mountPoint: rootRouteRef, + }), +); diff --git a/contrib/plugins/todo-list/src/routes.ts b/contrib/plugins/todo-list/src/routes.ts new file mode 100644 index 0000000000..1d7c51b016 --- /dev/null +++ b/contrib/plugins/todo-list/src/routes.ts @@ -0,0 +1,20 @@ +/* + * Copyright 2022 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { createRouteRef } from '@backstage/core-plugin-api'; + +export const rootRouteRef = createRouteRef({ + id: 'todo-list', +}); diff --git a/contrib/plugins/todo-list/src/setupTests.ts b/contrib/plugins/todo-list/src/setupTests.ts new file mode 100644 index 0000000000..326d2ed212 --- /dev/null +++ b/contrib/plugins/todo-list/src/setupTests.ts @@ -0,0 +1,16 @@ +/* + * Copyright 2022 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import '@testing-library/jest-dom'; diff --git a/docs/assets/permission/permission-todo-list-page.png b/docs/assets/permission/permission-todo-list-page.png new file mode 100644 index 0000000000000000000000000000000000000000..cec2d6648556a53aceb28d7549e49381ff77622b GIT binary patch literal 185751 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%0DJGxy6vRO~FN1krw+ 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 literal 0 HcmV?d00001 diff --git a/docs/permission/overview.md b/docs/permission/overview.md index 7b1c25669e..b3c3d53c3f 100644 --- a/docs/permission/overview.md +++ b/docs/permission/overview.md @@ -38,4 +38,4 @@ The permission framework was designed with a few key properties in mind: See the "[getting started](./getting-started.md)" permission documentation for Backstage integrators. -If you are a plugin author, see the permission [documentation for plugin authors](../plugins/permissions/index.md) on how to integrate permissions into your plugin. +If you are a plugin author, see the permission [documentation for plugin authors](plugin-authors/setup-for-the-tutorial.md) on how to integrate permissions into your plugin. diff --git a/docs/permission/plugin-authors/authorize-the-create-endpoint.md b/docs/permission/plugin-authors/authorize-the-create-endpoint.md new file mode 100644 index 0000000000..91ce36c413 --- /dev/null +++ b/docs/permission/plugin-authors/authorize-the-create-endpoint.md @@ -0,0 +1,185 @@ +--- +id: authorize-the-create-endpoint +title: Authorize the create endpoint +description: Authorize the create endpoint +--- + +The first step we need to do in order to authorize the create endpoint, is to create a new `permission` inside our backend plugin. + +// TODO(vinzscam): add links to the core concepts + +Install the following module: + +``` +$ yarn workspace @internal/plugin-todo-list-backend add @backstage/plugin-permission-common +``` + +Let's create a new `permissions.ts` file under `plugins/todo-list-backend/src/service/permissions.ts` with the following content: + +```typescript +import { Permission } from '@backstage/plugin-permission-common'; + +export const TODO_LIST_RESOURCE_TYPE = 'todo-item'; + +export const todosListCreate: Permission = { + name: 'todos.list.create', + attributes: { + action: 'create', + }, +}; + +export const todosListUpdate: Permission = { + name: 'todos.list.update', + attributes: { + action: 'update', + }, + resourceType: TODO_LIST_RESOURCE_TYPE, +}; + +export const todosListRead: Permission = { + name: 'todos.list.read', + attributes: { + action: 'read', + }, + resourceType: TODO_LIST_RESOURCE_TYPE, +}; +``` + +The file contains all the permissions that we are going to use in the next steps. + +Let's authorize the create endpoint. + +Authorizing this endpoint now means that the adopters could decide whether some users should be allowed or not allowed to perform the create operation. + +Edit `plugins/todo-list-backend/src/service/router.ts`: + +```diff +- import { InputError } from '@backstage/errors'; ++ import { InputError, NotAllowedError } from '@backstage/errors'; + import { add, getAll, getTodo, Todo, TodoFilter, update } from './todos'; ++ import { PermissionAuthorizer, AuthorizeResult } from '@backstage/plugin-permission-common'; ++ import { todosListCreate } from './permissions'; + + + export interface RouterOptions { + logger: Logger; + identity: IdentityClient; ++ permissions: PermissionAuthorizer; + } + + export async function createRouter( + options: RouterOptions, + ): Promise { +- const { logger, identity } = options; ++ const { logger, identity, permissions } = options; + + ... + + router.post('/todos', async (req, res) => { + const token = IdentityClient.getBearerToken(req.header('authorization')); + let author: string | undefined = undefined; + + const user = token ? await identity.authenticate(token) : undefined; + author = user?.identity.userEntityRef; ++ const decision = ( ++ await permissions.authorize([{ permission: todosListCreate }], { ++ token, ++ }) ++ )[0]; + ++ if (decision.result === AuthorizeResult.DENY) { ++ throw new NotAllowedError('Unauthorized'); ++ } + + if (!isTodoCreateRequest(req.body)) { + throw new InputError('Invalid payload'); + } + + const todo = add({ title: req.body.title, author }); + res.json(todo); + }); + +``` + +Pass the `permissions` object to the plugin in `packages/backend/src/plugins/todolist.ts`: + +```diff + import { IdentityClient } from '@backstage/plugin-auth-backend'; + import { createRouter } from '@internal/plugin-todo-list-backend'; + import { Router } from 'express'; + import { PluginEnvironment } from '../types'; + + export default async function createPlugin({ + logger, + discovery, ++ permissions, + }: PluginEnvironment): Promise { + return await createRouter({ + logger, + identity: new IdentityClient({ + discovery, + issuer: await discovery.getExternalBaseUrl('auth'), + }), ++ permissions, + }); + } +``` + +That's it! Now your plugin is fully configured. + +Let's try to test the logic by denying the permission. + +### Test the authorized create endpoint + +In order to test the logic above, the integrators of your backstage instance need to deny change their permission policy in `packages/backend/src/plugins/permission.ts`: + +```diff +- import { IdentityClient } from '@backstage/plugin-auth-node'; ++ import { BackstageIdentityResponse, IdentityClient } from '@backstage/plugin-auth-node'; + import { + PermissionPolicy, ++ PolicyAuthorizeQuery, + PolicyDecision, + } from '@backstage/plugin-permission-node'; + +- class AllowAllPermissionPolicy implements PermissionPolicy ++ class MyPermissionPolicy implements PermissionPolicy { +- async handle(): Promise { ++ async handle( ++ request: PolicyAuthorizeQuery, ++ user?: BackstageIdentityResponse, ++ ): Promise { ++ if (request.permission.name === 'todos.list.create') { ++ return { ++ result: AuthorizeResult.DENY, ++ }; ++ } + return { + result: AuthorizeResult.ALLOW, + }; + } + + export default async function createPlugin({ + discovery, + logger, + }: PluginEnvironment) { +- const policy = new AllowAllPermissionPolicy(); ++ const policy = new MyPermissionPolicy(); + ... + + } +``` + +Now the frontend should show an error whenever you try to create a new Todo item. + +Let's flip the result back to `ALLOW`: + +```diff + if (request.permission.attributes.action === 'create') { + return { +- result: AuthorizeResult.DENY, ++ result: AuthorizeResult.ALLOW, + }; +``` + +now the create endpoint should be enabled again. diff --git a/docs/permission/plugin-authors/authorize-the-read-endpoint.md b/docs/permission/plugin-authors/authorize-the-read-endpoint.md new file mode 100644 index 0000000000..86d951e6e9 --- /dev/null +++ b/docs/permission/plugin-authors/authorize-the-read-endpoint.md @@ -0,0 +1,118 @@ +--- +id: authorize-the-read-endpoint +title: Authorize the read endpoint +description: Authorize the read endpoint +--- + +Authorizing `GET /todos` is similar to the update endpoint, in that it should be possible to authorize read access to todo entries based on their characteristics. When a `GET /todos` request is received, only the items that the user is permitted to see should be returned. + +As in the previous case, the permission policy can't take the decision itself, meaning that a conditional decision should be returned. +However, this time rather than a single `resourceRef` we have a whole list of resources to authorize. + +Potentially, something like this could be done: + +```diff + router.get('/todos', async (req, res) => { ++ const token = IdentityClient.getBearerToken(req.header('authorization')); + +- res.json(getAll()) ++ const items = getAll(); ++ const decisions = await permissions.authorize( ++ items.map(({ id }) => ({ permission: todosListRead, resourceRef: id })), ++ ); + ++ const filteredItems = decisions.filter( ++ decision => decision.result === AuthorizeResult.ALLOW, ++ ); ++ res.json(filteredItems); + }); +``` + +This should do the trick. However, this approach has a downside. It would force us to retrieve all the elements upfront and authorize them one by one, and mean that concerns like pagination that are handled by the data source today also need to move into the plugin. + +To avoid this situation, the permissions framework has support for filtering items in the data source itself. + +`plugins/todo-list-backend/src/service/router.ts` + +```diff +- import { createPermissionIntegrationRouter } from '@backstage/plugin-permission-node'; ++ import { ++ createPermissionIntegrationRouter, ++ createConditionTransformer, ++ ConditionTransformer, ++ } from '@backstage/plugin-permission-node'; + import { + todosListCreate, + todosListUpdate, ++ todosListRead, + TODO_LIST_RESOURCE_TYPE, + } from './permissions'; + + router.get('/todos', async (req, res) => { ++ const token = getBearerTokenFromAuthorizationHeader( ++ req.header('authorization'), ++ ); ++ const decision = ( ++ await permissions.authorize([{ permission: todosListRead }], { ++ token, ++ }) ++ )[0]; ++ if (decision.result === AuthorizeResult.DENY) { ++ throw new NotAllowedError('Unauthorized'); ++ } + ++ if (decision.result === AuthorizeResult.CONDITIONAL) { ++ const conditionTransformer: ConditionTransformer = ++ createConditionTransformer(rules); ++ const filter = conditionTransformer(decision.conditions) as TodoFilter; ++ res.json(getAll(filter)); ++ return; ++ } + + res.json(getAll()); + }); +``` + +In this case, we are not passing any `resourceRef` when invoking `permissions.authorize()`. + +Since there is no `resourceRef` and the permission policy is returning a conditional response, the permission framework can't make a decision +on its own and it's expecting the todo list backend's router to take care of this case. + +Instead of authorizing every todo item one by one, we can implement this more efficiently. + +If all the items were stored in a database, we could transform each permission result in the proper database query, letting the database do the filtering. + +If this approach is not applicable, you can still use the result-by-result authorization approach mentioned at the beginning of the section. + +Fortunately, our todo service is smart enough and lets us pass an optional `filter` function when invoking `getAll()`. +This is exactly what the `toQuery` field in the permission rule does. + +In this particular example, the `isOwner` rule returns a function (expected by `getAll` method). But there is no constraint regarding the shape of the returned object: any type of data can be returned. + +Now let's update our permission policy's handler to return a conditional result whenever a todosListCreate permission is received. We could reuse the same result as the update action: + +```diff + if (request.permission.resourceType === 'todo-item') { +- if (request.permission.resourceType === 'todo-item') { ++ if ( ++ request.permission.attributes.action === 'update' || ++ request.permission.attributes.action === 'read' ++ ) { + return { + result: AuthorizeResult.CONDITIONAL, + pluginId: 'todolist', + resourceType: 'todo-item', + conditions: { + rule: 'IS_OWNER', + params: [user?.identity.userEntityRef], + }, + }; + } + } +``` + +Once the changes to the permission policy are saved, the UI should should show only the items you have created. + +// TODO(vinzscam): add support for boolean operators + +// TODO(vinzscam): add frontend documentation diff --git a/docs/permission/plugin-authors/authorize-the-update-endpoint.md b/docs/permission/plugin-authors/authorize-the-update-endpoint.md new file mode 100644 index 0000000000..e7bb4e4d71 --- /dev/null +++ b/docs/permission/plugin-authors/authorize-the-update-endpoint.md @@ -0,0 +1,160 @@ +--- +id: authorize-the-update-endpoint +title: Authorize the update endpoint +description: Authorize the update endpoint +--- + +When performing updates (or other operations) on specific resources, the permissions framework allows for the decision to be based on characteristics of the resource itself. This means that it's possible to write policies that (for example) allow the operation for users that own a resource, and deny the operation otherwise. + +// TODO(vinzscam): remind that the plugin used in this tutorial is bringing its own types to backstage. +// for plugins relying on external entities (like catalog entities) please follow [link] tutorial. + +To start with, let's edit `plugins/todo-list-backend/src/service/router.ts` in a similar way as in the previous step. + +```diff +- import { todosListCreate } from './permissions'; ++ import { todosListCreate, todosListUpdate } from './permissions'; + + ... + + + router.put('/todos', async (req, res) => { ++ const token = getBearerTokenFromAuthorizationHeader( ++ req.header('authorization'), ++ ); + + if (!isTodoUpdateRequest(req.body)) { + throw new InputError('Invalid payload'); + } ++ const decision = ( ++ await permissions.authorize( ++ [{ permission: todosListUpdate, resourceRef: req.body.id }], ++ { ++ token, ++ }, ++ ) ++ )[0]; + +- res.json(update(req.body)); ++ if (decision.result === AuthorizeResult.ALLOW) { ++ res.json(update(req.body)); ++ return; ++ } ++ throw new NotAllowedError('Unauthorized'); + }); +``` + +**Important:** Notice that we are passing an extra `resourceRef` object, containing the `id` of the todo we want to authorize. + +This enables decisions based on characteristics of the resource, but it's important to note that to enable authorizing multiple resources at once, **the resourceRef is not passed to PermissionPolicy#handle**. Instead, policies must return a _conditional decision_. + +Before diving into the extra steps needed for supporting conditional decisions, let's go back to the permission policy's handle function used by your adopters and try to authorize our new permission. + +Let's edit `packages/backend/src/plugins/permission.ts` + +```diff + if (request.permission.name === 'todos.list.create') { + return { + result: AuthorizeResult.DENY, + }; + } ++ if (request.permission.resourceType === 'todo-item') { ++ if (request.permission.attributes.action === 'update') { ++ return { ++ result: AuthorizeResult.CONDITIONAL, ++ pluginId: 'todolist', ++ resourceType: 'todo-item', ++ conditions: { ++ rule: 'IS_OWNER', ++ params: [user?.identity.userEntityRef], ++ }, ++ }; ++ } ++ } + return { + result: AuthorizeResult.ALLOW, + }; +``` + +This is what happens when a _Conditional Decision_ is returned. We are saying: + +> Hey permission framework, I can't make a decision alone. Please go to the plugin with id `todolist` and ask it to apply these conditions. + +Now if we try to edit an item from the UI, we should spot the following error in the backend's console: + +``` +backstage error Unexpected response from plugin upstream when applying conditions. +Expected 200 but got 404 - Not Found type=errorHandler stack=Error: +Unexpected response from plugin upstream when applying conditions. Expected 200 but got 404 - Not Found +``` + +This happens because our plugin should have exposed a specific endpoint, used by the permission framework to apply conditional decisions. The new endpoint should also be able to support some conditions. In our case, `IS_OWNER` is the only type of condition we want to support. You can add as many built-in conditions as you like to your plugin, and you can also allow Backstage integrators to supply more conditions when starting your backend if you want. + +Install the missing module: + +``` +$ yarn workspace @internal/plugin-todo-list-backend add @backstage/plugin-permission-node +``` + +Create a new `plugins/todo-list-backend/src/service/rules.ts` file and append the following code: + +```diff ++ import { makeCreatePermissionRule } from '@backstage/plugin-permission-node'; ++ import { Todo, TodoFilter } from './todos'; + ++ const createTodoListPermissionRule = makeCreatePermissionRule< ++ Todo, ++ TodoFilter ++ >(); + ++ export const isOwner = createTodoListPermissionRule({ ++ name: 'IS_OWNER', ++ description: 'Should allow only if the todo belongs to the user', ++ apply: (resource, userId) => { ++ return resource.author === userId; ++ }, ++ toQuery: userId => { ++ return resource => resource.author === userId; ++ }, ++ }); + ++ export const rules = { isOwner }; +``` + +`makeCreatePermissionRule` is a helper used to ensure that rules created for this plugin use consistent types for the resource and query. + +We have created a new `isOwner` rule, which is going to be automatically used by the permission framework whenever a conditional response is returned in response to an authorized request with an attached `resourceRef`. +Specifically, the `apply` function is used to understand whether the passed resource should be authorized or not. + +Let's skip the `toQuery` function for now. + +Now, let's create the new endpoint by editing `plugins/todo-list-backend/src/service/router.ts`: + +```diff ++ import { createPermissionIntegrationRouter } from '@backstage/plugin-permission-node'; +- import { todosListCreate, todosListUpdate } from './permissions'; ++ import { todosListCreate, todosListUpdate, TODO_LIST_RESOURCE_TYPE } from './permissions'; ++ import { rules } from './rules; + + export async function createRouter( + options: RouterOptions, + ): Promise { + const { logger, identity, permissions } = options; + ++ const permissionIntegrationRouter = createPermissionIntegrationRouter({ ++ getResources: async resourceRefs => { ++ return resourceRefs.map(getTodo); ++ }, ++ resourceType: TODO_LIST_RESOURCE_TYPE, ++ rules: Object.values(rules), ++ }); + + const router = Router(); + router.use(express.json()); + ++ router.use(permissionIntegrationRouter); + + router.post('/todos', async (req, res) => { +``` + +To check that everything works as expected, you should see an error in the UI whenever you try to edit an item that wasn’t created by you. diff --git a/docs/permission/plugin-authors/setup-for-the-tutorial.md b/docs/permission/plugin-authors/setup-for-the-tutorial.md new file mode 100644 index 0000000000..60965e2018 --- /dev/null +++ b/docs/permission/plugin-authors/setup-for-the-tutorial.md @@ -0,0 +1,126 @@ +--- +id: setup-for-the-tutorial +title: Permission framework for plugin authors +description: How to get started with the permission framework as a plugin author +--- + +The following tutorial is designed to help plugin authors add support for permissions to their plugins. We'll add support for permissions to example `todo-list` and `todo-list-backend` plugins, but the process should be similar for other plugins! + +The rest of this page is focused on adding the `todo-list` and `todo-list-backend` plugins to your Backstage instance. If you want to add support for permissions to your own plugin instead, feel free to skip to the [next section](authorize-the-create-endpoint.md). + +## Setup for the Tutorial + +We will use a "Todo list" feature, composed of the `todo-list` and `todo-list-backend` plugins. + +The source code is available here: + +- [todo-list](https://github.com/backstage/backstage/blob/master/contrib/plugins/todo-list) +- [todo-list-backend](https://github.com/backstage/backstage/blob/master/contrib/plugins/todo-list-backend) + +1. Copy-paste the two folders into the plugins folder of your backstage application repository or run the following script from the root of your backstage application: + + ```bash + $ node -e "const{UrlReaders}=require('@backstage/backend-common');\ + const{ConfigReader}=require('@backstage/config');\ + const winston=require('winston');const{outputFile}=require('fs-extra');\ + const path=require('path');const logger=winston.createLogger({level:'info',});\ + const config=new ConfigReader({});(async function execute(){\ + const reader=UrlReaders.default({logger,config});const files=await reader.readTree(\ + 'https://github.com/backstage/backstage/tree/permission-docs\ + /contrib/plugins');return Promise.all((await files.files()).map(async file=>\ + file.path!=='README.md'&&outputFile(path.join(__dirname,'plugins',file.path),\ + await file.content(),),),).catch(console.log)})()" + ``` + + Your application structure should look something like this: + + ![backstage application files structure](../../assets/permission/permission-tutorial-backstage-application-initial-structure.png) + +2. add the frontend and backend plugins as dependencies of your Backstage app and backend respectively: + + ``` + $ yarn workspace backend add @internal/plugin-todo-list-backend@^1.0.0 + $ yarn workspace app add @internal/plugin-todo-list@^1.0.0 + ``` + +3. Include the backend and frontend plugin in your application: + + Create a new `packages/backend/src/plugins/todolist.ts` with the following content: + + ```javascript + import { IdentityClient } from '@backstage/plugin-auth-node'; + import { createRouter } from '@internal/plugin-todo-list-backend'; + import { Router } from 'express'; + import { PluginEnvironment } from '../types'; + + export default async function createPlugin({ + logger, + discovery, + }: PluginEnvironment): Promise { + return await createRouter({ + logger, + identity: IdentityClient.create({ + discovery, + issuer: await discovery.getExternalBaseUrl('auth'), + }), + }); + } + ``` + + Apply the following changes to `packages/backend/src/index.ts`: + + ```diff + import techdocs from './plugins/techdocs'; + + import todoList from './plugins/todolist'; + import search from './plugins/search'; + + ... + + const searchEnv = useHotMemoize(module, () => createEnv('search')); + const appEnv = useHotMemoize(module, () => createEnv('app')); + + const todoListEnv = useHotMemoize(module, () => createEnv('todolist')); + + ... + + apiRouter.use('/proxy', await proxy(proxyEnv)); + apiRouter.use('/search', await search(searchEnv)); + apiRouter.use('/permission', await permission(permissionEnv)); + + apiRouter.use('/todolist', await todoList(todoListEnv)); + // Add backends ABOVE this line; this 404 handler is the catch-all fallback + apiRouter.use(notFoundHandler()); + ``` + + Apply the following changes to `packages/app/src/App.ts`: + + ```diff + + import { TodoListPage } from '@internal/plugin-todo-list'; + + ... + + }> + {searchPage} + + } /> + + } /> + + ``` + +Now if you start your application you should be able to reach the `/todo-list` page: + +![Todo List plugin page](../../assets/permission/permission-todo-list-page.png) + +--- + +// TODO(vinzscam): split the tutorial in two parts: +// - plugins relying on external entities +// - plugins owning their own entities + +## Integrate the new plugin + +If you play with the UI, you will notice that it is possible to perform a few actions: + +- create a new todo item (`POST /todos`) +- view todo items (`GET /todos`) +- edit an existing todo item (`PUT /todos`) + +Let's try to bring authorization on top of each one of them. diff --git a/microsite/sidebars.json b/microsite/sidebars.json index 9553b4b566..cab9a850c8 100644 --- a/microsite/sidebars.json +++ b/microsite/sidebars.json @@ -265,7 +265,17 @@ "permission/overview", "permission/getting-started", "permission/writing-a-policy", - "permission/concepts" + "permission/concepts", + { + "type": "subcategory", + "label": "Permission framework for plugin authors", + "ids": [ + "permission/plugin-authors/setup-for-the-tutorial", + "permission/plugin-authors/authorize-the-create-endpoint", + "permission/plugin-authors/authorize-the-update-endpoint", + "permission/plugin-authors/authorize-the-read-endpoint" + ] + } ], "Deployment": [ "deployment/index", From 53828d7e76dda21e0e53254e56c8f23c2d637166 Mon Sep 17 00:00:00 2001 From: Joon Park Date: Fri, 4 Mar 2022 14:55:27 +0000 Subject: [PATCH 08/50] Policy docs for permission framework (#9910) * Policy docs for permission framework Signed-off-by: Joon Park * Clarifications and typo fixes Signed-off-by: Joon Park --- docs/permission/writing-a-policy.md | 140 ++++++++++++++++++++++++++++ 1 file changed, 140 insertions(+) diff --git a/docs/permission/writing-a-policy.md b/docs/permission/writing-a-policy.md index aa66e92e58..32e26b4d13 100644 --- a/docs/permission/writing-a-policy.md +++ b/docs/permission/writing-a-policy.md @@ -3,3 +3,143 @@ id: writing-a-policy title: Writing a permission policy description: How to write your own permission policy as a Backstage integrator --- + +In the [previous section](./getting-started.md), we were able to set up the permission framework and make a simple change to our `TestPermissionPolicy` to confirm that policy is indeed wired up correctly. + +That policy looked like this: + +```typescript +// packages/backend/src/plugins/permission.ts + +class TestPermissionPolicy implements PermissionPolicy { + async handle(request: PolicyAuthorizeQuery): Promise { + if (request.permission.name === 'catalog.entity.delete') { + return { + result: AuthorizeResult.DENY, + }; + } + + return { result: AuthorizeResult.ALLOW }; + } +} +``` + +## What's in a policy? + +Let's break this down a bit further. The request object of type [PolicyAuthorizeQuery](https://backstage.io/docs/reference/plugin-permission-node.policyauthorizequery) is a simple wrapper around [the Permission object](https://backstage.io/docs/reference/plugin-permission-common.permission). This permission object encapsulates information about the action that the user is attemping to perform (See [the Concepts page](./concepts.md) for more details). + +In the policy above, we are checking to see if the provided action is a catalog entity delete action, which is the permission that the catalog plugin authors have created to represent the action of unregistering a catalog entity. If this is the case, we return a [Definitive Policy Decision](https://backstage.io/docs/reference/plugin-permission-node.definitivepolicydecision) of DENY. In all other cases, we return ALLOW (resulting in an allow-by-default behavior). + +As we confirmed in the previous section, we know that this now prevents us from unregistering catalog components. Hooray! But you may notice that this prevents _anyone_ from unregistering a component, which is not a very realistic policy. Let's improve this policy by disabling the unregister action _unless you are the owner of this component_. + +## Conditional decisions + +Let's change the policy to the following: + +```diff +- import { IdentityClient } from '@backstage/plugin-auth-node'; ++ import { BackstageIdentityResponse, IdentityClient } from '@backstage/plugin-auth-node'; ++ import { catalogConditions, createCatalogPolicyDecision } from '@backstage/plugin-catalog-backend'; + + ... + + class TestPermissionPolicy implements PermissionPolicy { +- async handle(request: PolicyAuthorizeQuery): Promise { ++ async handle( ++ request: PolicyAuthorizeQuery, ++ user?: BackstageIdentityResponse, ++ ): Promise { + if (request.permission.name === 'catalog.entity.delete') { +- return { +- result: AuthorizeResult.DENY, +- }; ++ return createCatalogPolicyDecision( ++ catalogConditions.isEntityOwner( ++ user?.identity.ownershipEntityRefs ?? [], ++ ), ++ ); + } + + return { result: AuthorizeResult.ALLOW }; + } + } +``` + +Let's walk through the new code that we just added. Inside of the if statement, instead of returning a Definitive Policy Decision of DENY, we now return a [Conditional Policy Decision](https://backstage.io/docs/reference/plugin-permission-node.conditionalpolicydecision) (See the [Concepts page](./concepts.md) for more details). This is a way for policies to defer the evaulation of the decision back to the plugin which owns the permission. This allows the framework to support cases in which the policy does not have all the information required to make a decision. + +In the policy above, there's no way for the handle method to determine whether the user who is trying to unregister the entity is the owner of that entity. So we use the `createCatalogPolicyDecision` helper provided by the catalog backend to craft a conditional decision, which allows us to tell the catalog backend that it should only return ALLOW if the user owns the entity. + +The `catalogConditions` object contains various conditions that the catalog plug authors have provided for us to use in authoring our policy. Thankfully, they have provided the `isEntityOwner` rule, which is exactly what we need. + +The `isEntityOwner` rule needs a list of claims as a parameter, and the second argument to our `handle` method provides us with a `BackstageIdentityResponse` object, from which we can grab the user's `ownershipEntityRefs`. We provide an empty array as a fallback since the user may be anonymous. + +You should now be able to see in your Backstage app that the unregister entity button is enabled for entities that you own, but disabled for all other entities! + +### Custom conditions + +In addition to the conditions provided by the catalog plugin, you can write your own conditions for the catalog (or for any plugin that implements permissions, for that matter). This is done by using the [`createConditionFactory` helper](https://backstage.io/docs/reference/plugin-permission-node.createconditionfactory) provided by the `@backstage/plugin-permission-node` package. + +## Resource types + +Now let's say we would also like to restrict users from viewing catalog entities that they do not own, just like we did for unregistering entities. One way to achieve this may be to simply duplicate our if statement and check for the `catalog.entity.read` permission: + +```diff + async handle( + request: PolicyAuthorizeQuery, + user?: BackstageIdentityResponse, + ): Promise { + if (request.permission.name === 'catalog.entity.delete') { + return createCatalogPolicyDecision( + catalogConditions.isEntityOwner( + user?.identity.ownershipEntityRefs ?? [], + ), + ); + } + ++ if (request.permission.name === 'catalog.entity.read') { ++ return createCatalogPolicyDecision( ++ catalogConditions.isEntityOwner( ++ user?.identity.ownershipEntityRefs ?? [], ++ ), ++ ); ++ } + + return { result: AuthorizeResult.ALLOW }; + } +``` + +If you choose to write your policy this way, it will certainly work! You should be able to verify this by saving this policy and seeing that the catalog now only shows the entities that you own. However, you can imagine that as policies grow to handle many different permissions, these conditionals can quickly become repetitive. We can author this same policy in a more scalable way by using resource types. + +```diff + async handle( + request: PolicyAuthorizeQuery, + user?: BackstageIdentityResponse, + ): Promise { +- if (request.permission.name === 'catalog.entity.delete') { ++ if (request.permission.resourceType === 'catalog-entity') { + return createCatalogPolicyDecision( + catalogConditions.isEntityOwner( + user?.identity.ownershipEntityRefs ?? [], + ), + ); + } + +- if (request.permission.name === 'catalog.entity.read') { +- return createCatalogPolicyDecision( +- catalogConditions.isEntityOwner( +- user?.identity.ownershipEntityRefs ?? [], +- ), +- ); +- } +- + return { result: AuthorizeResult.ALLOW }; + } +``` + +In this example, we use the `catalog-entity` resource type to catch all authorization requests that have to do with resources from the catalog. Now, you should be able to see the same functionality as before (only see the catalog entities that you own) - success! + +_Note:_ Notice that while the `catalogEntityDeletePermission` and the `catalogEntityReadPermission` used here have the `'catalog-entity'` resource type, the [`catalogEntityCreatePermission`](https://github.com/backstage/backstage/blob/1e5e9fb9de9856a49e60fc70c38a4e4e94c69570/plugins/catalog-common/src/permissions.ts#L49) does not have a resource type associated with it, as it does not make sense to apply conditions to an entity that has not yet been created. + +## Conclusion + +Through a combination of permissions and conditions, you should be able to author a policy that works for your instance of Backstage and your organzation. As the ecosystem around permissions in Backstage become more mature, you may be able to choose from other authorization packages instead of writing your own policy. If you're interested in more detailed descriptions of the concepts that comprise the permission framework, check out the [Concepts page](./concepts.md). From 127740d85d61f0e97aaff6cbb78f0e9cf42545cd Mon Sep 17 00:00:00 2001 From: MT Lewis Date: Mon, 14 Mar 2022 11:31:43 +0000 Subject: [PATCH 09/50] docs: tweak structure of permission docs Signed-off-by: MT Lewis --- docs/permission/concepts.md | 2 +- docs/permission/overview.md | 2 +- microsite/sidebars.json | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/permission/concepts.md b/docs/permission/concepts.md index e27272f753..bbff79e0e1 100644 --- a/docs/permission/concepts.md +++ b/docs/permission/concepts.md @@ -1,6 +1,6 @@ --- id: concepts -title: Permission Framework Concepts +title: Concepts description: A list of important permission framework concepts --- diff --git a/docs/permission/overview.md b/docs/permission/overview.md index b3c3d53c3f..f9baff2830 100644 --- a/docs/permission/overview.md +++ b/docs/permission/overview.md @@ -1,6 +1,6 @@ --- id: overview -title: Permission Framework Overview +title: Overview description: A high level overview of the Backstage permission framework --- diff --git a/microsite/sidebars.json b/microsite/sidebars.json index cab9a850c8..4fd953917a 100644 --- a/microsite/sidebars.json +++ b/microsite/sidebars.json @@ -263,9 +263,9 @@ ], "Permissions": [ "permission/overview", + "permission/concepts", "permission/getting-started", "permission/writing-a-policy", - "permission/concepts", { "type": "subcategory", "label": "Permission framework for plugin authors", From b7b63ad527595c9a88e57347a22e39c16948e7f3 Mon Sep 17 00:00:00 2001 From: MT Lewis Date: Mon, 14 Mar 2022 11:32:53 +0000 Subject: [PATCH 10/50] docs: adjust permission framework plugin author tutorial titles Signed-off-by: MT Lewis --- docs/permission/overview.md | 2 +- .../{setup-for-the-tutorial.md => 01-setup.md} | 6 +++--- ...dpoint.md => 02-adding-a-basic-permission-check.md} | 6 +++--- ...int.md => 03-adding-a-resource-permission-check.md} | 6 +++--- ...t.md => 04-authorizing-access-to-paginated-data.md} | 6 +++--- microsite/sidebars.json | 10 +++++----- 6 files changed, 18 insertions(+), 18 deletions(-) rename docs/permission/plugin-authors/{setup-for-the-tutorial.md => 01-setup.md} (97%) rename docs/permission/plugin-authors/{authorize-the-create-endpoint.md => 02-adding-a-basic-permission-check.md} (96%) rename docs/permission/plugin-authors/{authorize-the-update-endpoint.md => 03-adding-a-resource-permission-check.md} (97%) rename docs/permission/plugin-authors/{authorize-the-read-endpoint.md => 04-authorizing-access-to-paginated-data.md} (96%) diff --git a/docs/permission/overview.md b/docs/permission/overview.md index f9baff2830..8e87756faa 100644 --- a/docs/permission/overview.md +++ b/docs/permission/overview.md @@ -38,4 +38,4 @@ The permission framework was designed with a few key properties in mind: See the "[getting started](./getting-started.md)" permission documentation for Backstage integrators. -If you are a plugin author, see the permission [documentation for plugin authors](plugin-authors/setup-for-the-tutorial.md) on how to integrate permissions into your plugin. +If you are a plugin author, see the permission [documentation for plugin authors](plugin-authors/01-setup.md) on how to integrate permissions into your plugin. diff --git a/docs/permission/plugin-authors/setup-for-the-tutorial.md b/docs/permission/plugin-authors/01-setup.md similarity index 97% rename from docs/permission/plugin-authors/setup-for-the-tutorial.md rename to docs/permission/plugin-authors/01-setup.md index 60965e2018..e47311b0d8 100644 --- a/docs/permission/plugin-authors/setup-for-the-tutorial.md +++ b/docs/permission/plugin-authors/01-setup.md @@ -1,12 +1,12 @@ --- -id: setup-for-the-tutorial -title: Permission framework for plugin authors +id: 01-setup +title: 1. Tutorial setup description: How to get started with the permission framework as a plugin author --- The following tutorial is designed to help plugin authors add support for permissions to their plugins. We'll add support for permissions to example `todo-list` and `todo-list-backend` plugins, but the process should be similar for other plugins! -The rest of this page is focused on adding the `todo-list` and `todo-list-backend` plugins to your Backstage instance. If you want to add support for permissions to your own plugin instead, feel free to skip to the [next section](authorize-the-create-endpoint.md). +The rest of this page is focused on adding the `todo-list` and `todo-list-backend` plugins to your Backstage instance. If you want to add support for permissions to your own plugin instead, feel free to skip to the [next section](./02-adding-a-basic-permission-check.md). ## Setup for the Tutorial diff --git a/docs/permission/plugin-authors/authorize-the-create-endpoint.md b/docs/permission/plugin-authors/02-adding-a-basic-permission-check.md similarity index 96% rename from docs/permission/plugin-authors/authorize-the-create-endpoint.md rename to docs/permission/plugin-authors/02-adding-a-basic-permission-check.md index 91ce36c413..cb081e8d24 100644 --- a/docs/permission/plugin-authors/authorize-the-create-endpoint.md +++ b/docs/permission/plugin-authors/02-adding-a-basic-permission-check.md @@ -1,7 +1,7 @@ --- -id: authorize-the-create-endpoint -title: Authorize the create endpoint -description: Authorize the create endpoint +id: 02-adding-a-basic-permission-check +title: 2. Adding a basic permission check +description: Explains how to add a basic permission check to a Backstage plugin --- The first step we need to do in order to authorize the create endpoint, is to create a new `permission` inside our backend plugin. diff --git a/docs/permission/plugin-authors/authorize-the-update-endpoint.md b/docs/permission/plugin-authors/03-adding-a-resource-permission-check.md similarity index 97% rename from docs/permission/plugin-authors/authorize-the-update-endpoint.md rename to docs/permission/plugin-authors/03-adding-a-resource-permission-check.md index e7bb4e4d71..9dbe0e3807 100644 --- a/docs/permission/plugin-authors/authorize-the-update-endpoint.md +++ b/docs/permission/plugin-authors/03-adding-a-resource-permission-check.md @@ -1,7 +1,7 @@ --- -id: authorize-the-update-endpoint -title: Authorize the update endpoint -description: Authorize the update endpoint +id: 03-adding-a-resource-permission-check +title: 3. Adding a resource permission check +description: Explains how to add a resource permission check to a Backstage plugin --- When performing updates (or other operations) on specific resources, the permissions framework allows for the decision to be based on characteristics of the resource itself. This means that it's possible to write policies that (for example) allow the operation for users that own a resource, and deny the operation otherwise. diff --git a/docs/permission/plugin-authors/authorize-the-read-endpoint.md b/docs/permission/plugin-authors/04-authorizing-access-to-paginated-data.md similarity index 96% rename from docs/permission/plugin-authors/authorize-the-read-endpoint.md rename to docs/permission/plugin-authors/04-authorizing-access-to-paginated-data.md index 86d951e6e9..d1d652c9a7 100644 --- a/docs/permission/plugin-authors/authorize-the-read-endpoint.md +++ b/docs/permission/plugin-authors/04-authorizing-access-to-paginated-data.md @@ -1,7 +1,7 @@ --- -id: authorize-the-read-endpoint -title: Authorize the read endpoint -description: Authorize the read endpoint +id: 04-authorizing-access-to-paginated-data +title: 4. Authorizing access to paginated data +description: Explains how to authorize access to paginated data in a Backstage plugin --- Authorizing `GET /todos` is similar to the update endpoint, in that it should be possible to authorize read access to todo entries based on their characteristics. When a `GET /todos` request is received, only the items that the user is permitted to see should be returned. diff --git a/microsite/sidebars.json b/microsite/sidebars.json index 4fd953917a..51da26c7b5 100644 --- a/microsite/sidebars.json +++ b/microsite/sidebars.json @@ -268,12 +268,12 @@ "permission/writing-a-policy", { "type": "subcategory", - "label": "Permission framework for plugin authors", + "label": "Tutorial: using Permissions in your plugin", "ids": [ - "permission/plugin-authors/setup-for-the-tutorial", - "permission/plugin-authors/authorize-the-create-endpoint", - "permission/plugin-authors/authorize-the-update-endpoint", - "permission/plugin-authors/authorize-the-read-endpoint" + "permission/plugin-authors/01-setup", + "permission/plugin-authors/02-adding-a-basic-permission-check", + "permission/plugin-authors/03-adding-a-resource-permission-check", + "permission/plugin-authors/04-authorizing-access-to-paginated-data" ] } ], From b3e49aae39f4aa4d7d499db1484ab6cc7170b2f4 Mon Sep 17 00:00:00 2001 From: MT Lewis Date: Mon, 14 Mar 2022 11:59:17 +0000 Subject: [PATCH 11/50] docs: tweak permission tutorial step 2 Signed-off-by: MT Lewis --- .../02-adding-a-basic-permission-check.md | 51 +++++++------------ 1 file changed, 18 insertions(+), 33 deletions(-) diff --git a/docs/permission/plugin-authors/02-adding-a-basic-permission-check.md b/docs/permission/plugin-authors/02-adding-a-basic-permission-check.md index cb081e8d24..96777762b9 100644 --- a/docs/permission/plugin-authors/02-adding-a-basic-permission-check.md +++ b/docs/permission/plugin-authors/02-adding-a-basic-permission-check.md @@ -4,9 +4,13 @@ title: 2. Adding a basic permission check description: Explains how to add a basic permission check to a Backstage plugin --- -The first step we need to do in order to authorize the create endpoint, is to create a new `permission` inside our backend plugin. +If the outcome of a permission check doesn't need to change for different [resources](../concepts.md#resources-and-rules), you can use a _basic permission check_. For this kind of check, we simply need to define a [permission](../concepts.md#resources-and-rules), and call `authorize` with it. -// TODO(vinzscam): add links to the core concepts +For this tutorial, we'll use a basic permission check to authorize the `create` endpoint in our todo-backend. This will allow Backstage integrators to control whether each of their users is authorized to create todos by adjusting their [permission policy](../concepts.md#policy). + +We'll start by creating a new permission, and then we'll use the permission api to call `authorize` with it during todo creation. + +## Setup Install the following module: @@ -14,42 +18,24 @@ Install the following module: $ yarn workspace @internal/plugin-todo-list-backend add @backstage/plugin-permission-common ``` -Let's create a new `permissions.ts` file under `plugins/todo-list-backend/src/service/permissions.ts` with the following content: +## Creating a new permission + +Let's create a new file `plugins/todo-list-backend/src/service/permissions.ts` with the following content: ```typescript import { Permission } from '@backstage/plugin-permission-common'; -export const TODO_LIST_RESOURCE_TYPE = 'todo-item'; - export const todosListCreate: Permission = { name: 'todos.list.create', attributes: { action: 'create', }, }; - -export const todosListUpdate: Permission = { - name: 'todos.list.update', - attributes: { - action: 'update', - }, - resourceType: TODO_LIST_RESOURCE_TYPE, -}; - -export const todosListRead: Permission = { - name: 'todos.list.read', - attributes: { - action: 'read', - }, - resourceType: TODO_LIST_RESOURCE_TYPE, -}; ``` -The file contains all the permissions that we are going to use in the next steps. +We recommend exporting all permissions from your plugin, so that Backstage integrators can import them when writing policies. -Let's authorize the create endpoint. - -Authorizing this endpoint now means that the adopters could decide whether some users should be allowed or not allowed to perform the create operation. +## Authorizing using the new permission Edit `plugins/todo-list-backend/src/service/router.ts`: @@ -60,7 +46,6 @@ Edit `plugins/todo-list-backend/src/service/router.ts`: + import { PermissionAuthorizer, AuthorizeResult } from '@backstage/plugin-permission-common'; + import { todosListCreate } from './permissions'; - export interface RouterOptions { logger: Logger; identity: IdentityClient; @@ -98,7 +83,6 @@ Edit `plugins/todo-list-backend/src/service/router.ts`: const todo = add({ title: req.body.title, author }); res.json(todo); }); - ``` Pass the `permissions` object to the plugin in `packages/backend/src/plugins/todolist.ts`: @@ -125,15 +109,15 @@ Pass the `permissions` object to the plugin in `packages/backend/src/plugins/tod } ``` -That's it! Now your plugin is fully configured. +That's it! Now your plugin is fully configured. Let's try to test the logic by denying the permission. -Let's try to test the logic by denying the permission. +## Test the authorized create endpoint -### Test the authorized create endpoint - -In order to test the logic above, the integrators of your backstage instance need to deny change their permission policy in `packages/backend/src/plugins/permission.ts`: +In order to test the logic above, the integrators of your backstage instance need to change their permission policy to return `DENY` for our newly-created permission: ```diff +// packages/backend/src/plugins/permission.ts + - import { IdentityClient } from '@backstage/plugin-auth-node'; + import { BackstageIdentityResponse, IdentityClient } from '@backstage/plugin-auth-node'; import { @@ -154,6 +138,7 @@ In order to test the logic above, the integrators of your backstage instance nee + result: AuthorizeResult.DENY, + }; + } ++ return { result: AuthorizeResult.ALLOW, }; @@ -182,4 +167,4 @@ Let's flip the result back to `ALLOW`: }; ``` -now the create endpoint should be enabled again. +Now the create endpoint should be enabled again. From ddc965debe31c6b176e12f7e5d4f0aa0d1e195e2 Mon Sep 17 00:00:00 2001 From: MT Lewis Date: Mon, 14 Mar 2022 12:19:36 +0000 Subject: [PATCH 12/50] docs: tweak permission tutorial step 3 Signed-off-by: MT Lewis --- .../03-adding-a-resource-permission-check.md | 44 +++++++++++++++++-- 1 file changed, 41 insertions(+), 3 deletions(-) diff --git a/docs/permission/plugin-authors/03-adding-a-resource-permission-check.md b/docs/permission/plugin-authors/03-adding-a-resource-permission-check.md index 9dbe0e3807..f0f9d0db6d 100644 --- a/docs/permission/plugin-authors/03-adding-a-resource-permission-check.md +++ b/docs/permission/plugin-authors/03-adding-a-resource-permission-check.md @@ -4,11 +4,40 @@ title: 3. Adding a resource permission check description: Explains how to add a resource permission check to a Backstage plugin --- -When performing updates (or other operations) on specific resources, the permissions framework allows for the decision to be based on characteristics of the resource itself. This means that it's possible to write policies that (for example) allow the operation for users that own a resource, and deny the operation otherwise. +When performing updates (or other operations) on specific [resources](../concepts.md#resources-and-rules), the permissions framework allows for the decision to be based on characteristics of the resource itself. This means that it's possible to write policies that (for example) allow the operation for users that own a resource, and deny the operation otherwise. // TODO(vinzscam): remind that the plugin used in this tutorial is bringing its own types to backstage. // for plugins relying on external entities (like catalog entities) please follow [link] tutorial. +## Creating a new permission + +Let's add a new permission to the file `plugins/todo-list-backend/src/service/permissions.ts` from [the previous step](./02-adding-a-basic-permission-check.md). + +```diff +import { Permission } from '@backstage/plugin-permission-common'; + ++export const TODO_LIST_RESOURCE_TYPE = 'todo-item'; ++ +export const todosListCreate: Permission = { + name: 'todos.list.create', + attributes: { + action: 'create', + }, +}; ++ ++export const todosListUpdate: Permission = { ++ name: 'todos.list.update', ++ attributes: { ++ action: 'update', ++ }, ++ resourceType: TODO_LIST_RESOURCE_TYPE, ++}; +``` + +Notice that unlike `todosListCreate`, the `todosListUpdate` permission contains a `resourceType` field. This field indicates to the permission framework that this permission is intended to be authorized in the context of a resource with type `'todo-item'`. You can use whatever value you like as the resource type, as long as you use the same value consistently for each type of resource. + +## Authorizing using the new permission + To start with, let's edit `plugins/todo-list-backend/src/service/router.ts` in a similar way as in the previous step. ```diff @@ -17,7 +46,6 @@ To start with, let's edit `plugins/todo-list-backend/src/service/router.ts` in a ... - router.put('/todos', async (req, res) => { + const token = getBearerTokenFromAuthorizationHeader( + req.header('authorization'), @@ -90,6 +118,8 @@ Unexpected response from plugin upstream when applying conditions. Expected 200 This happens because our plugin should have exposed a specific endpoint, used by the permission framework to apply conditional decisions. The new endpoint should also be able to support some conditions. In our case, `IS_OWNER` is the only type of condition we want to support. You can add as many built-in conditions as you like to your plugin, and you can also allow Backstage integrators to supply more conditions when starting your backend if you want. +## Adding support for conditional decisions + Install the missing module: ``` @@ -98,6 +128,8 @@ $ yarn workspace @internal/plugin-todo-list-backend add @backstage/plugin-permis Create a new `plugins/todo-list-backend/src/service/rules.ts` file and append the following code: + + ```diff + import { makeCreatePermissionRule } from '@backstage/plugin-permission-node'; + import { Todo, TodoFilter } from './todos'; @@ -128,7 +160,11 @@ Specifically, the `apply` function is used to understand whether the passed reso Let's skip the `toQuery` function for now. -Now, let's create the new endpoint by editing `plugins/todo-list-backend/src/service/router.ts`: +Now, let's create the new endpoint by editing `plugins/todo-list-backend/src/service/router.ts`. This uses the `createPermissionIntegrationRouter` helper to add the APIs needed by the permission framework to your plugin. You'll need to supply: + +- `getResources`: a function that accepts an array of `resourceRefs` in the same format you expect to be passed to `authorize`, and returns an array of the corresponding resources. +- `resourceType`: the same value used in the permission rule above. +- `rules`: an array of all the permission rules you want to support in conditional decisions. ```diff + import { createPermissionIntegrationRouter } from '@backstage/plugin-permission-node'; @@ -157,4 +193,6 @@ Now, let's create the new endpoint by editing `plugins/todo-list-backend/src/ser router.post('/todos', async (req, res) => { ``` +## Test the authorized update endpoint + To check that everything works as expected, you should see an error in the UI whenever you try to edit an item that wasn’t created by you. From ac976be7ee4de4ec6990dc4769b16e6b3588cc2f Mon Sep 17 00:00:00 2001 From: MT Lewis Date: Mon, 14 Mar 2022 15:03:06 +0000 Subject: [PATCH 13/50] docs: tweak permission tutorial step 4 Signed-off-by: MT Lewis --- ...04-authorizing-access-to-paginated-data.md | 71 +++++++++++++------ 1 file changed, 51 insertions(+), 20 deletions(-) diff --git a/docs/permission/plugin-authors/04-authorizing-access-to-paginated-data.md b/docs/permission/plugin-authors/04-authorizing-access-to-paginated-data.md index d1d652c9a7..686c60ed66 100644 --- a/docs/permission/plugin-authors/04-authorizing-access-to-paginated-data.md +++ b/docs/permission/plugin-authors/04-authorizing-access-to-paginated-data.md @@ -6,10 +6,9 @@ description: Explains how to authorize access to paginated data in a Backstage p Authorizing `GET /todos` is similar to the update endpoint, in that it should be possible to authorize read access to todo entries based on their characteristics. When a `GET /todos` request is received, only the items that the user is permitted to see should be returned. -As in the previous case, the permission policy can't take the decision itself, meaning that a conditional decision should be returned. -However, this time rather than a single `resourceRef` we have a whole list of resources to authorize. +As in the previous case, the permission policy can't take the decision itself, meaning that a conditional decision should be returned. However, this time rather than a single `resourceRef`, we have a whole list of resources to authorize. -Potentially, something like this could be done: +Potentially, we could implement something like the below, leveraging the batching functionality to authorize all of the todos, and then returning only the ones for which the decision was `ALLOW`: ```diff router.get('/todos', async (req, res) => { @@ -28,9 +27,46 @@ Potentially, something like this could be done: }); ``` -This should do the trick. However, this approach has a downside. It would force us to retrieve all the elements upfront and authorize them one by one, and mean that concerns like pagination that are handled by the data source today also need to move into the plugin. +This approach will work for simple cases, but it has a downside: it forces us to retrieve all the elements upfront and authorize them one by one, and means that concerns like pagination that are handled by the data source today also need to move into the plugin. -To avoid this situation, the permissions framework has support for filtering items in the data source itself. +To avoid this situation, the permissions framework has support for filtering items in the data source itself. In this tutorial, we'll create a permission for reading todo items, and use it to filter out unauthorized todo items in the data store itself. + +> Note: in order to perform authorization filtering in this way, the data source must allow filters to be logically combined with AND, OR, and NOT operators. The conditional decisions returned by the permissions framework use a [nested object](https://backstage.io/docs/reference/plugin-permission-common.permissioncriteria) to combine conditions. If you're implementing a filter API from scratch, we recommend using the same shape for ease of interoperability. If not, you'll need to implement a function which transforms the nested object into your own format. + +## Creating a new permission + +Let's add another permission to the file `plugins/todo-list-backend/src/service/permissions.ts`, with the same structure as the existing `todosListUpdate` permission: + +```diff +import { Permission } from '@backstage/plugin-permission-common';$$ + +export const TODO_LIST_RESOURCE_TYPE = 'todo-item'; + +export const todosListCreate: Permission = { + name: 'todos.list.create', + attributes: { + action: 'create', + }, +}; + +export const todosListUpdate: Permission = { + name: 'todos.list.update', + attributes: { + action: 'update', + }, + resourceType: TODO_LIST_RESOURCE_TYPE, +}; ++ ++export const todosListRead: Permission = { ++ name: 'todos.list.read', ++ attributes: { ++ action: 'read', ++ }, ++ resourceType: TODO_LIST_RESOURCE_TYPE, ++}; +``` + +## Authorizing using the new permission `plugins/todo-list-backend/src/service/router.ts` @@ -47,23 +83,26 @@ To avoid this situation, the permissions framework has support for filtering ite + todosListRead, TODO_LIST_RESOURCE_TYPE, } from './permissions'; ++ import { rules } from './rules'; router.get('/todos', async (req, res) => { + const token = getBearerTokenFromAuthorizationHeader( + req.header('authorization'), + ); ++ + const decision = ( + await permissions.authorize([{ permission: todosListRead }], { + token, + }) + )[0]; ++ + if (decision.result === AuthorizeResult.DENY) { + throw new NotAllowedError('Unauthorized'); + } - ++ + if (decision.result === AuthorizeResult.CONDITIONAL) { + const conditionTransformer: ConditionTransformer = -+ createConditionTransformer(rules); ++ createConditionTransformer(Object.values(rules)); + const filter = conditionTransformer(decision.conditions) as TodoFilter; + res.json(getAll(filter)); + return; @@ -73,23 +112,15 @@ To avoid this situation, the permissions framework has support for filtering ite }); ``` -In this case, we are not passing any `resourceRef` when invoking `permissions.authorize()`. +In this case, we are not passing a `resourceRef` when invoking `permissions.authorize()`. Since there is no `resourceRef`, the permission framework can't apply conditions, and instead returns conditional decisions all the way back to the caller - in this case, the `todo-list-backend`. -Since there is no `resourceRef` and the permission policy is returning a conditional response, the permission framework can't make a decision -on its own and it's expecting the todo list backend's router to take care of this case. +To make the process of handling conditional decisions easier, the permission framework provides a `createConditionTransformer` helper. This function accepts an array of permission rules, and returns a transformer function which converts the conditions in conditional decisions to the format needed by the plugin using the `toQuery` method on permission rules. -Instead of authorizing every todo item one by one, we can implement this more efficiently. +Since the todo api groups filters using the same nested object structure as the permission framework, we can pass the output of our condition transformer straight to it. If the filters were grouped differently, we'd need to transform it at this point before passing it to the api. -If all the items were stored in a database, we could transform each permission result in the proper database query, letting the database do the filtering. +## Test the authorized read endpoint -If this approach is not applicable, you can still use the result-by-result authorization approach mentioned at the beginning of the section. - -Fortunately, our todo service is smart enough and lets us pass an optional `filter` function when invoking `getAll()`. -This is exactly what the `toQuery` field in the permission rule does. - -In this particular example, the `isOwner` rule returns a function (expected by `getAll` method). But there is no constraint regarding the shape of the returned object: any type of data can be returned. - -Now let's update our permission policy's handler to return a conditional result whenever a todosListCreate permission is received. We could reuse the same result as the update action: +Let's update our permission policy's handler to return a conditional result whenever a todosListCreate permission is received. We could reuse the same result as the update action: ```diff if (request.permission.resourceType === 'todo-item') { From 69fa90f1815e314388a0b9998180173c9f0eabb1 Mon Sep 17 00:00:00 2001 From: MT Lewis Date: Tue, 15 Mar 2022 12:55:04 +0000 Subject: [PATCH 14/50] permission-docs: update versions in example packages Signed-off-by: MT Lewis --- contrib/plugins/todo-list-backend/package.json | 10 +++++----- contrib/plugins/todo-list/package.json | 6 +++--- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/contrib/plugins/todo-list-backend/package.json b/contrib/plugins/todo-list-backend/package.json index b07675c8f1..614f5520af 100644 --- a/contrib/plugins/todo-list-backend/package.json +++ b/contrib/plugins/todo-list-backend/package.json @@ -20,10 +20,10 @@ "clean": "backstage-cli clean" }, "dependencies": { - "@backstage/backend-common": "^0.10.6", + "@backstage/backend-common": "^0.10.7", "@backstage/config": "^0.1.13", "@backstage/errors": "^0.2.0", - "@backstage/plugin-auth-node": "^0.1.2", + "@backstage/plugin-auth-node": "^0.1.0", "@types/express": "*", "cross-fetch": "^3.0.6", "express": "^4.17.1", @@ -33,11 +33,11 @@ "yn": "^4.0.0" }, "devDependencies": { - "@backstage/cli": "^0.13.1", + "@backstage/cli": "^0.13.2", "@types/supertest": "^2.0.8", - "@types/uuid": "^8.3.4", + "@types/uuid": "^8.0.0", "msw": "^0.35.0", - "supertest": "^4.0.2" + "supertest": "^6.1.6" }, "files": [ "dist" diff --git a/contrib/plugins/todo-list/package.json b/contrib/plugins/todo-list/package.json index a6ee069c00..74fa881803 100644 --- a/contrib/plugins/todo-list/package.json +++ b/contrib/plugins/todo-list/package.json @@ -21,7 +21,7 @@ "clean": "backstage-cli clean" }, "dependencies": { - "@backstage/core-components": "^0.8.7", + "@backstage/core-components": "^0.8.8", "@backstage/core-plugin-api": "^0.6.0", "@backstage/theme": "^0.2.14", "@material-ui/core": "^4.12.2", @@ -33,9 +33,9 @@ "react": "^16.13.1 || ^17.0.0" }, "devDependencies": { - "@backstage/cli": "^0.13.1", + "@backstage/cli": "^0.13.2", "@backstage/core-app-api": "^0.5.2", - "@backstage/dev-utils": "^0.2.12", + "@backstage/dev-utils": "^0.2.21", "@backstage/test-utils": "^0.2.4", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^11.2.5", From 201d91ba9c51ee127b4beaa501832d4a3ceafa05 Mon Sep 17 00:00:00 2001 From: MT Lewis Date: Tue, 15 Mar 2022 13:20:12 +0000 Subject: [PATCH 15/50] permission-docs: fix standaloneServer in todo-list-backend example plugin Signed-off-by: MT Lewis --- .../plugins/todo-list-backend/src/service/standaloneServer.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contrib/plugins/todo-list-backend/src/service/standaloneServer.ts b/contrib/plugins/todo-list-backend/src/service/standaloneServer.ts index 393b71ee8e..b0332e0931 100644 --- a/contrib/plugins/todo-list-backend/src/service/standaloneServer.ts +++ b/contrib/plugins/todo-list-backend/src/service/standaloneServer.ts @@ -39,7 +39,7 @@ export async function startStandaloneServer( const discovery = SingleHostDiscovery.fromConfig(config); const router = await createRouter({ logger, - identity: new IdentityClient({ + identity: IdentityClient.create({ discovery, issuer: await discovery.getExternalBaseUrl('auth'), }), From 6fb3edb4f62f786d4bc5216d3a0d790a854fc3ae Mon Sep 17 00:00:00 2001 From: MT Lewis Date: Tue, 15 Mar 2022 13:20:53 +0000 Subject: [PATCH 16/50] permission-docs: add support for grouped declarative filters in todo-list-backend example plugin Signed-off-by: MT Lewis --- .../todo-list-backend/src/service/router.ts | 2 +- .../todo-list-backend/src/service/todos.ts | 44 +++++++++++++++---- 2 files changed, 37 insertions(+), 9 deletions(-) diff --git a/contrib/plugins/todo-list-backend/src/service/router.ts b/contrib/plugins/todo-list-backend/src/service/router.ts index 2fd9dfea9a..c6d9b503ed 100644 --- a/contrib/plugins/todo-list-backend/src/service/router.ts +++ b/contrib/plugins/todo-list-backend/src/service/router.ts @@ -15,7 +15,6 @@ */ import { errorHandler } from '@backstage/backend-common'; -import { InputError } from '@backstage/errors'; import express from 'express'; import Router from 'express-promise-router'; import { Logger } from 'winston'; @@ -24,6 +23,7 @@ import { getBearerTokenFromAuthorizationHeader, } from '@backstage/plugin-auth-node'; import { add, getAll, update } from './todos'; +import { InputError } from '@backstage/errors'; export interface RouterOptions { logger: Logger; diff --git a/contrib/plugins/todo-list-backend/src/service/todos.ts b/contrib/plugins/todo-list-backend/src/service/todos.ts index 54d07cf059..b87ab7557e 100644 --- a/contrib/plugins/todo-list-backend/src/service/todos.ts +++ b/contrib/plugins/todo-list-backend/src/service/todos.ts @@ -23,10 +23,41 @@ export type Todo = { timestamp: number; }; -export type TodoFilter = Parameters['filter']>[0]; +export type TodoFilter = { + property: Exclude; + values: Array; +}; + +export type TodoFilters = + | { + anyOf: TodoFilters[]; + } + | { allOf: TodoFilters[] } + | { not: TodoFilters } + | TodoFilter; const todos: { [key: string]: Todo } = {}; +const matches = (todo: Todo, filters?: TodoFilters): boolean => { + if (!filters) { + return true; + } + + if ('allOf' in filters) { + return filters.allOf.every(filter => matches(todo, filter)); + } + + if ('anyOf' in filters) { + return filters.anyOf.some(filter => matches(todo, filter)); + } + + if ('not' in filters) { + return !matches(todo, filters.not); + } + + return filters.values.includes(todo[filters.property]); +}; + export function add(todo: Omit) { const id = uuid(); @@ -50,13 +81,10 @@ export function update({ id, title }: { id: string; title: string }) { return todo; } -export function getAll(filter?: TodoFilter) { - let values = Object.values(todos); - if (filter) { - values = values.filter(filter); - } - - return values.sort((a, b) => b.timestamp - a.timestamp); +export function getAll(filter?: TodoFilters) { + return Object.values(todos) + .filter(value => matches(value, filter)) + .sort((a, b) => b.timestamp - a.timestamp); } // prepopulate the db From a5321a9c7a6b90d1f3aaf3c65df492af9b8eb564 Mon Sep 17 00:00:00 2001 From: MT Lewis Date: Tue, 15 Mar 2022 14:00:57 +0000 Subject: [PATCH 17/50] permission-docs: update tutorial with boolean operator support Signed-off-by: MT Lewis --- docs/permission/plugin-authors/01-setup.md | 2 +- .../02-adding-a-basic-permission-check.md | 8 ++- .../03-adding-a-resource-permission-check.md | 54 ++++++++++--------- ...04-authorizing-access-to-paginated-data.md | 11 ++-- 4 files changed, 41 insertions(+), 34 deletions(-) diff --git a/docs/permission/plugin-authors/01-setup.md b/docs/permission/plugin-authors/01-setup.md index e47311b0d8..d07bfbf724 100644 --- a/docs/permission/plugin-authors/01-setup.md +++ b/docs/permission/plugin-authors/01-setup.md @@ -90,7 +90,7 @@ The source code is available here: apiRouter.use(notFoundHandler()); ``` - Apply the following changes to `packages/app/src/App.ts`: + Apply the following changes to `packages/app/src/App.tsx`: ```diff + import { TodoListPage } from '@internal/plugin-todo-list'; diff --git a/docs/permission/plugin-authors/02-adding-a-basic-permission-check.md b/docs/permission/plugin-authors/02-adding-a-basic-permission-check.md index 96777762b9..939d72c84e 100644 --- a/docs/permission/plugin-authors/02-adding-a-basic-permission-check.md +++ b/docs/permission/plugin-authors/02-adding-a-basic-permission-check.md @@ -15,7 +15,8 @@ We'll start by creating a new permission, and then we'll use the permission api Install the following module: ``` -$ yarn workspace @internal/plugin-todo-list-backend add @backstage/plugin-permission-common +$ yarn workspace @internal/plugin-todo-list-backend \ + add @backstage/plugin-permission-common ``` ## Creating a new permission @@ -40,12 +41,15 @@ We recommend exporting all permissions from your plugin, so that Backstage integ Edit `plugins/todo-list-backend/src/service/router.ts`: ```diff +... + - import { InputError } from '@backstage/errors'; + import { InputError, NotAllowedError } from '@backstage/errors'; - import { add, getAll, getTodo, Todo, TodoFilter, update } from './todos'; + import { PermissionAuthorizer, AuthorizeResult } from '@backstage/plugin-permission-common'; + import { todosListCreate } from './permissions'; +... + export interface RouterOptions { logger: Logger; identity: IdentityClient; diff --git a/docs/permission/plugin-authors/03-adding-a-resource-permission-check.md b/docs/permission/plugin-authors/03-adding-a-resource-permission-check.md index f0f9d0db6d..922f44544d 100644 --- a/docs/permission/plugin-authors/03-adding-a-resource-permission-check.md +++ b/docs/permission/plugin-authors/03-adding-a-resource-permission-check.md @@ -63,12 +63,11 @@ To start with, let's edit `plugins/todo-list-backend/src/service/router.ts` in a + ) + )[0]; -- res.json(update(req.body)); -+ if (decision.result === AuthorizeResult.ALLOW) { -+ res.json(update(req.body)); -+ return; ++ if (decision.result !== AuthorizeResult.ALLOW) { ++ throw new NotAllowedError('Unauthorized'); + } -+ throw new NotAllowedError('Unauthorized'); ++ + res.json(update(req.body)); }); ``` @@ -128,29 +127,30 @@ $ yarn workspace @internal/plugin-todo-list-backend add @backstage/plugin-permis Create a new `plugins/todo-list-backend/src/service/rules.ts` file and append the following code: - +```typescript +import { makeCreatePermissionRule } from '@backstage/plugin-permission-node'; +import { Todo, TodoFilter } from './todos'; -```diff -+ import { makeCreatePermissionRule } from '@backstage/plugin-permission-node'; -+ import { Todo, TodoFilter } from './todos'; +const createTodoListPermissionRule = makeCreatePermissionRule< + Todo, + TodoFilter +>(); -+ const createTodoListPermissionRule = makeCreatePermissionRule< -+ Todo, -+ TodoFilter -+ >(); +export const isOwner = createTodoListPermissionRule({ + name: 'IS_OWNER', + description: 'Should allow only if the todo belongs to the user', + apply: (resource: Todo, userId: string) => { + return resource.author === userId; + }, + toQuery: (userId: string) => { + return { + property: 'author', + values: [userId], + }; + }, +}); -+ export const isOwner = createTodoListPermissionRule({ -+ name: 'IS_OWNER', -+ description: 'Should allow only if the todo belongs to the user', -+ apply: (resource, userId) => { -+ return resource.author === userId; -+ }, -+ toQuery: userId => { -+ return resource => resource.author === userId; -+ }, -+ }); - -+ export const rules = { isOwner }; +export const rules = { isOwner }; ``` `makeCreatePermissionRule` is a helper used to ensure that rules created for this plugin use consistent types for the resource and query. @@ -168,9 +168,11 @@ Now, let's create the new endpoint by editing `plugins/todo-list-backend/src/ser ```diff + import { createPermissionIntegrationRouter } from '@backstage/plugin-permission-node'; +- import { add, getAll, update } from './todos'; ++ import { add, getAll, getTodo, update } from './todos'; - import { todosListCreate, todosListUpdate } from './permissions'; + import { todosListCreate, todosListUpdate, TODO_LIST_RESOURCE_TYPE } from './permissions'; -+ import { rules } from './rules; ++ import { rules } from './rules'; export async function createRouter( options: RouterOptions, diff --git a/docs/permission/plugin-authors/04-authorizing-access-to-paginated-data.md b/docs/permission/plugin-authors/04-authorizing-access-to-paginated-data.md index 686c60ed66..406d201998 100644 --- a/docs/permission/plugin-authors/04-authorizing-access-to-paginated-data.md +++ b/docs/permission/plugin-authors/04-authorizing-access-to-paginated-data.md @@ -77,6 +77,8 @@ export const todosListUpdate: Permission = { + createConditionTransformer, + ConditionTransformer, + } from '@backstage/plugin-permission-node'; +- import { add, getAll, getTodo, update } from './todos'; ++ import { add, getAll, getTodo, TodoFilter, update } from './todos'; import { todosListCreate, todosListUpdate, @@ -105,10 +107,11 @@ export const todosListUpdate: Permission = { + createConditionTransformer(Object.values(rules)); + const filter = conditionTransformer(decision.conditions) as TodoFilter; + res.json(getAll(filter)); -+ return; ++ } else { ++ res.json(getAll()); + } - - res.json(getAll()); ++ } +- res.json(getAll()); }); ``` @@ -144,6 +147,4 @@ Let's update our permission policy's handler to return a conditional result when Once the changes to the permission policy are saved, the UI should should show only the items you have created. -// TODO(vinzscam): add support for boolean operators - // TODO(vinzscam): add frontend documentation From c8b8424f116eff68dd49d900203eba02669b92ba Mon Sep 17 00:00:00 2001 From: MT Lewis Date: Tue, 15 Mar 2022 17:20:58 +0000 Subject: [PATCH 18/50] docs: fix bad whitespace in permission tutorial Signed-off-by: MT Lewis --- .../plugin-authors/02-adding-a-basic-permission-check.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/permission/plugin-authors/02-adding-a-basic-permission-check.md b/docs/permission/plugin-authors/02-adding-a-basic-permission-check.md index 939d72c84e..14641b496e 100644 --- a/docs/permission/plugin-authors/02-adding-a-basic-permission-check.md +++ b/docs/permission/plugin-authors/02-adding-a-basic-permission-check.md @@ -10,7 +10,7 @@ For this tutorial, we'll use a basic permission check to authorize the `create` We'll start by creating a new permission, and then we'll use the permission api to call `authorize` with it during todo creation. -## Setup +## Setup Install the following module: From 74d59fc59b4ae045d9968b5be276d59b092f8129 Mon Sep 17 00:00:00 2001 From: MT Lewis Date: Mon, 14 Mar 2022 15:34:50 +0000 Subject: [PATCH 19/50] docs: simplify command used to populate permission tuturial code Signed-off-by: MT Lewis --- docs/permission/plugin-authors/01-setup.md | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/docs/permission/plugin-authors/01-setup.md b/docs/permission/plugin-authors/01-setup.md index d07bfbf724..6114fbd63f 100644 --- a/docs/permission/plugin-authors/01-setup.md +++ b/docs/permission/plugin-authors/01-setup.md @@ -20,16 +20,10 @@ The source code is available here: 1. Copy-paste the two folders into the plugins folder of your backstage application repository or run the following script from the root of your backstage application: ```bash - $ node -e "const{UrlReaders}=require('@backstage/backend-common');\ - const{ConfigReader}=require('@backstage/config');\ - const winston=require('winston');const{outputFile}=require('fs-extra');\ - const path=require('path');const logger=winston.createLogger({level:'info',});\ - const config=new ConfigReader({});(async function execute(){\ - const reader=UrlReaders.default({logger,config});const files=await reader.readTree(\ - 'https://github.com/backstage/backstage/tree/permission-docs\ - /contrib/plugins');return Promise.all((await files.files()).map(async file=>\ - file.path!=='README.md'&&outputFile(path.join(__dirname,'plugins',file.path),\ - await file.content(),),),).catch(console.log)})()" + $ curl https://codeload.github.com/backstage/backstage/zip/refs/heads/master | \ + tar -C plugins --strip-components=1 -xv \ + backstage-master/contrib/plugins/todo-list \ + backstage-master/contrib/plugins/todo-list-backend ``` Your application structure should look something like this: From efa4afc66142afb162e2a33199b09883dc913adf Mon Sep 17 00:00:00 2001 From: Vincenzo Scamporlino Date: Fri, 8 Apr 2022 22:14:55 +0200 Subject: [PATCH 20/50] Permission tutorial: update to recent changes Signed-off-by: Vincenzo Scamporlino --- docs/permission/getting-started.md | 76 +++++++------ .../02-adding-a-basic-permission-check.md | 42 +++---- docs/permission/writing-a-policy.md | 103 +++++++++++------- 3 files changed, 124 insertions(+), 97 deletions(-) diff --git a/docs/permission/getting-started.md b/docs/permission/getting-started.md index 0faeb679f7..6fff3f9c95 100644 --- a/docs/permission/getting-started.md +++ b/docs/permission/getting-started.md @@ -38,17 +38,22 @@ Like many other parts of Backstage, the permissions framework relies on informat The permissions framework uses a new `permission-backend` plugin to accept authorization requests from other plugins across your Backstage instance. The Backstage backend does not include this permission backend by default, so you will need to add it: -1. Add `@backstage/plugin-permission-backend` as a dependency of your Backstage backend. +1. Add `@backstage/plugin-permission-backend` as a dependency of your Backstage backend: + +```bash +$ yarn workspace backend add @backstage/plugin-permission-backend +``` + 2. Add the following to a new file, `packages/backend/src/plugins/permission.ts`. This adds the permission-backend router, and configures it with a policy which allows everything. ```typescript import { IdentityClient } from '@backstage/plugin-auth-node'; import { createRouter } from '@backstage/plugin-permission-backend'; -import { AuthorizeResult } from '@backstage/plugin-permission-common'; import { - PermissionPolicy, + AuthorizeResult, PolicyDecision, -} from '@backstage/plugin-permission-node'; +} from '@backstage/plugin-permission-common'; +import { PermissionPolicy } from '@backstage/plugin-permission-node'; import { Router } from 'express'; import { PluginEnvironment } from '../types'; @@ -61,21 +66,41 @@ class TestPermissionPolicy implements PermissionPolicy { export default async function createPlugin( env: PluginEnvironment, ): Promise { - const { config, logger, discovery } = env; return await createRouter({ - config, - logger, - discovery, + config: env.config, + logger: env.logger, + discovery: env.discovery, policy: new TestPermissionPolicy(), identity: IdentityClient.create({ - discovery, - issuer: await discovery.getExternalBaseUrl('auth'), + discovery: env.discovery, + issuer: await env.discovery.getExternalBaseUrl('auth'), }), }); } ``` -3. Wire up the permission policy in `packages/backend/src/index.ts`. [The index in the example backend](https://github.com/backstage/backstage/blob/master/packages/backend/src/index.ts) shows how to do this. You’ll need to import the module from the previous step, create a plugin environment, and add the router to the express app. +3. Wire up the permission policy in `packages/backend/src/index.ts`. [The index in the example backend](https://github.com/backstage/backstage/blob/master/packages/backend/src/index.ts) shows how to do this. You’ll need to import the module from the previous step, create a plugin environment, and add the router to the express app: + +```diff + import proxy from './plugins/proxy'; + import techdocs from './plugins/techdocs'; + import search from './plugins/search'; ++ import permission from './plugins/permission'; + + ... + + const techdocsEnv = useHotMemoize(module, () => createEnv('techdocs')); + const searchEnv = useHotMemoize(module, () => createEnv('search')); + const appEnv = useHotMemoize(module, () => createEnv('app')); ++ const permissionEnv = useHotMemoize(module, () => createEnv('permission')); + + ... + + apiRouter.use('/techdocs', await techdocs(techdocsEnv)); + apiRouter.use('/proxy', await proxy(proxyEnv)); + apiRouter.use('/search', await search(searchEnv)); ++ apiRouter.use('/permission', await permission(permissionEnv)); +``` ### 2. Enable and test the permissions system @@ -93,18 +118,21 @@ permission: ```diff import { IdentityClient } from '@backstage/plugin-auth-node'; import { createRouter } from '@backstage/plugin-permission-backend'; - import { AuthorizeResult } from '@backstage/plugin-permission-common'; import { - PermissionPolicy, -+ PolicyAuthorizeQuery, + AuthorizeResult, PolicyDecision, - } from '@backstage/plugin-permission-node'; + } from '@backstage/plugin-permission-common'; +- import { PermissionPolicy } from '@backstage/plugin-permission-node'; ++ import { ++ PermissionPolicy, ++ PolicyQuery, ++ } from '@backstage/plugin-permission-node'; import { Router } from 'express'; import { PluginEnvironment } from '../types'; class TestPermissionPolicy implements PermissionPolicy { - async handle(): Promise { -+ async handle(request: PolicyAuthorizeQuery): Promise { ++ async handle(request: PolicyQuery): Promise { + if (request.permission.name === 'catalog.entity.delete') { + return { + result: AuthorizeResult.DENY, @@ -114,22 +142,6 @@ permission: return { result: AuthorizeResult.ALLOW }; } } - - export default async function createPlugin( - env: PluginEnvironment, - ): Promise { - const { config, logger, discovery } = env; - return await createRouter({ - config, - logger, - discovery, - policy: new TestPermissionPolicy(), - identity: IdentityClient.create({ - discovery, - issuer: await discovery.getExternalBaseUrl('auth'), - }), - }); - } ``` 3. Now that you’ve made this change, you should find that the unregister entity menu option on the catalog entity page is disabled. diff --git a/docs/permission/plugin-authors/02-adding-a-basic-permission-check.md b/docs/permission/plugin-authors/02-adding-a-basic-permission-check.md index 14641b496e..8663668a42 100644 --- a/docs/permission/plugin-authors/02-adding-a-basic-permission-check.md +++ b/docs/permission/plugin-authors/02-adding-a-basic-permission-check.md @@ -16,7 +16,7 @@ Install the following module: ``` $ yarn workspace @internal/plugin-todo-list-backend \ - add @backstage/plugin-permission-common + add @backstage/plugin-permission-common ``` ## Creating a new permission @@ -24,14 +24,12 @@ $ yarn workspace @internal/plugin-todo-list-backend \ Let's create a new file `plugins/todo-list-backend/src/service/permissions.ts` with the following content: ```typescript -import { Permission } from '@backstage/plugin-permission-common'; +import { createPermission } from '@backstage/plugin-permission-common'; -export const todosListCreate: Permission = { +export const todosListCreate = createPermission({ name: 'todos.list.create', - attributes: { - action: 'create', - }, -}; + attributes: { action: 'create' }, +}); ``` We recommend exporting all permissions from your plugin, so that Backstage integrators can import them when writing policies. @@ -45,7 +43,7 @@ Edit `plugins/todo-list-backend/src/service/router.ts`: - import { InputError } from '@backstage/errors'; + import { InputError, NotAllowedError } from '@backstage/errors'; -+ import { PermissionAuthorizer, AuthorizeResult } from '@backstage/plugin-permission-common'; ++ import { PermissionEvaluator, AuthorizeResult } from '@backstage/plugin-permission-common'; + import { todosListCreate } from './permissions'; ... @@ -53,7 +51,7 @@ Edit `plugins/todo-list-backend/src/service/router.ts`: export interface RouterOptions { logger: Logger; identity: IdentityClient; -+ permissions: PermissionAuthorizer; ++ permissions: PermissionEvaluator; } export async function createRouter( @@ -117,24 +115,28 @@ That's it! Now your plugin is fully configured. Let's try to test the logic by d ## Test the authorized create endpoint +Before running this step, please make sure you followed the steps described in [Getting started](../getting-started) section. + In order to test the logic above, the integrators of your backstage instance need to change their permission policy to return `DENY` for our newly-created permission: ```diff // packages/backend/src/plugins/permission.ts - import { IdentityClient } from '@backstage/plugin-auth-node'; -+ import { BackstageIdentityResponse, IdentityClient } from '@backstage/plugin-auth-node'; ++ import { ++ BackstageIdentityResponse, ++ IdentityClient ++ } from '@backstage/plugin-auth-node'; import { PermissionPolicy, -+ PolicyAuthorizeQuery, - PolicyDecision, ++ PolicyQuery, } from '@backstage/plugin-permission-node'; -- class AllowAllPermissionPolicy implements PermissionPolicy -+ class MyPermissionPolicy implements PermissionPolicy { +- class TestPermissionPolicy implements PermissionPolicy ++ class TestPermissionPolicy implements PermissionPolicy { - async handle(): Promise { + async handle( -+ request: PolicyAuthorizeQuery, ++ request: PolicyQuery, + user?: BackstageIdentityResponse, + ): Promise { + if (request.permission.name === 'todos.list.create') { @@ -147,16 +149,6 @@ In order to test the logic above, the integrators of your backstage instance nee result: AuthorizeResult.ALLOW, }; } - - export default async function createPlugin({ - discovery, - logger, - }: PluginEnvironment) { -- const policy = new AllowAllPermissionPolicy(); -+ const policy = new MyPermissionPolicy(); - ... - - } ``` Now the frontend should show an error whenever you try to create a new Todo item. diff --git a/docs/permission/writing-a-policy.md b/docs/permission/writing-a-policy.md index 32e26b4d13..9fb742ec6e 100644 --- a/docs/permission/writing-a-policy.md +++ b/docs/permission/writing-a-policy.md @@ -12,7 +12,7 @@ That policy looked like this: // packages/backend/src/plugins/permission.ts class TestPermissionPolicy implements PermissionPolicy { - async handle(request: PolicyAuthorizeQuery): Promise { + async handle(request: PolicyQuery): Promise { if (request.permission.name === 'catalog.entity.delete') { return { result: AuthorizeResult.DENY, @@ -26,9 +26,9 @@ class TestPermissionPolicy implements PermissionPolicy { ## What's in a policy? -Let's break this down a bit further. The request object of type [PolicyAuthorizeQuery](https://backstage.io/docs/reference/plugin-permission-node.policyauthorizequery) is a simple wrapper around [the Permission object](https://backstage.io/docs/reference/plugin-permission-common.permission). This permission object encapsulates information about the action that the user is attemping to perform (See [the Concepts page](./concepts.md) for more details). +Let's break this down a bit further. The request object of type [PolicyQuery](https://backstage.io/docs/reference/plugin-permission-node.policyquery) is a simple wrapper around [the Permission object](https://backstage.io/docs/reference/plugin-permission-common.permission). This permission object encapsulates information about the action that the user is attemping to perform (See [the Concepts page](./concepts.md) for more details). -In the policy above, we are checking to see if the provided action is a catalog entity delete action, which is the permission that the catalog plugin authors have created to represent the action of unregistering a catalog entity. If this is the case, we return a [Definitive Policy Decision](https://backstage.io/docs/reference/plugin-permission-node.definitivepolicydecision) of DENY. In all other cases, we return ALLOW (resulting in an allow-by-default behavior). +In the policy above, we are checking to see if the provided action is a catalog entity delete action, which is the permission that the catalog plugin authors have created to represent the action of unregistering a catalog entity. If this is the case, we return a [Definitive Policy Decision](https://backstage.io/docs/reference/plugin-permission-common.definitivepolicydecision) of DENY. In all other cases, we return ALLOW (resulting in an allow-by-default behavior). As we confirmed in the previous section, we know that this now prevents us from unregistering catalog components. Hooray! But you may notice that this prevents _anyone_ from unregistering a component, which is not a very realistic policy. Let's improve this policy by disabling the unregister action _unless you are the owner of this component_. @@ -38,36 +38,50 @@ Let's change the policy to the following: ```diff - import { IdentityClient } from '@backstage/plugin-auth-node'; -+ import { BackstageIdentityResponse, IdentityClient } from '@backstage/plugin-auth-node'; -+ import { catalogConditions, createCatalogPolicyDecision } from '@backstage/plugin-catalog-backend'; ++ import { ++ BackstageIdentityResponse, ++ IdentityClient ++ } from '@backstage/plugin-auth-node'; + import { + AuthorizeResult, + PolicyDecision, ++ isResourcePermission, +} from '@backstage/plugin-permission-common'; ++ import { ++ catalogConditions, ++ createCatalogConditionalDecision, ++ } from '@backstage/plugin-catalog-backend'; ... class TestPermissionPolicy implements PermissionPolicy { -- async handle(request: PolicyAuthorizeQuery): Promise { +- async handle(request: PolicyQuery): Promise { + async handle( -+ request: PolicyAuthorizeQuery, ++ request: PolicyQuery, + user?: BackstageIdentityResponse, + ): Promise { - if (request.permission.name === 'catalog.entity.delete') { -- return { -- result: AuthorizeResult.DENY, -- }; -+ return createCatalogPolicyDecision( -+ catalogConditions.isEntityOwner( -+ user?.identity.ownershipEntityRefs ?? [], -+ ), -+ ); - } ++ if (isResourcePermission(request.permission, 'catalog-entity')) { + if (request.permission.name === 'catalog.entity.delete') { +- return { +- result: AuthorizeResult.DENY, +- }; ++ return createCatalogConditionalDecision( ++ request.permission, ++ catalogConditions.isEntityOwner( ++ user?.identity.ownershipEntityRefs ?? [], ++ ), ++ ); + } ++ } return { result: AuthorizeResult.ALLOW }; } } ``` -Let's walk through the new code that we just added. Inside of the if statement, instead of returning a Definitive Policy Decision of DENY, we now return a [Conditional Policy Decision](https://backstage.io/docs/reference/plugin-permission-node.conditionalpolicydecision) (See the [Concepts page](./concepts.md) for more details). This is a way for policies to defer the evaulation of the decision back to the plugin which owns the permission. This allows the framework to support cases in which the policy does not have all the information required to make a decision. +Let's walk through the new code that we just added. Inside of the if statement, instead of returning a Definitive Policy Decision of DENY, we now return a [Conditional Policy Decision](https://backstage.io/docs/reference/plugin-permission-common.conditionalpolicydecision) (See the [Concepts page](./concepts.md) for more details). This is a way for policies to defer the evaluation of the decision back to the plugin which owns the permission. This allows the framework to support cases in which the policy does not have all the information required to make a decision. -In the policy above, there's no way for the handle method to determine whether the user who is trying to unregister the entity is the owner of that entity. So we use the `createCatalogPolicyDecision` helper provided by the catalog backend to craft a conditional decision, which allows us to tell the catalog backend that it should only return ALLOW if the user owns the entity. +In the policy above, there's no way for the handle method to determine whether the user who is trying to unregister the entity is the owner of that entity. So we use the `createCatalogConditionalDecision` helper provided by the catalog backend to craft a conditional decision, which allows us to tell the catalog backend that it should only return ALLOW if the user owns the entity. Keep in mind that, in order to return a Conditional Policy Decision, the permission needs to be of type [ResourcePermission](https://backstage.io/docs/reference/plugin-permission-common.resourcepermission): the [isResourcePermission](https://backstage.io/docs/reference/plugin-permission-common.isresourcepermission) method guarantees the correct type in the scope of the condition. The `catalogConditions` object contains various conditions that the catalog plug authors have provided for us to use in authoring our policy. Thankfully, they have provided the `isEntityOwner` rule, which is exactly what we need. @@ -84,12 +98,14 @@ In addition to the conditions provided by the catalog plugin, you can write your Now let's say we would also like to restrict users from viewing catalog entities that they do not own, just like we did for unregistering entities. One way to achieve this may be to simply duplicate our if statement and check for the `catalog.entity.read` permission: ```diff - async handle( - request: PolicyAuthorizeQuery, - user?: BackstageIdentityResponse, - ): Promise { - if (request.permission.name === 'catalog.entity.delete') { - return createCatalogPolicyDecision( + async handle( + request: PolicyQuery, + user?: BackstageIdentityResponse, + ): Promise { + if (isResourcePermission(request.permission, 'catalog-entity')) { + if (request.permission.name === 'catalog.entity-delete') { + return createCatalogConditionalDecision( + request.permission, catalogConditions.isEntityOwner( user?.identity.ownershipEntityRefs ?? [], ), @@ -97,27 +113,33 @@ Now let's say we would also like to restrict users from viewing catalog entities } + if (request.permission.name === 'catalog.entity.read') { -+ return createCatalogPolicyDecision( ++ return createCatalogConditionalDecision( ++ request.permission, + catalogConditions.isEntityOwner( + user?.identity.ownershipEntityRefs ?? [], + ), + ); + } - - return { result: AuthorizeResult.ALLOW }; } + return { result: AuthorizeResult.ALLOW }; + } ``` -If you choose to write your policy this way, it will certainly work! You should be able to verify this by saving this policy and seeing that the catalog now only shows the entities that you own. However, you can imagine that as policies grow to handle many different permissions, these conditionals can quickly become repetitive. We can author this same policy in a more scalable way by using resource types. +If you choose to write your policy this way, it will certainly work! You should be able to verify this by saving this policy and seeing that the catalog now only shows the entities that you own. However, you can imagine that as policies grow to handle many different permissions, these conditionals can quickly become repetitive. We can author this same policy in a more scalable way by using permission attributes. ```diff - async handle( - request: PolicyAuthorizeQuery, - user?: BackstageIdentityResponse, - ): Promise { -- if (request.permission.name === 'catalog.entity.delete') { -+ if (request.permission.resourceType === 'catalog-entity') { - return createCatalogPolicyDecision( + async handle( + request: PolicyQuery, + user?: BackstageIdentityResponse, + ): Promise { + if (isResourcePermission(request.permission, 'catalog-entity')) { +- if (request.permission.name === 'catalog.entity-delete') { ++ if ( ++ request.permission.attributes.action === 'delete' || ++ request.permission.attributes.action === 'read' ++ ) { + return createCatalogConditionalDecision( + request.permission, catalogConditions.isEntityOwner( user?.identity.ownershipEntityRefs ?? [], ), @@ -125,18 +147,19 @@ If you choose to write your policy this way, it will certainly work! You should } - if (request.permission.name === 'catalog.entity.read') { -- return createCatalogPolicyDecision( +- return createCatalogConditionalDecision( +- request.permission, - catalogConditions.isEntityOwner( - user?.identity.ownershipEntityRefs ?? [], - ), - ); - } -- - return { result: AuthorizeResult.ALLOW }; } + return { result: AuthorizeResult.ALLOW }; + } ``` -In this example, we use the `catalog-entity` resource type to catch all authorization requests that have to do with resources from the catalog. Now, you should be able to see the same functionality as before (only see the catalog entities that you own) - success! +In this example, we use the `action` permission attribute to catch all authorization requests that have to do with `read` and `delete` permissions. Now, you should be able to see the same functionality as before (only see the catalog entities that you own) - success! _Note:_ Notice that while the `catalogEntityDeletePermission` and the `catalogEntityReadPermission` used here have the `'catalog-entity'` resource type, the [`catalogEntityCreatePermission`](https://github.com/backstage/backstage/blob/1e5e9fb9de9856a49e60fc70c38a4e4e94c69570/plugins/catalog-common/src/permissions.ts#L49) does not have a resource type associated with it, as it does not make sense to apply conditions to an entity that has not yet been created. From d617d4cef79ae0e798baf47a8ac130ef68d3e7c3 Mon Sep 17 00:00:00 2001 From: Joe Porpeglia Date: Mon, 11 Apr 2022 12:33:05 -0400 Subject: [PATCH 21/50] Fix diff Signed-off-by: Joe Porpeglia --- .../plugin-authors/02-adding-a-basic-permission-check.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/docs/permission/plugin-authors/02-adding-a-basic-permission-check.md b/docs/permission/plugin-authors/02-adding-a-basic-permission-check.md index 8663668a42..7e0b35bb3b 100644 --- a/docs/permission/plugin-authors/02-adding-a-basic-permission-check.md +++ b/docs/permission/plugin-authors/02-adding-a-basic-permission-check.md @@ -132,8 +132,7 @@ In order to test the logic above, the integrators of your backstage instance nee + PolicyQuery, } from '@backstage/plugin-permission-node'; -- class TestPermissionPolicy implements PermissionPolicy -+ class TestPermissionPolicy implements PermissionPolicy { + class TestPermissionPolicy implements PermissionPolicy { - async handle(): Promise { + async handle( + request: PolicyQuery, From 27aab498ec8b68c0d24694136377a1eb85c89386 Mon Sep 17 00:00:00 2001 From: Joe Porpeglia Date: Mon, 11 Apr 2022 12:37:17 -0400 Subject: [PATCH 22/50] Update md file link Signed-off-by: Joe Porpeglia --- .../plugin-authors/02-adding-a-basic-permission-check.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/permission/plugin-authors/02-adding-a-basic-permission-check.md b/docs/permission/plugin-authors/02-adding-a-basic-permission-check.md index 7e0b35bb3b..776bde0d97 100644 --- a/docs/permission/plugin-authors/02-adding-a-basic-permission-check.md +++ b/docs/permission/plugin-authors/02-adding-a-basic-permission-check.md @@ -115,7 +115,7 @@ That's it! Now your plugin is fully configured. Let's try to test the logic by d ## Test the authorized create endpoint -Before running this step, please make sure you followed the steps described in [Getting started](../getting-started) section. +Before running this step, please make sure you followed the steps described in [Getting started](../getting-started.md) section. In order to test the logic above, the integrators of your backstage instance need to change their permission policy to return `DENY` for our newly-created permission: From 11841576a90987f6081a09f0a44e79e249fe989a Mon Sep 17 00:00:00 2001 From: Joe Porpeglia Date: Mon, 11 Apr 2022 16:56:04 -0400 Subject: [PATCH 23/50] Refactor writing-a-policy doc Signed-off-by: Joe Porpeglia --- docs/permission/writing-a-policy.md | 144 ++++++++++++---------------- 1 file changed, 61 insertions(+), 83 deletions(-) diff --git a/docs/permission/writing-a-policy.md b/docs/permission/writing-a-policy.md index 9fb742ec6e..ecc5104185 100644 --- a/docs/permission/writing-a-policy.md +++ b/docs/permission/writing-a-policy.md @@ -26,7 +26,7 @@ class TestPermissionPolicy implements PermissionPolicy { ## What's in a policy? -Let's break this down a bit further. The request object of type [PolicyQuery](https://backstage.io/docs/reference/plugin-permission-node.policyquery) is a simple wrapper around [the Permission object](https://backstage.io/docs/reference/plugin-permission-common.permission). This permission object encapsulates information about the action that the user is attemping to perform (See [the Concepts page](./concepts.md) for more details). +Let's break this down a bit further. The request object of type [PolicyQuery](https://backstage.io/docs/reference/plugin-permission-node.policyquery) is a simple wrapper around [the Permission object](https://backstage.io/docs/reference/plugin-permission-common.permission). This permission object encapsulates information about the action that the user is attempting to perform (See [the Concepts page](./concepts.md) for more details). In the policy above, we are checking to see if the provided action is a catalog entity delete action, which is the permission that the catalog plugin authors have created to represent the action of unregistering a catalog entity. If this is the case, we return a [Definitive Policy Decision](https://backstage.io/docs/reference/plugin-permission-common.definitivepolicydecision) of DENY. In all other cases, we return ALLOW (resulting in an allow-by-default behavior). @@ -45,12 +45,15 @@ Let's change the policy to the following: import { AuthorizeResult, PolicyDecision, -+ isResourcePermission, ++ isPermission, } from '@backstage/plugin-permission-common'; + import { + catalogConditions, + createCatalogConditionalDecision, + } from '@backstage/plugin-catalog-backend'; ++ import { ++ catalogEntityDeletePermission, ++ } from '@backstage/plugin-catalog-common'; ... @@ -60,109 +63,84 @@ Let's change the policy to the following: + request: PolicyQuery, + user?: BackstageIdentityResponse, + ): Promise { -+ if (isResourcePermission(request.permission, 'catalog-entity')) { - if (request.permission.name === 'catalog.entity.delete') { -- return { -- result: AuthorizeResult.DENY, -- }; -+ return createCatalogConditionalDecision( -+ request.permission, -+ catalogConditions.isEntityOwner( -+ user?.identity.ownershipEntityRefs ?? [], -+ ), -+ ); - } -+ } - - return { result: AuthorizeResult.ALLOW }; - } - } -``` - -Let's walk through the new code that we just added. Inside of the if statement, instead of returning a Definitive Policy Decision of DENY, we now return a [Conditional Policy Decision](https://backstage.io/docs/reference/plugin-permission-common.conditionalpolicydecision) (See the [Concepts page](./concepts.md) for more details). This is a way for policies to defer the evaluation of the decision back to the plugin which owns the permission. This allows the framework to support cases in which the policy does not have all the information required to make a decision. - -In the policy above, there's no way for the handle method to determine whether the user who is trying to unregister the entity is the owner of that entity. So we use the `createCatalogConditionalDecision` helper provided by the catalog backend to craft a conditional decision, which allows us to tell the catalog backend that it should only return ALLOW if the user owns the entity. Keep in mind that, in order to return a Conditional Policy Decision, the permission needs to be of type [ResourcePermission](https://backstage.io/docs/reference/plugin-permission-common.resourcepermission): the [isResourcePermission](https://backstage.io/docs/reference/plugin-permission-common.isresourcepermission) method guarantees the correct type in the scope of the condition. - -The `catalogConditions` object contains various conditions that the catalog plug authors have provided for us to use in authoring our policy. Thankfully, they have provided the `isEntityOwner` rule, which is exactly what we need. - -The `isEntityOwner` rule needs a list of claims as a parameter, and the second argument to our `handle` method provides us with a `BackstageIdentityResponse` object, from which we can grab the user's `ownershipEntityRefs`. We provide an empty array as a fallback since the user may be anonymous. - -You should now be able to see in your Backstage app that the unregister entity button is enabled for entities that you own, but disabled for all other entities! - -### Custom conditions - -In addition to the conditions provided by the catalog plugin, you can write your own conditions for the catalog (or for any plugin that implements permissions, for that matter). This is done by using the [`createConditionFactory` helper](https://backstage.io/docs/reference/plugin-permission-node.createconditionfactory) provided by the `@backstage/plugin-permission-node` package. - -## Resource types - -Now let's say we would also like to restrict users from viewing catalog entities that they do not own, just like we did for unregistering entities. One way to achieve this may be to simply duplicate our if statement and check for the `catalog.entity.read` permission: - -```diff - async handle( - request: PolicyQuery, - user?: BackstageIdentityResponse, - ): Promise { - if (isResourcePermission(request.permission, 'catalog-entity')) { - if (request.permission.name === 'catalog.entity-delete') { - return createCatalogConditionalDecision( - request.permission, - catalogConditions.isEntityOwner( - user?.identity.ownershipEntityRefs ?? [], - ), - ); - } - -+ if (request.permission.name === 'catalog.entity.read') { +- if (request.permission.name === 'catalog.entity.delete') { ++ if (isPermission(request.permission, catalogEntityDeletePermission)) { +- return { +- result: AuthorizeResult.DENY, +- }; + return createCatalogConditionalDecision( + request.permission, + catalogConditions.isEntityOwner( + user?.identity.ownershipEntityRefs ?? [], + ), + ); -+ } + } + + return { result: AuthorizeResult.ALLOW }; } - return { result: AuthorizeResult.ALLOW }; } ``` -If you choose to write your policy this way, it will certainly work! You should be able to verify this by saving this policy and seeing that the catalog now only shows the entities that you own. However, you can imagine that as policies grow to handle many different permissions, these conditionals can quickly become repetitive. We can author this same policy in a more scalable way by using permission attributes. +Let's walk through the new code that we just added. + +Instead of returning an Definitive Policy Decision, we use factory methods to construct a [Conditional Policy Decision](https://backstage.io/docs/reference/plugin-permission-common.conditionalpolicydecision) (See the [Concepts page](./concepts.md) for more details). Since the policy doesn't have enough information to determine if `user` is the entity owner, this criteria is encapsulated within the conditional decision. However, `createCatalogConditionalDecision` will not compile unless `request.permission` is a catalog entity [`ResourcePermission`](https://backstage.io/docs/reference/plugin-permission-common.resourcepermission). This type constraint ensures that policies return conditional decisions that are compatible with the requested permission. To address this, we use [`isPermission`](https://backstage.io/docs/reference/plugin-permission-common.ispermission) to ["narrow"](https://www.typescriptlang.org/docs/handbook/2/narrowing.html) the type of `request.permission` to `ResourcePermission<'catalog-entity'>`. This matches the runtime behavior that was in place before, but you'll notice that the type of `request.permission` has changed within the scope of that `if` statement. + +The `catalogConditions` object contains all of the rules defined by the catalog plugin. These rules can be combined to form a [`PermissionCriteria`](https://backstage.io/docs/reference/plugin-permission-common.permissioncriteria) object, but for this case we only need to use the `isEntityOwner` rule. This rule accepts a list of entity refs that represent User identity and Group membership used to determine ownership. The second argument to `PermissionPolicy#handle` provides us with a `BackstageIdentityResponse` object, from which we can grab the user's `ownershipEntityRefs`. We provide an empty array as a fallback since the user may be anonymous. + +You should now be able to see in your Backstage app that the unregister entity button is enabled for entities that you own, but disabled for all other entities! + +## Resource types + +Now let's say we want to prevent all actions on catalog entities unless performed by the owner. One way to achieve this may be to simply update the `if` statement and check for each permission. If you choose to write your policy this way, it will certainly work! However, it may be difficult to maintain as the policy grows, and it may not be obvious if certain permissions are left out. We can author this same policy in a more scalable way by checking the resource type of the requested permission. ```diff +import { + AuthorizeResult, + PolicyDecision, +- isPermission, ++ isResourcePermission, +} from '@backstage/plugin-permission-common'; + import { + catalogConditions, + createCatalogConditionalDecision, + } from '@backstage/plugin-catalog-backend'; +- import { +- catalogEntityDeletePermission, +- } from '@backstage/plugin-catalog-common'; + +... + +class TestPermissionPolicy implements PermissionPolicy { async handle( request: PolicyQuery, user?: BackstageIdentityResponse, ): Promise { - if (isResourcePermission(request.permission, 'catalog-entity')) { -- if (request.permission.name === 'catalog.entity-delete') { -+ if ( -+ request.permission.attributes.action === 'delete' || -+ request.permission.attributes.action === 'read' -+ ) { - return createCatalogConditionalDecision( - request.permission, - catalogConditions.isEntityOwner( - user?.identity.ownershipEntityRefs ?? [], - ), - ); - } - -- if (request.permission.name === 'catalog.entity.read') { -- return createCatalogConditionalDecision( -- request.permission, -- catalogConditions.isEntityOwner( -- user?.identity.ownershipEntityRefs ?? [], -- ), -- ); -- } +- if (isPermission(request.permission, catalogEntityDeletePermission)) { ++ if (isResourcePermission(request.permission, 'catalog-entity')) { + return createCatalogConditionalDecision( + request.permission, + catalogConditions.isEntityOwner( + user?.identity.ownershipEntityRefs ?? [], + ), + ); } + return { result: AuthorizeResult.ALLOW }; } ``` -In this example, we use the `action` permission attribute to catch all authorization requests that have to do with `read` and `delete` permissions. Now, you should be able to see the same functionality as before (only see the catalog entities that you own) - success! +In this example, we use [`isResourcePermission`](https://backstage.io/docs/reference/plugin-permission-common.isresourcepermission) to match all permissions with a resource type of `catalog-entity`. Just like `isPermission`, this helper will "narrow" the type of `request.permission` and enable the use of `createCatalogConditionalDecision`. In addition to the behavior you observed before, you should also see that catalog entities are no longer visible unless you are the owner - success! -_Note:_ Notice that while the `catalogEntityDeletePermission` and the `catalogEntityReadPermission` used here have the `'catalog-entity'` resource type, the [`catalogEntityCreatePermission`](https://github.com/backstage/backstage/blob/1e5e9fb9de9856a49e60fc70c38a4e4e94c69570/plugins/catalog-common/src/permissions.ts#L49) does not have a resource type associated with it, as it does not make sense to apply conditions to an entity that has not yet been created. +_Note:_ Some catalog permissions do not have the `'catalog-entity'` resource type, such as [`catalogEntityCreatePermission`](https://github.com/backstage/backstage/blob/1e5e9fb9de9856a49e60fc70c38a4e4e94c69570/plugins/catalog-common/src/permissions.ts#L49). In those cases, a definitive decision is required because conditions can't be applied to an entity that does not exist yet. + +## Custom conditions + +In addition to the conditions provided by the catalog plugin, you can write your own conditions for the catalog (or for any plugin that implements permissions, for that matter). To write a custom condition you must do the following: + +1. Implement a new [`PermissionRule`](https://backstage.io/docs/reference/plugin-permission-node.permissionrule). +2. Register this rule with the plugin backend that owns the resource. New rules are added to the catalog plugin via [`CatalogBuilder#addPermissionRules`](https://github.com/backstage/backstage/blob/1f873a0908d73888892b30faca9a79dfcf908ad1/plugins/catalog-backend/src/service/CatalogBuilder.ts#L344), but each plugin may define its own API for this functionality. +3. Use the [`createConditionFactory`](https://backstage.io/docs/reference/plugin-permission-node.createconditionfactory) helper to integrate with your conditional policy decisions. ## Conclusion -Through a combination of permissions and conditions, you should be able to author a policy that works for your instance of Backstage and your organzation. As the ecosystem around permissions in Backstage become more mature, you may be able to choose from other authorization packages instead of writing your own policy. If you're interested in more detailed descriptions of the concepts that comprise the permission framework, check out the [Concepts page](./concepts.md). +Through a combination of permissions and conditions, you should be able to author a policy that works for your instance of Backstage and your organization. As the ecosystem around permissions in Backstage matures, you may be able to choose from other authorization packages instead of writing your own policy. If you're interested in more detailed descriptions of the concepts that comprise the permission framework, check out the [Concepts page](./concepts.md). From 5d48b2de65f82fcd531a1ccf0719d2ba366d8ed3 Mon Sep 17 00:00:00 2001 From: Joe Porpeglia Date: Tue, 12 Apr 2022 09:37:56 -0400 Subject: [PATCH 24/50] Add note explaining outdated demo video Signed-off-by: Joe Porpeglia --- docs/permission/getting-started.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/permission/getting-started.md b/docs/permission/getting-started.md index 6fff3f9c95..0d87393b26 100644 --- a/docs/permission/getting-started.md +++ b/docs/permission/getting-started.md @@ -8,6 +8,8 @@ If you prefer to watch a video instead, you can start with this video introducti +> Note: This video was recorded in the January 2022 Contributors Session using `@backstage/create-app@0.4.14`. Some aspects of the demo may have changed in later releases. + Backstage integrators control permissions by writing a policy. In general terms, a policy is simply an async function which receives a request to authorize a specific action for a user and (optional) resource, and returns a decision on whether to authorize that permission. Integrators can implement their own policies from scratch, or adopt reusable policies written by others. ## Prerequisites From be14c351ce1ac63e965d2ed972348226147179f5 Mon Sep 17 00:00:00 2001 From: Joe Porpeglia Date: Tue, 12 Apr 2022 09:57:12 -0400 Subject: [PATCH 25/50] Use isPermission helper in test policy for plugin authors Signed-off-by: Joe Porpeglia --- .../plugin-authors/02-adding-a-basic-permission-check.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/docs/permission/plugin-authors/02-adding-a-basic-permission-check.md b/docs/permission/plugin-authors/02-adding-a-basic-permission-check.md index 776bde0d97..b561fd8059 100644 --- a/docs/permission/plugin-authors/02-adding-a-basic-permission-check.md +++ b/docs/permission/plugin-authors/02-adding-a-basic-permission-check.md @@ -131,6 +131,8 @@ In order to test the logic above, the integrators of your backstage instance nee PermissionPolicy, + PolicyQuery, } from '@backstage/plugin-permission-node'; ++ import { isPermission } from '@backstage/plugin-permission-common'; ++ import { todosListCreate } from '@internal/plugin-todo-list-backend'; class TestPermissionPolicy implements PermissionPolicy { - async handle(): Promise { @@ -138,7 +140,7 @@ In order to test the logic above, the integrators of your backstage instance nee + request: PolicyQuery, + user?: BackstageIdentityResponse, + ): Promise { -+ if (request.permission.name === 'todos.list.create') { ++ if (isPermission(request.permission, todosListCreate)) { + return { + result: AuthorizeResult.DENY, + }; From e566ac0295fc29826540f8ac004c7040219b05cf Mon Sep 17 00:00:00 2001 From: Joon Park Date: Thu, 14 Apr 2022 10:35:04 -0500 Subject: [PATCH 26/50] Update plugin author permission docs (#10782) * Update plugin author permission docs Signed-off-by: Joon Park * Reorder content Signed-off-by: Joon Park * Reconcile diffs with most recent changes to permission-docs Signed-off-by: Joon Park --- .../03-adding-a-resource-permission-check.md | 142 +++++++++--------- 1 file changed, 72 insertions(+), 70 deletions(-) diff --git a/docs/permission/plugin-authors/03-adding-a-resource-permission-check.md b/docs/permission/plugin-authors/03-adding-a-resource-permission-check.md index 922f44544d..b8cc802031 100644 --- a/docs/permission/plugin-authors/03-adding-a-resource-permission-check.md +++ b/docs/permission/plugin-authors/03-adding-a-resource-permission-check.md @@ -9,36 +9,32 @@ When performing updates (or other operations) on specific [resources](../concept // TODO(vinzscam): remind that the plugin used in this tutorial is bringing its own types to backstage. // for plugins relying on external entities (like catalog entities) please follow [link] tutorial. -## Creating a new permission +## Creating the update permission -Let's add a new permission to the file `plugins/todo-list-backend/src/service/permissions.ts` from [the previous step](./02-adding-a-basic-permission-check.md). +Let's add a new permission to the file `plugins/todo-list-backend/src/service/permissions.ts` from [the previous section](./02-adding-a-basic-permission-check.md). ```diff -import { Permission } from '@backstage/plugin-permission-common'; + import { createPermission } from '@backstage/plugin-permission-common'; -+export const TODO_LIST_RESOURCE_TYPE = 'todo-item'; ++ export const TODO_LIST_RESOURCE_TYPE = 'todo-item'; + -export const todosListCreate: Permission = { - name: 'todos.list.create', - attributes: { - action: 'create', - }, -}; + export const todosListCreate = createPermission({ + name: 'todos.list.create', + attributes: { action: 'create' }, + }); + -+export const todosListUpdate: Permission = { -+ name: 'todos.list.update', -+ attributes: { -+ action: 'update', -+ }, -+ resourceType: TODO_LIST_RESOURCE_TYPE, -+}; ++ export const todosListUpdate = createPermission({ ++ name: 'todos.list.update', ++ attributes: { action: 'update' }, ++ resourceType: TODO_LIST_RESOURCE_TYPE, ++ }); ``` -Notice that unlike `todosListCreate`, the `todosListUpdate` permission contains a `resourceType` field. This field indicates to the permission framework that this permission is intended to be authorized in the context of a resource with type `'todo-item'`. You can use whatever value you like as the resource type, as long as you use the same value consistently for each type of resource. +Notice that unlike `todosListCreate`, the `todosListUpdate` permission contains a `resourceType` field. This field indicates to the permission framework that this permission is intended to be authorized in the context of a resource with type `'todo-item'`. You can use whatever string you like as the resource type, as long as you use the same value consistently for each type of resource. -## Authorizing using the new permission +## Setting up authorization for the update permission -To start with, let's edit `plugins/todo-list-backend/src/service/router.ts` in a similar way as in the previous step. +To start, let's edit `plugins/todo-list-backend/src/service/router.ts` in the same manner as we did in the previous section: ```diff - import { todosListCreate } from './permissions'; @@ -62,60 +58,18 @@ To start with, let's edit `plugins/todo-list-backend/src/service/router.ts` in a + }, + ) + )[0]; - ++ + if (decision.result !== AuthorizeResult.ALLOW) { + throw new NotAllowedError('Unauthorized'); + } -+ + res.json(update(req.body)); }); ``` -**Important:** Notice that we are passing an extra `resourceRef` object, containing the `id` of the todo we want to authorize. +**Important:** Notice that we are passing an extra `resourceRef` field, with the `id` of the todo item as the value. -This enables decisions based on characteristics of the resource, but it's important to note that to enable authorizing multiple resources at once, **the resourceRef is not passed to PermissionPolicy#handle**. Instead, policies must return a _conditional decision_. - -Before diving into the extra steps needed for supporting conditional decisions, let's go back to the permission policy's handle function used by your adopters and try to authorize our new permission. - -Let's edit `packages/backend/src/plugins/permission.ts` - -```diff - if (request.permission.name === 'todos.list.create') { - return { - result: AuthorizeResult.DENY, - }; - } -+ if (request.permission.resourceType === 'todo-item') { -+ if (request.permission.attributes.action === 'update') { -+ return { -+ result: AuthorizeResult.CONDITIONAL, -+ pluginId: 'todolist', -+ resourceType: 'todo-item', -+ conditions: { -+ rule: 'IS_OWNER', -+ params: [user?.identity.userEntityRef], -+ }, -+ }; -+ } -+ } - return { - result: AuthorizeResult.ALLOW, - }; -``` - -This is what happens when a _Conditional Decision_ is returned. We are saying: - -> Hey permission framework, I can't make a decision alone. Please go to the plugin with id `todolist` and ask it to apply these conditions. - -Now if we try to edit an item from the UI, we should spot the following error in the backend's console: - -``` -backstage error Unexpected response from plugin upstream when applying conditions. -Expected 200 but got 404 - Not Found type=errorHandler stack=Error: -Unexpected response from plugin upstream when applying conditions. Expected 200 but got 404 - Not Found -``` - -This happens because our plugin should have exposed a specific endpoint, used by the permission framework to apply conditional decisions. The new endpoint should also be able to support some conditions. In our case, `IS_OWNER` is the only type of condition we want to support. You can add as many built-in conditions as you like to your plugin, and you can also allow Backstage integrators to supply more conditions when starting your backend if you want. +This enables decisions based on characteristics of the resource, but it's important to note that policy authors will not have access to the resource ref inside of their permission policies. Instead, the policies will return conditional decisions, which we need to now support in our plugin. ## Adding support for conditional decisions @@ -139,6 +93,7 @@ const createTodoListPermissionRule = makeCreatePermissionRule< export const isOwner = createTodoListPermissionRule({ name: 'IS_OWNER', description: 'Should allow only if the todo belongs to the user', + resourceType: 'todo-item', apply: (resource: Todo, userId: string) => { return resource.author === userId; }, @@ -158,7 +113,7 @@ export const rules = { isOwner }; We have created a new `isOwner` rule, which is going to be automatically used by the permission framework whenever a conditional response is returned in response to an authorized request with an attached `resourceRef`. Specifically, the `apply` function is used to understand whether the passed resource should be authorized or not. -Let's skip the `toQuery` function for now. +Let's skip the `toQuery` function for now, we'll come back to that in the next section. Now, let's create the new endpoint by editing `plugins/todo-list-backend/src/service/router.ts`. This uses the `createPermissionIntegrationRouter` helper to add the APIs needed by the permission framework to your plugin. You'll need to supply: @@ -170,8 +125,7 @@ Now, let's create the new endpoint by editing `plugins/todo-list-backend/src/ser + import { createPermissionIntegrationRouter } from '@backstage/plugin-permission-node'; - import { add, getAll, update } from './todos'; + import { add, getAll, getTodo, update } from './todos'; -- import { todosListCreate, todosListUpdate } from './permissions'; -+ import { todosListCreate, todosListUpdate, TODO_LIST_RESOURCE_TYPE } from './permissions'; ++ import { TODO_LIST_RESOURCE_TYPE } from './permissions'; + import { rules } from './rules'; export async function createRouter( @@ -197,4 +151,52 @@ Now, let's create the new endpoint by editing `plugins/todo-list-backend/src/ser ## Test the authorized update endpoint -To check that everything works as expected, you should see an error in the UI whenever you try to edit an item that wasn’t created by you. +Now let's go back to the permission policy's handle function (which would normally be written by your adopters) and try to authorize our new permission. + +Let's edit `packages/backend/src/plugins/permission.ts`: + +```diff + import { + BackstageIdentityResponse, + IdentityClient + } from '@backstage/plugin-auth-node'; + import { + PermissionPolicy, + PolicyQuery, + } from '@backstage/plugin-permission-node'; + import { isPermission } from '@backstage/plugin-permission-common'; +- import { todosListCreate } from '@internal/plugin-todo-list'; ++ import { ++ todosListCreate, ++ todosListUpdate, ++ TODO_LIST_RESOURCE_TYPE, ++ } from '@internal/plugin-todo-list'; + +... + + if (isPermission(request.permission, todosListCreate)) { + return { + result: AuthorizeResult.DENY, + }; + } ++ if (isPermission(request.permission, todosListUpdate)) { ++ return { ++ result: AuthorizeResult.CONDITIONAL, ++ pluginId: 'todolist', ++ resourceType: TODO_LIST_RESOURCE_TYPE, ++ conditions: { ++ rule: 'IS_OWNER', ++ params: [user?.identity.userEntityRef], ++ }, ++ }; ++ } + return { + result: AuthorizeResult.ALLOW, + }; +``` + +For any incoming update requests, we now return a _Conditional Decision_. We are saying: + +> Hey permission framework, I can't make a decision alone. Please go to the plugin with id `todolist` and ask it to apply these conditions. + +To check that everything works as expected, you should now see an error in the UI whenever you try to edit an item that wasn’t created by you. Success! From cad2ccf7288f41a6441d18880649eb53faf77571 Mon Sep 17 00:00:00 2001 From: Joon Park Date: Tue, 12 Apr 2022 13:51:44 +0100 Subject: [PATCH 27/50] Update plugin author permission docs Signed-off-by: Joon Park --- .../plugin-authors/03-adding-a-resource-permission-check.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/permission/plugin-authors/03-adding-a-resource-permission-check.md b/docs/permission/plugin-authors/03-adding-a-resource-permission-check.md index b8cc802031..e3ba40d0c2 100644 --- a/docs/permission/plugin-authors/03-adding-a-resource-permission-check.md +++ b/docs/permission/plugin-authors/03-adding-a-resource-permission-check.md @@ -151,7 +151,7 @@ Now, let's create the new endpoint by editing `plugins/todo-list-backend/src/ser ## Test the authorized update endpoint -Now let's go back to the permission policy's handle function (which would normally be written by your adopters) and try to authorize our new permission. +Now let's go back to the permission policy's handle function (which would normally be written by your integrators) and try to authorize our new permission. Let's edit `packages/backend/src/plugins/permission.ts`: From 56a8d3a6039663b962efed181f46572d3ddb1f17 Mon Sep 17 00:00:00 2001 From: Joon Park Date: Thu, 14 Apr 2022 16:33:56 +0100 Subject: [PATCH 28/50] Add todo-list-common Signed-off-by: Joon Park --- contrib/plugins/todo-list-common/.eslintrc.js | 1 + contrib/plugins/todo-list-common/README.md | 13 +++++ contrib/plugins/todo-list-common/package.json | 46 ++++++++++++++++++ contrib/plugins/todo-list-common/src/index.ts | 16 +++++++ .../todo-list-common/src/permissions.ts | 22 +++++++++ docs/permission/plugin-authors/01-setup.md | 12 +++-- .../02-adding-a-basic-permission-check.md | 47 ++++++++++--------- .../03-adding-a-resource-permission-check.md | 39 ++++++++------- packages/app/src/App.tsx | 2 + 9 files changed, 153 insertions(+), 45 deletions(-) create mode 100644 contrib/plugins/todo-list-common/.eslintrc.js create mode 100644 contrib/plugins/todo-list-common/README.md create mode 100644 contrib/plugins/todo-list-common/package.json create mode 100644 contrib/plugins/todo-list-common/src/index.ts create mode 100644 contrib/plugins/todo-list-common/src/permissions.ts diff --git a/contrib/plugins/todo-list-common/.eslintrc.js b/contrib/plugins/todo-list-common/.eslintrc.js new file mode 100644 index 0000000000..e2a53a6ad2 --- /dev/null +++ b/contrib/plugins/todo-list-common/.eslintrc.js @@ -0,0 +1 @@ +module.exports = require('@backstage/cli/config/eslint-factory')(__dirname); diff --git a/contrib/plugins/todo-list-common/README.md b/contrib/plugins/todo-list-common/README.md new file mode 100644 index 0000000000..3dc43d8dd9 --- /dev/null +++ b/contrib/plugins/todo-list-common/README.md @@ -0,0 +1,13 @@ +# todo-list-common + +Welcome to the todo-list-common plugin! + +_This plugin was created through the Backstage CLI_ + +## Getting started + +Your plugin has been added to the example app in this repository, meaning you'll be able to access it by running `yarn start` in the root directory, and then navigating to [/todo-list-common](http://localhost:3000/todo-list-common). + +You can also serve the plugin in isolation by running `yarn start` in the plugin directory. +This method of serving the plugin provides quicker iteration speed and a faster startup and hot reloads. +It is only meant for local development, and the setup for it can be found inside the [/dev](./dev) directory. diff --git a/contrib/plugins/todo-list-common/package.json b/contrib/plugins/todo-list-common/package.json new file mode 100644 index 0000000000..6ea0334388 --- /dev/null +++ b/contrib/plugins/todo-list-common/package.json @@ -0,0 +1,46 @@ +{ + "name": "@internal/plugin-todo-list-common", + "version": "1.0.0", + "main": "src/index.ts", + "types": "src/index.ts", + "license": "Apache-2.0", + "private": true, + "publishConfig": { + "access": "public", + "main": "dist/index.esm.js", + "types": "dist/index.d.ts" + }, + "backstage": { + "role": "frontend-plugin" + }, + "scripts": { + "start": "backstage-cli package start", + "build": "backstage-cli package build", + "lint": "backstage-cli package lint", + "test": "backstage-cli package test", + "clean": "backstage-cli package clean", + "prepack": "backstage-cli package prepack", + "postpack": "backstage-cli package postpack" + }, + "dependencies": { + "@backstage/core-components": "^0.9.3-next.0", + "@backstage/core-plugin-api": "^1.0.0", + "@backstage/plugin-permission-common": "^0.6.0-next.0", + "@backstage/theme": "^0.2.15" + }, + "peerDependencies": { + "react": "^16.13.1 || ^17.0.0" + }, + "devDependencies": { + "@backstage/cli": "^0.17.0-next.1", + "@backstage/core-app-api": "^1.0.1-next.0", + "@backstage/dev-utils": "^1.0.1-next.0", + "@backstage/test-utils": "^1.0.1-next.1", + "@types/node": "*", + "msw": "^0.35.0", + "cross-fetch": "^3.1.5" + }, + "files": [ + "dist" + ] +} diff --git a/contrib/plugins/todo-list-common/src/index.ts b/contrib/plugins/todo-list-common/src/index.ts new file mode 100644 index 0000000000..aff3b136bd --- /dev/null +++ b/contrib/plugins/todo-list-common/src/index.ts @@ -0,0 +1,16 @@ +/* + * Copyright 2022 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +export * from './permissions'; diff --git a/contrib/plugins/todo-list-common/src/permissions.ts b/contrib/plugins/todo-list-common/src/permissions.ts new file mode 100644 index 0000000000..a91cafad0e --- /dev/null +++ b/contrib/plugins/todo-list-common/src/permissions.ts @@ -0,0 +1,22 @@ +/* + * Copyright 2022 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { createPermission } from '@backstage/plugin-permission-common'; + +export const tempExamplePermission = createPermission({ + name: 'temp.example.noop', + attributes: {}, +}); diff --git a/docs/permission/plugin-authors/01-setup.md b/docs/permission/plugin-authors/01-setup.md index 6114fbd63f..c09f11cdbf 100644 --- a/docs/permission/plugin-authors/01-setup.md +++ b/docs/permission/plugin-authors/01-setup.md @@ -10,30 +10,34 @@ The rest of this page is focused on adding the `todo-list` and `todo-list-backen ## Setup for the Tutorial -We will use a "Todo list" feature, composed of the `todo-list` and `todo-list-backend` plugins. +We will use a "Todo list" feature, composed of the `todo-list` and `todo-list-backend` plugins, as well as their dependency, `todo-list-common`. The source code is available here: - [todo-list](https://github.com/backstage/backstage/blob/master/contrib/plugins/todo-list) - [todo-list-backend](https://github.com/backstage/backstage/blob/master/contrib/plugins/todo-list-backend) +- [todo-list-common](https://github.com/backstage/backstage/blob/master/contrib/plugins/todo-list-common) -1. Copy-paste the two folders into the plugins folder of your backstage application repository or run the following script from the root of your backstage application: +1. Copy-paste the three folders into the plugins folder of your backstage application repository or run the following script from the root of your backstage application: ```bash $ curl https://codeload.github.com/backstage/backstage/zip/refs/heads/master | \ tar -C plugins --strip-components=1 -xv \ backstage-master/contrib/plugins/todo-list \ - backstage-master/contrib/plugins/todo-list-backend + backstage-master/contrib/plugins/todo-list-backend \ + backstage-master/contrib/plugins/todo-list-common ``` Your application structure should look something like this: + // TODO: UPDATE THIS IMAGE + ![backstage application files structure](../../assets/permission/permission-tutorial-backstage-application-initial-structure.png) 2. add the frontend and backend plugins as dependencies of your Backstage app and backend respectively: ``` - $ yarn workspace backend add @internal/plugin-todo-list-backend@^1.0.0 + $ yarn workspace backend add @internal/plugin-todo-list-backend@^1.0.0 @internal/plugin-todo-list-common@^1.0.0 $ yarn workspace app add @internal/plugin-todo-list@^1.0.0 ``` diff --git a/docs/permission/plugin-authors/02-adding-a-basic-permission-check.md b/docs/permission/plugin-authors/02-adding-a-basic-permission-check.md index b561fd8059..55dd3e85ab 100644 --- a/docs/permission/plugin-authors/02-adding-a-basic-permission-check.md +++ b/docs/permission/plugin-authors/02-adding-a-basic-permission-check.md @@ -10,32 +10,33 @@ For this tutorial, we'll use a basic permission check to authorize the `create` We'll start by creating a new permission, and then we'll use the permission api to call `authorize` with it during todo creation. -## Setup +## Creating a new permission + +Let's navigate to the file `plugins/todo-list-common/src/permissions.ts` and add our first permission: + +```diff + import { createPermission } from '@backstage/plugin-permission-common'; + +- export const tempExamplePermission = createPermission({ +- name: 'temp.example.noop', +- attributes: {}, ++ export const todoListCreate = createPermission({ ++ name: 'todo.list.create', ++ attributes: { action: 'create' }, + }); +``` + +For this tutorial, we've automatically exported all permissions from this file (see `plugins/todo-list-common/src/index.ts`). For the actual plugins that you author, we recommend exporting all permissions from your plugin, so that Backstage integrators can import them when writing policies. + +## Authorizing using the new permission Install the following module: ``` $ yarn workspace @internal/plugin-todo-list-backend \ - add @backstage/plugin-permission-common + add @backstage/plugin-permission-common @internal/plugin-todo-list-common ``` -## Creating a new permission - -Let's create a new file `plugins/todo-list-backend/src/service/permissions.ts` with the following content: - -```typescript -import { createPermission } from '@backstage/plugin-permission-common'; - -export const todosListCreate = createPermission({ - name: 'todos.list.create', - attributes: { action: 'create' }, -}); -``` - -We recommend exporting all permissions from your plugin, so that Backstage integrators can import them when writing policies. - -## Authorizing using the new permission - Edit `plugins/todo-list-backend/src/service/router.ts`: ```diff @@ -44,7 +45,7 @@ Edit `plugins/todo-list-backend/src/service/router.ts`: - import { InputError } from '@backstage/errors'; + import { InputError, NotAllowedError } from '@backstage/errors'; + import { PermissionEvaluator, AuthorizeResult } from '@backstage/plugin-permission-common'; -+ import { todosListCreate } from './permissions'; ++ import { todoListCreate } from '@internal/plugin-todo-list-common'; ... @@ -69,7 +70,7 @@ Edit `plugins/todo-list-backend/src/service/router.ts`: const user = token ? await identity.authenticate(token) : undefined; author = user?.identity.userEntityRef; + const decision = ( -+ await permissions.authorize([{ permission: todosListCreate }], { ++ await permissions.authorize([{ permission: todoListCreate }], { + token, + }) + )[0]; @@ -132,7 +133,7 @@ In order to test the logic above, the integrators of your backstage instance nee + PolicyQuery, } from '@backstage/plugin-permission-node'; + import { isPermission } from '@backstage/plugin-permission-common'; -+ import { todosListCreate } from '@internal/plugin-todo-list-backend'; ++ import { todoListCreate } from '@internal/plugin-todo-list-common'; class TestPermissionPolicy implements PermissionPolicy { - async handle(): Promise { @@ -140,7 +141,7 @@ In order to test the logic above, the integrators of your backstage instance nee + request: PolicyQuery, + user?: BackstageIdentityResponse, + ): Promise { -+ if (isPermission(request.permission, todosListCreate)) { ++ if (isPermission(request.permission, todoListCreate)) { + return { + result: AuthorizeResult.DENY, + }; diff --git a/docs/permission/plugin-authors/03-adding-a-resource-permission-check.md b/docs/permission/plugin-authors/03-adding-a-resource-permission-check.md index e3ba40d0c2..583d7e7707 100644 --- a/docs/permission/plugin-authors/03-adding-a-resource-permission-check.md +++ b/docs/permission/plugin-authors/03-adding-a-resource-permission-check.md @@ -11,34 +11,34 @@ When performing updates (or other operations) on specific [resources](../concept ## Creating the update permission -Let's add a new permission to the file `plugins/todo-list-backend/src/service/permissions.ts` from [the previous section](./02-adding-a-basic-permission-check.md). +Let's add a new permission to the file `plugins/todo-list-common/src/permissions.ts` from [the previous section](./02-adding-a-basic-permission-check.md). ```diff import { createPermission } from '@backstage/plugin-permission-common'; + export const TODO_LIST_RESOURCE_TYPE = 'todo-item'; + - export const todosListCreate = createPermission({ - name: 'todos.list.create', + export const todoListCreate = createPermission({ + name: 'todo.list.create', attributes: { action: 'create' }, }); + -+ export const todosListUpdate = createPermission({ -+ name: 'todos.list.update', ++ export const todoListUpdate = createPermission({ ++ name: 'todo.list.update', + attributes: { action: 'update' }, + resourceType: TODO_LIST_RESOURCE_TYPE, + }); ``` -Notice that unlike `todosListCreate`, the `todosListUpdate` permission contains a `resourceType` field. This field indicates to the permission framework that this permission is intended to be authorized in the context of a resource with type `'todo-item'`. You can use whatever string you like as the resource type, as long as you use the same value consistently for each type of resource. +Notice that unlike `todoListCreate`, the `todoListUpdate` permission contains a `resourceType` field. This field indicates to the permission framework that this permission is intended to be authorized in the context of a resource with type `'todo-item'`. You can use whatever string you like as the resource type, as long as you use the same value consistently for each type of resource. ## Setting up authorization for the update permission To start, let's edit `plugins/todo-list-backend/src/service/router.ts` in the same manner as we did in the previous section: ```diff -- import { todosListCreate } from './permissions'; -+ import { todosListCreate, todosListUpdate } from './permissions'; +- import { todoListCreate } from '@internal/plugin-todo-list-common'; ++ import { todoListCreate, todoListUpdate } from '@internal/plugin-todo-list-common'; ... @@ -52,7 +52,7 @@ To start, let's edit `plugins/todo-list-backend/src/service/router.ts` in the sa } + const decision = ( + await permissions.authorize( -+ [{ permission: todosListUpdate, resourceRef: req.body.id }], ++ [{ permission: todoListUpdate, resourceRef: req.body.id }], + { + token, + }, @@ -83,6 +83,7 @@ Create a new `plugins/todo-list-backend/src/service/rules.ts` file and append th ```typescript import { makeCreatePermissionRule } from '@backstage/plugin-permission-node'; +import { TODO_LIST_RESOURCE_TYPE } from '@internal/plugin-todo-list-common'; import { Todo, TodoFilter } from './todos'; const createTodoListPermissionRule = makeCreatePermissionRule< @@ -93,7 +94,7 @@ const createTodoListPermissionRule = makeCreatePermissionRule< export const isOwner = createTodoListPermissionRule({ name: 'IS_OWNER', description: 'Should allow only if the todo belongs to the user', - resourceType: 'todo-item', + resourceType: TODO_LIST_RESOURCE_TYPE, apply: (resource: Todo, userId: string) => { return resource.author === userId; }, @@ -122,10 +123,12 @@ Now, let's create the new endpoint by editing `plugins/todo-list-backend/src/ser - `rules`: an array of all the permission rules you want to support in conditional decisions. ```diff -+ import { createPermissionIntegrationRouter } from '@backstage/plugin-permission-node'; +... + - import { add, getAll, update } from './todos'; + import { add, getAll, getTodo, update } from './todos'; -+ import { TODO_LIST_RESOURCE_TYPE } from './permissions'; ++ import { createPermissionIntegrationRouter } from '@backstage/plugin-permission-node'; ++ import { TODO_LIST_RESOURCE_TYPE } from '@internal/plugin-todo-list-common'; + import { rules } from './rules'; export async function createRouter( @@ -165,21 +168,21 @@ Let's edit `packages/backend/src/plugins/permission.ts`: PolicyQuery, } from '@backstage/plugin-permission-node'; import { isPermission } from '@backstage/plugin-permission-common'; -- import { todosListCreate } from '@internal/plugin-todo-list'; +- import { todoListCreate } from '@internal/plugin-todo-list-common'; + import { -+ todosListCreate, -+ todosListUpdate, ++ todoListCreate, ++ todoListUpdate, + TODO_LIST_RESOURCE_TYPE, -+ } from '@internal/plugin-todo-list'; ++ } from '@internal/plugin-todo-list-common'; ... - if (isPermission(request.permission, todosListCreate)) { + if (isPermission(request.permission, todoListCreate)) { return { result: AuthorizeResult.DENY, }; } -+ if (isPermission(request.permission, todosListUpdate)) { ++ if (isPermission(request.permission, todoListUpdate)) { + return { + result: AuthorizeResult.CONDITIONAL, + pluginId: 'todolist', diff --git a/packages/app/src/App.tsx b/packages/app/src/App.tsx index 4cf2c02e55..03e5cf5c3b 100644 --- a/packages/app/src/App.tsx +++ b/packages/app/src/App.tsx @@ -94,6 +94,7 @@ import { techDocsPage } from './components/techdocs/TechDocsPage'; import { ApacheAirflowPage } from '@backstage/plugin-apache-airflow'; import { PermissionedRoute } from '@backstage/plugin-permission-react'; import { catalogEntityCreatePermission } from '@backstage/plugin-catalog-common'; +import { TodoListCommonPage } from 'plugin-todo-list-common'; const app = createApp({ apis, @@ -233,6 +234,7 @@ const routes = ( } /> } /> + } /> ); From f0f6709cd360fa2ad1e99def618de9627cf2fb64 Mon Sep 17 00:00:00 2001 From: Joon Park Date: Thu, 14 Apr 2022 16:43:38 +0100 Subject: [PATCH 29/50] Revert accidental changes Signed-off-by: Joon Park --- packages/app/src/App.tsx | 2 -- 1 file changed, 2 deletions(-) diff --git a/packages/app/src/App.tsx b/packages/app/src/App.tsx index 03e5cf5c3b..4cf2c02e55 100644 --- a/packages/app/src/App.tsx +++ b/packages/app/src/App.tsx @@ -94,7 +94,6 @@ import { techDocsPage } from './components/techdocs/TechDocsPage'; import { ApacheAirflowPage } from '@backstage/plugin-apache-airflow'; import { PermissionedRoute } from '@backstage/plugin-permission-react'; import { catalogEntityCreatePermission } from '@backstage/plugin-catalog-common'; -import { TodoListCommonPage } from 'plugin-todo-list-common'; const app = createApp({ apis, @@ -234,7 +233,6 @@ const routes = ( } /> } /> - } /> ); From 2e8b1649f5728c8fa4fa141cefa2a6fb8e283ed8 Mon Sep 17 00:00:00 2001 From: Joe Porpeglia Date: Thu, 14 Apr 2022 16:58:36 -0400 Subject: [PATCH 30/50] Update todo-list-common README Signed-off-by: Joe Porpeglia --- contrib/plugins/todo-list-common/README.md | 8 -------- 1 file changed, 8 deletions(-) diff --git a/contrib/plugins/todo-list-common/README.md b/contrib/plugins/todo-list-common/README.md index 3dc43d8dd9..b5d4faa9ba 100644 --- a/contrib/plugins/todo-list-common/README.md +++ b/contrib/plugins/todo-list-common/README.md @@ -3,11 +3,3 @@ Welcome to the todo-list-common plugin! _This plugin was created through the Backstage CLI_ - -## Getting started - -Your plugin has been added to the example app in this repository, meaning you'll be able to access it by running `yarn start` in the root directory, and then navigating to [/todo-list-common](http://localhost:3000/todo-list-common). - -You can also serve the plugin in isolation by running `yarn start` in the plugin directory. -This method of serving the plugin provides quicker iteration speed and a faster startup and hot reloads. -It is only meant for local development, and the setup for it can be found inside the [/dev](./dev) directory. From 6bc4d75d335b838fd9718723040ce2d58f1f0a46 Mon Sep 17 00:00:00 2001 From: Joe Porpeglia Date: Thu, 14 Apr 2022 17:30:25 -0400 Subject: [PATCH 31/50] Fix capitalization Signed-off-by: Joe Porpeglia --- docs/permission/plugin-authors/01-setup.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/permission/plugin-authors/01-setup.md b/docs/permission/plugin-authors/01-setup.md index c09f11cdbf..981a6ee6ab 100644 --- a/docs/permission/plugin-authors/01-setup.md +++ b/docs/permission/plugin-authors/01-setup.md @@ -34,7 +34,7 @@ The source code is available here: ![backstage application files structure](../../assets/permission/permission-tutorial-backstage-application-initial-structure.png) -2. add the frontend and backend plugins as dependencies of your Backstage app and backend respectively: +2. Add the frontend and backend plugins as dependencies of your Backstage app and backend respectively: ``` $ yarn workspace backend add @internal/plugin-todo-list-backend@^1.0.0 @internal/plugin-todo-list-common@^1.0.0 From b5b349b09d5a06a74441fc9bb62fa821530b5b2c Mon Sep 17 00:00:00 2001 From: Joe Porpeglia Date: Mon, 18 Apr 2022 12:45:00 -0400 Subject: [PATCH 32/50] Copy updates Signed-off-by: Joe Porpeglia --- ...-backstage-application-initial-structure.png | Bin 48537 -> 0 bytes docs/permission/plugin-authors/01-setup.md | 8 ++------ .../02-adding-a-basic-permission-check.md | 2 +- .../03-adding-a-resource-permission-check.md | 2 +- 4 files changed, 4 insertions(+), 8 deletions(-) delete mode 100644 docs/assets/permission/permission-tutorial-backstage-application-initial-structure.png diff --git a/docs/assets/permission/permission-tutorial-backstage-application-initial-structure.png b/docs/assets/permission/permission-tutorial-backstage-application-initial-structure.png deleted file mode 100644 index f7e18960ecb04ff095e420d4eb8dc08350e9db76..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 48537 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 diff --git a/docs/permission/plugin-authors/01-setup.md b/docs/permission/plugin-authors/01-setup.md index 981a6ee6ab..ee90875fd0 100644 --- a/docs/permission/plugin-authors/01-setup.md +++ b/docs/permission/plugin-authors/01-setup.md @@ -28,13 +28,9 @@ The source code is available here: backstage-master/contrib/plugins/todo-list-common ``` - Your application structure should look something like this: + The `plugins` directory of your project should now include `todo-list`, `todo-list-backend`, and `todo-list-common`. - // TODO: UPDATE THIS IMAGE - - ![backstage application files structure](../../assets/permission/permission-tutorial-backstage-application-initial-structure.png) - -2. Add the frontend and backend plugins as dependencies of your Backstage app and backend respectively: +2. Add these packages as dependencies for your Backstage app: ``` $ yarn workspace backend add @internal/plugin-todo-list-backend@^1.0.0 @internal/plugin-todo-list-common@^1.0.0 diff --git a/docs/permission/plugin-authors/02-adding-a-basic-permission-check.md b/docs/permission/plugin-authors/02-adding-a-basic-permission-check.md index 55dd3e85ab..f944b9ecc5 100644 --- a/docs/permission/plugin-authors/02-adding-a-basic-permission-check.md +++ b/docs/permission/plugin-authors/02-adding-a-basic-permission-check.md @@ -26,7 +26,7 @@ Let's navigate to the file `plugins/todo-list-common/src/permissions.ts` and add }); ``` -For this tutorial, we've automatically exported all permissions from this file (see `plugins/todo-list-common/src/index.ts`). For the actual plugins that you author, we recommend exporting all permissions from your plugin, so that Backstage integrators can import them when writing policies. +For this tutorial, we've automatically exported all permissions from this file (see `plugins/todo-list-common/src/index.ts`). For the actual plugins that you author, you must export any permission authorized by the plugin so Backstage integrators can import them when writing policies. ## Authorizing using the new permission diff --git a/docs/permission/plugin-authors/03-adding-a-resource-permission-check.md b/docs/permission/plugin-authors/03-adding-a-resource-permission-check.md index 583d7e7707..a61c74219b 100644 --- a/docs/permission/plugin-authors/03-adding-a-resource-permission-check.md +++ b/docs/permission/plugin-authors/03-adding-a-resource-permission-check.md @@ -154,7 +154,7 @@ Now, let's create the new endpoint by editing `plugins/todo-list-backend/src/ser ## Test the authorized update endpoint -Now let's go back to the permission policy's handle function (which would normally be written by your integrators) and try to authorize our new permission. +Now let's go back to the permission policy's handle function and try to authorize our new permission. Let's edit `packages/backend/src/plugins/permission.ts`: From 6bbe08d6b909109ac605416871b0bd664e0c784b Mon Sep 17 00:00:00 2001 From: Joe Porpeglia Date: Wed, 13 Apr 2022 18:28:02 -0400 Subject: [PATCH 33/50] Add documentation for custom permission rules Signed-off-by: Joe Porpeglia --- docs/permission/custom-rules.md | 107 ++++++++++++++++++++++++++++ docs/permission/writing-a-policy.md | 8 --- microsite/sidebars.json | 1 + 3 files changed, 108 insertions(+), 8 deletions(-) create mode 100644 docs/permission/custom-rules.md diff --git a/docs/permission/custom-rules.md b/docs/permission/custom-rules.md new file mode 100644 index 0000000000..de993d4c44 --- /dev/null +++ b/docs/permission/custom-rules.md @@ -0,0 +1,107 @@ +--- +id: custom-rules +title: Defining custom permission rules +description: How to define custom permission rules for existing resources +--- + +For some use cases, you may want to define custom [rules](./concepts.md#resources-and-rules) in addition to the ones provided by a plugin. In the [previous section](./writing-a-policy.md) we used the `isEntityOwner` rule to control access for catalog entities. Let's extend this policy with a custom rule that checks what [system](https://backstage.io/docs/features/software-catalog/system-model#system) an entity is part of. + +## Define a custom rule + +Plugins should export a rule factory that provides type-safety that ensures compatibility with the plugin's backend. The catalog plugin exports `createCatalogPermissionRule` from `@backstage/plugin-catalog-backend/alpha` for this purpose. Note: the `/alpha` path segment is temporary until this API is marked as stable. For this example, we'll define the rule in `packages/backend/src/plugins/permission.ts`, but you can put it anywhere that's accessible by your `backend` package. + +```typescript +import type { Entity } from '@backstage/plugin-catalog-model'; +import { createCatalogPermissionRule } from '@backstage/plugin-catalog-backend'; +import { createConditionFactory } from '@backstage/plugin-permission-node'; + +export const isInSystemRule = createCatalogPermissionRule({ + name: 'IS_IN_SYSTEM', + description: 'Checks if an entity is part of the system provided', + resourceType: 'catalog-entity', + apply: (resource: Entity, systemRef: string) => { + if (!resource.relations) { + return false; + } + + return resource.relations + .filter(relation => relation.type === 'partOf') + .some(relation => relation.targetRef === systemRef); + }, + toQuery: (systemRef: string) => ({ + key: 'relations.partOf', + value: systemRef, + }), +}); + +const isInSystem = createConditionFactory(isInSystemRule); +``` + +For a more detailed explanation on defining rules, refer to the [documentation for plugin authors](./plugin-authors/03-adding-a-resource-permission-check.md#adding-support-for-conditional-decisions). + +## Provide the rule during plugin setup + +Now that we have a custom rule defined, we need provide it to the catalog plugin. This step is important because the catalog plugin will use the rule's `toQuery` and `apply` methods while evaluating conditional authorize results. There's no guarantee that the catalog and permission backends are running on the same server, so we must explicitly link the rule to ensure that it's available at runtime. + +The api for providing custom rules may differ between plugins, but there should typically be some integration point during the creation of the backend router. For the catalog, this integration point is exposed via `CatalogBuilder.addPermissionRules`. + +```typescript +// packages/backend/src/plugins/catalog.ts + +import { isInSystemRule } from './permission'; + +... + +export default async function createPlugin( + env: PluginEnvironment, +): Promise { + const builder = await CatalogBuilder.create(env); + builder.addPermissionRules(isInSystem); + ... + return router; +} +``` + +The new rule is now ready for use in a permission policy! + +## Use the rule in a policy + +Let's bring this all together by extending the example policy from the previous section. + +```diff +// packages/backend/src/plugins/permission.ts + ++ import { isInSystem } from './catalog'; + +... + +class TestPermissionPolicy implements PermissionPolicy { + async handle( + request: PolicyQuery, + user?: BackstageIdentityResponse, + ): Promise { + if (isResourcePermission(request.permission, 'catalog-entity')) { + return createCatalogConditionalDecision( + request.permission, +- catalogConditions.isEntityOwner( +- user?.identity.ownershipEntityRefs ?? [], +- ), ++ { ++ anyOf: [ ++ catalogConditions.isEntityOwner( ++ user?.identity.ownershipEntityRefs ?? [] ++ ), ++ isInSystem('interviewing') ++ ] ++ } + ); + } + + return { result: AuthorizeResult.ALLOW }; + } +``` + +The updated policy will allow catalog entity resource permissions if any of the following are true: + +- User owns the target entity +- Target entity is part of the `'interviewing'` system diff --git a/docs/permission/writing-a-policy.md b/docs/permission/writing-a-policy.md index ecc5104185..d0d7321760 100644 --- a/docs/permission/writing-a-policy.md +++ b/docs/permission/writing-a-policy.md @@ -133,14 +133,6 @@ In this example, we use [`isResourcePermission`](https://backstage.io/docs/refer _Note:_ Some catalog permissions do not have the `'catalog-entity'` resource type, such as [`catalogEntityCreatePermission`](https://github.com/backstage/backstage/blob/1e5e9fb9de9856a49e60fc70c38a4e4e94c69570/plugins/catalog-common/src/permissions.ts#L49). In those cases, a definitive decision is required because conditions can't be applied to an entity that does not exist yet. -## Custom conditions - -In addition to the conditions provided by the catalog plugin, you can write your own conditions for the catalog (or for any plugin that implements permissions, for that matter). To write a custom condition you must do the following: - -1. Implement a new [`PermissionRule`](https://backstage.io/docs/reference/plugin-permission-node.permissionrule). -2. Register this rule with the plugin backend that owns the resource. New rules are added to the catalog plugin via [`CatalogBuilder#addPermissionRules`](https://github.com/backstage/backstage/blob/1f873a0908d73888892b30faca9a79dfcf908ad1/plugins/catalog-backend/src/service/CatalogBuilder.ts#L344), but each plugin may define its own API for this functionality. -3. Use the [`createConditionFactory`](https://backstage.io/docs/reference/plugin-permission-node.createconditionfactory) helper to integrate with your conditional policy decisions. - ## Conclusion Through a combination of permissions and conditions, you should be able to author a policy that works for your instance of Backstage and your organization. As the ecosystem around permissions in Backstage matures, you may be able to choose from other authorization packages instead of writing your own policy. If you're interested in more detailed descriptions of the concepts that comprise the permission framework, check out the [Concepts page](./concepts.md). diff --git a/microsite/sidebars.json b/microsite/sidebars.json index 51da26c7b5..02f16ffc78 100644 --- a/microsite/sidebars.json +++ b/microsite/sidebars.json @@ -266,6 +266,7 @@ "permission/concepts", "permission/getting-started", "permission/writing-a-policy", + "permission/custom-rules", { "type": "subcategory", "label": "Tutorial: using Permissions in your plugin", From 480dffcfef2eb844f6cea11f40b1a1c33467332a Mon Sep 17 00:00:00 2001 From: Joe Porpeglia Date: Mon, 18 Apr 2022 17:10:36 -0400 Subject: [PATCH 34/50] Remove conclusion section Signed-off-by: Joe Porpeglia --- docs/permission/writing-a-policy.md | 4 ---- 1 file changed, 4 deletions(-) diff --git a/docs/permission/writing-a-policy.md b/docs/permission/writing-a-policy.md index d0d7321760..be88aea9c5 100644 --- a/docs/permission/writing-a-policy.md +++ b/docs/permission/writing-a-policy.md @@ -132,7 +132,3 @@ class TestPermissionPolicy implements PermissionPolicy { In this example, we use [`isResourcePermission`](https://backstage.io/docs/reference/plugin-permission-common.isresourcepermission) to match all permissions with a resource type of `catalog-entity`. Just like `isPermission`, this helper will "narrow" the type of `request.permission` and enable the use of `createCatalogConditionalDecision`. In addition to the behavior you observed before, you should also see that catalog entities are no longer visible unless you are the owner - success! _Note:_ Some catalog permissions do not have the `'catalog-entity'` resource type, such as [`catalogEntityCreatePermission`](https://github.com/backstage/backstage/blob/1e5e9fb9de9856a49e60fc70c38a4e4e94c69570/plugins/catalog-common/src/permissions.ts#L49). In those cases, a definitive decision is required because conditions can't be applied to an entity that does not exist yet. - -## Conclusion - -Through a combination of permissions and conditions, you should be able to author a policy that works for your instance of Backstage and your organization. As the ecosystem around permissions in Backstage matures, you may be able to choose from other authorization packages instead of writing your own policy. If you're interested in more detailed descriptions of the concepts that comprise the permission framework, check out the [Concepts page](./concepts.md). From f70e9b5368a6d6dabcf08fc839706d55444b1701 Mon Sep 17 00:00:00 2001 From: Joe Porpeglia Date: Tue, 19 Apr 2022 18:43:50 -0400 Subject: [PATCH 35/50] Sync permission docs with framework changes Signed-off-by: Joe Porpeglia --- docs/permission/plugin-authors/01-setup.md | 4 - .../02-adding-a-basic-permission-check.md | 15 +-- .../03-adding-a-resource-permission-check.md | 11 +- ...04-authorizing-access-to-paginated-data.md | 123 +++++++++--------- 4 files changed, 75 insertions(+), 78 deletions(-) diff --git a/docs/permission/plugin-authors/01-setup.md b/docs/permission/plugin-authors/01-setup.md index ee90875fd0..7011f52676 100644 --- a/docs/permission/plugin-authors/01-setup.md +++ b/docs/permission/plugin-authors/01-setup.md @@ -105,10 +105,6 @@ Now if you start your application you should be able to reach the `/todo-list` p --- -// TODO(vinzscam): split the tutorial in two parts: -// - plugins relying on external entities -// - plugins owning their own entities - ## Integrate the new plugin If you play with the UI, you will notice that it is possible to perform a few actions: diff --git a/docs/permission/plugin-authors/02-adding-a-basic-permission-check.md b/docs/permission/plugin-authors/02-adding-a-basic-permission-check.md index f944b9ecc5..de88b3f040 100644 --- a/docs/permission/plugin-authors/02-adding-a-basic-permission-check.md +++ b/docs/permission/plugin-authors/02-adding-a-basic-permission-check.md @@ -155,14 +155,13 @@ In order to test the logic above, the integrators of your backstage instance nee Now the frontend should show an error whenever you try to create a new Todo item. -Let's flip the result back to `ALLOW`: +Let's flip the result back to `ALLOW` before moving on. ```diff - if (request.permission.attributes.action === 'create') { - return { -- result: AuthorizeResult.DENY, -+ result: AuthorizeResult.ALLOW, - }; + if (isPermission(request.permission, todoListCreate)) { + return { +- result: AuthorizeResult.DENY, ++ result: AuthorizeResult.ALLOW, + }; + } ``` - -Now the create endpoint should be enabled again. diff --git a/docs/permission/plugin-authors/03-adding-a-resource-permission-check.md b/docs/permission/plugin-authors/03-adding-a-resource-permission-check.md index a61c74219b..1df78d52e1 100644 --- a/docs/permission/plugin-authors/03-adding-a-resource-permission-check.md +++ b/docs/permission/plugin-authors/03-adding-a-resource-permission-check.md @@ -6,9 +6,6 @@ description: Explains how to add a resource permission check to a Backstage plug When performing updates (or other operations) on specific [resources](../concepts.md#resources-and-rules), the permissions framework allows for the decision to be based on characteristics of the resource itself. This means that it's possible to write policies that (for example) allow the operation for users that own a resource, and deny the operation otherwise. -// TODO(vinzscam): remind that the plugin used in this tutorial is bringing its own types to backstage. -// for plugins relying on external entities (like catalog entities) please follow [link] tutorial. - ## Creating the update permission Let's add a new permission to the file `plugins/todo-list-common/src/permissions.ts` from [the previous section](./02-adding-a-basic-permission-check.md). @@ -156,9 +153,9 @@ Now, let's create the new endpoint by editing `plugins/todo-list-backend/src/ser Now let's go back to the permission policy's handle function and try to authorize our new permission. -Let's edit `packages/backend/src/plugins/permission.ts`: - ```diff + // packages/backend/src/plugins/permission.ts + import { BackstageIdentityResponse, IdentityClient @@ -179,9 +176,10 @@ Let's edit `packages/backend/src/plugins/permission.ts`: if (isPermission(request.permission, todoListCreate)) { return { - result: AuthorizeResult.DENY, + result: AuthorizeResult.ALLOW, }; } + + if (isPermission(request.permission, todoListUpdate)) { + return { + result: AuthorizeResult.CONDITIONAL, @@ -193,6 +191,7 @@ Let's edit `packages/backend/src/plugins/permission.ts`: + }, + }; + } ++ return { result: AuthorizeResult.ALLOW, }; diff --git a/docs/permission/plugin-authors/04-authorizing-access-to-paginated-data.md b/docs/permission/plugin-authors/04-authorizing-access-to-paginated-data.md index 406d201998..c41b6b978e 100644 --- a/docs/permission/plugin-authors/04-authorizing-access-to-paginated-data.md +++ b/docs/permission/plugin-authors/04-authorizing-access-to-paginated-data.md @@ -4,11 +4,9 @@ title: 4. Authorizing access to paginated data description: Explains how to authorize access to paginated data in a Backstage plugin --- -Authorizing `GET /todos` is similar to the update endpoint, in that it should be possible to authorize read access to todo entries based on their characteristics. When a `GET /todos` request is received, only the items that the user is permitted to see should be returned. +Authorizing `GET /todos` is similar to the update endpoint, in that it should be possible to authorize access based on the characteristics of each resource. However, we'll need to authorize a list of resources for this endpoint. -As in the previous case, the permission policy can't take the decision itself, meaning that a conditional decision should be returned. However, this time rather than a single `resourceRef`, we have a whole list of resources to authorize. - -Potentially, we could implement something like the below, leveraging the batching functionality to authorize all of the todos, and then returning only the ones for which the decision was `ALLOW`: +One possible solution may leverage the batching functionality to authorize all of the todos, and then returning only the ones for which the decision was `ALLOW`: ```diff router.get('/todos', async (req, res) => { @@ -27,50 +25,48 @@ Potentially, we could implement something like the below, leveraging the batchin }); ``` -This approach will work for simple cases, but it has a downside: it forces us to retrieve all the elements upfront and authorize them one by one, and means that concerns like pagination that are handled by the data source today also need to move into the plugin. +This approach will work for simple cases, but it has a downside: it forces us to retrieve all the elements upfront and authorize them one by one. This forces the plugin implementation to handle concerns like pagination, which is currently handled by the data source. -To avoid this situation, the permissions framework has support for filtering items in the data source itself. In this tutorial, we'll create a permission for reading todo items, and use it to filter out unauthorized todo items in the data store itself. +To avoid this situation, the permissions framework has support for filtering items in the data source itself. In this part of the tutorial, we'll describe the steps required to use that behavior. > Note: in order to perform authorization filtering in this way, the data source must allow filters to be logically combined with AND, OR, and NOT operators. The conditional decisions returned by the permissions framework use a [nested object](https://backstage.io/docs/reference/plugin-permission-common.permissioncriteria) to combine conditions. If you're implementing a filter API from scratch, we recommend using the same shape for ease of interoperability. If not, you'll need to implement a function which transforms the nested object into your own format. -## Creating a new permission +## Creating the read permission -Let's add another permission to the file `plugins/todo-list-backend/src/service/permissions.ts`, with the same structure as the existing `todosListUpdate` permission: +Let's add another permission to for the plugin. ```diff -import { Permission } from '@backstage/plugin-permission-common';$$ + // plugins/todo-list-backend/src/service/permissions.ts -export const TODO_LIST_RESOURCE_TYPE = 'todo-item'; + import { createPermission } from '@backstage/plugin-permission-common'; -export const todosListCreate: Permission = { - name: 'todos.list.create', - attributes: { - action: 'create', - }, -}; + export const TODO_LIST_RESOURCE_TYPE = 'todo-item'; -export const todosListUpdate: Permission = { - name: 'todos.list.update', - attributes: { - action: 'update', - }, - resourceType: TODO_LIST_RESOURCE_TYPE, -}; + export const todoListCreate = createPermission({ + name: 'todo.list.create', + attributes: { action: 'create' }, + }); + + export const todoListUpdate = createPermission({ + name: 'todo.list.update', + attributes: { action: 'update' }, + resourceType: TODO_LIST_RESOURCE_TYPE, + }); + -+export const todosListRead: Permission = { -+ name: 'todos.list.read', -+ attributes: { -+ action: 'read', -+ }, -+ resourceType: TODO_LIST_RESOURCE_TYPE, -+}; ++ export const todosListRead = createPermission({ ++ name: 'todos.list.read', ++ attributes: { action: 'read' }, ++ resourceType: TODO_LIST_RESOURCE_TYPE, ++ }); ``` -## Authorizing using the new permission +## Using conditional policy decisions -`plugins/todo-list-backend/src/service/router.ts` +So far we've only used the `PermissionEvaluator.authorize` method, which will evaluate conditional decisions before returning a result. In this step, we want to evaluate conditional decisions within our plugin, so we'll use `PermissionEvaluator.authorizeConditional` instead. ```diff +// plugins/todo-list-backend/src/service/router.ts + - import { createPermissionIntegrationRouter } from '@backstage/plugin-permission-node'; + import { + createPermissionIntegrationRouter, @@ -87,13 +83,15 @@ export const todosListUpdate: Permission = { } from './permissions'; + import { rules } from './rules'; ++ const transformConditions: ConditionTransformer = createConditionTransformer(Object.values(rules)); + router.get('/todos', async (req, res) => { + const token = getBearerTokenFromAuthorizationHeader( + req.header('authorization'), + ); + + const decision = ( -+ await permissions.authorize([{ permission: todosListRead }], { ++ await permissions.authorizeConditional([{ permission: todosListRead }], { + token, + }) + )[0]; @@ -103,9 +101,7 @@ export const todosListUpdate: Permission = { + } + + if (decision.result === AuthorizeResult.CONDITIONAL) { -+ const conditionTransformer: ConditionTransformer = -+ createConditionTransformer(Object.values(rules)); -+ const filter = conditionTransformer(decision.conditions) as TodoFilter; ++ const filter = transformConditions(decision.conditions); + res.json(getAll(filter)); + } else { + res.json(getAll()); @@ -115,36 +111,43 @@ export const todosListUpdate: Permission = { }); ``` -In this case, we are not passing a `resourceRef` when invoking `permissions.authorize()`. Since there is no `resourceRef`, the permission framework can't apply conditions, and instead returns conditional decisions all the way back to the caller - in this case, the `todo-list-backend`. +To make the process of handling conditional decisions easier, the permission framework provides a `createConditionTransformer` helper. This function accepts an array of permission rules, and returns a transformer function which converts the conditions to the format needed by the plugin using the `toQuery` method defined on each rule. -To make the process of handling conditional decisions easier, the permission framework provides a `createConditionTransformer` helper. This function accepts an array of permission rules, and returns a transformer function which converts the conditions in conditional decisions to the format needed by the plugin using the `toQuery` method on permission rules. - -Since the todo api groups filters using the same nested object structure as the permission framework, we can pass the output of our condition transformer straight to it. If the filters were grouped differently, we'd need to transform it at this point before passing it to the api. +Since `TodoFilter` used in our plugin matches the structure of the conditions object, we can directly pass the output of our condition transformer. If the filters were structured differently, we'd need to transform it further before passing it to the api. ## Test the authorized read endpoint -Let's update our permission policy's handler to return a conditional result whenever a todosListCreate permission is received. We could reuse the same result as the update action: +Let's update our permission policy to return a conditional result whenever a `todosListRead` permission is received. In this case, we can reuse the decision returned for the `todosListCreate` permission. ```diff - if (request.permission.resourceType === 'todo-item') { -- if (request.permission.resourceType === 'todo-item') { -+ if ( -+ request.permission.attributes.action === 'update' || -+ request.permission.attributes.action === 'read' -+ ) { - return { - result: AuthorizeResult.CONDITIONAL, - pluginId: 'todolist', - resourceType: 'todo-item', - conditions: { - rule: 'IS_OWNER', - params: [user?.identity.userEntityRef], - }, - }; - } +// packages/backend/src/plugins/permission.ts + +... + +import { + todoListCreate, + todoListUpdate, ++ todoListRead, + TODO_LIST_RESOURCE_TYPE, +} from '@internal/plugin-todo-list-common'; + +... + +- if (isPermission(request.permission, todoListUpdate)) { ++ if ( ++ isPermission(request.permission, todoListUpdate) || ++ isPermission(request.permission, todoListRead) ++ ) { + return { + result: AuthorizeResult.CONDITIONAL, + pluginId: 'todolist', + resourceType: TODO_LIST_RESOURCE_TYPE, + conditions: { + rule: 'IS_OWNER', + params: [user?.identity.userEntityRef], + }, + }; } ``` -Once the changes to the permission policy are saved, the UI should should show only the items you have created. - -// TODO(vinzscam): add frontend documentation +Once the changes to the permission policy are saved, the UI should should show only the todo items you've created. From 8ebddc16a0934b838a7454e7e565e7da038951c5 Mon Sep 17 00:00:00 2001 From: Joe Porpeglia Date: Wed, 20 Apr 2022 09:58:49 -0400 Subject: [PATCH 36/50] Update docs/permission/plugin-authors/04-authorizing-access-to-paginated-data.md Co-authored-by: Joon Park Signed-off-by: Joe Porpeglia --- .../plugin-authors/04-authorizing-access-to-paginated-data.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/permission/plugin-authors/04-authorizing-access-to-paginated-data.md b/docs/permission/plugin-authors/04-authorizing-access-to-paginated-data.md index c41b6b978e..3586a352c1 100644 --- a/docs/permission/plugin-authors/04-authorizing-access-to-paginated-data.md +++ b/docs/permission/plugin-authors/04-authorizing-access-to-paginated-data.md @@ -33,7 +33,7 @@ To avoid this situation, the permissions framework has support for filtering ite ## Creating the read permission -Let's add another permission to for the plugin. +Let's add another permission to the plugin. ```diff // plugins/todo-list-backend/src/service/permissions.ts From 22e8b41c3ccee61a3f1cf53de561dfbd6a46d3b6 Mon Sep 17 00:00:00 2001 From: Vincenzo Scamporlino Date: Fri, 22 Apr 2022 13:14:24 +0200 Subject: [PATCH 37/50] Fix spelling issues Signed-off-by: Vincenzo Scamporlino --- .github/vale/Vocab/Backstage/accept.txt | 3 +++ docs/permission/concepts.md | 2 +- .../plugin-authors/04-authorizing-access-to-paginated-data.md | 2 +- 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/.github/vale/Vocab/Backstage/accept.txt b/.github/vale/Vocab/Backstage/accept.txt index b21f38c2ab..32044d66a1 100644 --- a/.github/vale/Vocab/Backstage/accept.txt +++ b/.github/vale/Vocab/Backstage/accept.txt @@ -218,6 +218,8 @@ performant Performant periskop Periskop +permissioned +permissioning plantuml Platformize Podman @@ -309,6 +311,7 @@ Templaters theia thumbsup todo +todos tolerations Tolerations toolchain diff --git a/docs/permission/concepts.md b/docs/permission/concepts.md index bbff79e0e1..e7d65b3583 100644 --- a/docs/permission/concepts.md +++ b/docs/permission/concepts.md @@ -6,7 +6,7 @@ description: A list of important permission framework concepts ### Permission -Any action that a user performs within Backstage may be represented as a permission. More complex actions, like executing a software template, may require authorization for multiple permissions throughout the flow. Permissions are identified by a unique name and optionally include a set of attributes that describe the correponding action. Plugins are responsible for defining and exposing the permissions they enforce. +Any action that a user performs within Backstage may be represented as a permission. More complex actions, like executing a software template, may require authorization for multiple permissions throughout the flow. Permissions are identified by a unique name and optionally include a set of attributes that describe the corresponding action. Plugins are responsible for defining and exposing the permissions they enforce. ### Policy diff --git a/docs/permission/plugin-authors/04-authorizing-access-to-paginated-data.md b/docs/permission/plugin-authors/04-authorizing-access-to-paginated-data.md index 3586a352c1..b73352f549 100644 --- a/docs/permission/plugin-authors/04-authorizing-access-to-paginated-data.md +++ b/docs/permission/plugin-authors/04-authorizing-access-to-paginated-data.md @@ -150,4 +150,4 @@ import { } ``` -Once the changes to the permission policy are saved, the UI should should show only the todo items you've created. +Once the changes to the permission policy are saved, the UI should show only the todo items you've created. From aed801ad5a565c750fcbb0b1dbb9e8bf784a960d Mon Sep 17 00:00:00 2001 From: Joe Porpeglia Date: Tue, 19 Apr 2022 22:01:58 -0400 Subject: [PATCH 38/50] Update READMEs for todo-list plugin packages Signed-off-by: Joe Porpeglia --- contrib/plugins/todo-list-backend/README.md | 10 ++-------- contrib/plugins/todo-list-common/README.md | 4 +--- contrib/plugins/todo-list/README.md | 8 +------- 3 files changed, 4 insertions(+), 18 deletions(-) diff --git a/contrib/plugins/todo-list-backend/README.md b/contrib/plugins/todo-list-backend/README.md index 07adc0755a..e80dd3a4e7 100644 --- a/contrib/plugins/todo-list-backend/README.md +++ b/contrib/plugins/todo-list-backend/README.md @@ -1,9 +1,3 @@ -# todo-list +# todo-list-backend -Welcome to the todo-list backend plugin! - -_This plugin was created through the Backstage CLI_ - -## Getting started - -// TODO(vinzscam): replace this +This package provides a starting point to demonstrate how plugin authors can use the Backstage permission framework. Refer to the documentation (TODO(joeporpeglia) add link) to get started. diff --git a/contrib/plugins/todo-list-common/README.md b/contrib/plugins/todo-list-common/README.md index b5d4faa9ba..6678676d88 100644 --- a/contrib/plugins/todo-list-common/README.md +++ b/contrib/plugins/todo-list-common/README.md @@ -1,5 +1,3 @@ # todo-list-common -Welcome to the todo-list-common plugin! - -_This plugin was created through the Backstage CLI_ +This package provides a starting point to demonstrate how plugin authors can use the Backstage permission framework. Refer to the documentation (TODO(joeporpeglia) add link) to get started. diff --git a/contrib/plugins/todo-list/README.md b/contrib/plugins/todo-list/README.md index 288782874a..5f2064bd9d 100644 --- a/contrib/plugins/todo-list/README.md +++ b/contrib/plugins/todo-list/README.md @@ -1,9 +1,3 @@ # todo-list -Welcome to the todo-list plugin! - -_This plugin was created through the Backstage CLI_ - -## Getting started - -// TODO(vinzscam): replace this +This package provides a starting point to demonstrate how plugin authors can use the Backstage permission framework. Refer to the documentation (TODO(joeporpeglia) add link) to get started. From 72b8018f95549193492b53c57c4a8339b49d2824 Mon Sep 17 00:00:00 2001 From: Joe Porpeglia Date: Wed, 20 Apr 2022 14:51:27 -0400 Subject: [PATCH 39/50] Update docs links Signed-off-by: Joe Porpeglia --- contrib/plugins/todo-list-backend/README.md | 2 +- contrib/plugins/todo-list-common/README.md | 2 +- contrib/plugins/todo-list/README.md | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/contrib/plugins/todo-list-backend/README.md b/contrib/plugins/todo-list-backend/README.md index e80dd3a4e7..d5c51b2b57 100644 --- a/contrib/plugins/todo-list-backend/README.md +++ b/contrib/plugins/todo-list-backend/README.md @@ -1,3 +1,3 @@ # todo-list-backend -This package provides a starting point to demonstrate how plugin authors can use the Backstage permission framework. Refer to the documentation (TODO(joeporpeglia) add link) to get started. +This package provides a starting point to demonstrate how plugin authors can use the Backstage permission framework. Refer to the [documentation](https://backstage.io/docs/permission/plugin-authors/01-setup) to get started. diff --git a/contrib/plugins/todo-list-common/README.md b/contrib/plugins/todo-list-common/README.md index 6678676d88..021eca1033 100644 --- a/contrib/plugins/todo-list-common/README.md +++ b/contrib/plugins/todo-list-common/README.md @@ -1,3 +1,3 @@ # todo-list-common -This package provides a starting point to demonstrate how plugin authors can use the Backstage permission framework. Refer to the documentation (TODO(joeporpeglia) add link) to get started. +This package provides a starting point to demonstrate how plugin authors can use the Backstage permission framework. Refer to the [documentation](https://backstage.io/docs/permission/plugin-authors/01-setup) to get started. diff --git a/contrib/plugins/todo-list/README.md b/contrib/plugins/todo-list/README.md index 5f2064bd9d..bd77af87e8 100644 --- a/contrib/plugins/todo-list/README.md +++ b/contrib/plugins/todo-list/README.md @@ -1,3 +1,3 @@ # todo-list -This package provides a starting point to demonstrate how plugin authors can use the Backstage permission framework. Refer to the documentation (TODO(joeporpeglia) add link) to get started. +This package provides a starting point to demonstrate how plugin authors can use the Backstage permission framework. Refer to the [documentation](https://backstage.io/docs/permission/plugin-authors/01-setup) to get started. From 45552192bd260112e289932250d52ea20076062c Mon Sep 17 00:00:00 2001 From: Joe Porpeglia Date: Wed, 20 Apr 2022 14:51:55 -0400 Subject: [PATCH 40/50] Update README for contrib/plugins directory Signed-off-by: Joe Porpeglia --- contrib/plugins/README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/contrib/plugins/README.md b/contrib/plugins/README.md index df302c635e..8fa0fecf0a 100644 --- a/contrib/plugins/README.md +++ b/contrib/plugins/README.md @@ -1 +1,3 @@ -# Plugins contributions +# Plugin contributions + +Plugins in this directory are for demonstrative purposes, like documentation and tutorials. Refer to the READMEs provided by each plugin for more details. From ad9df65b740fa7ff943e841926215449265c0271 Mon Sep 17 00:00:00 2001 From: Joon Park Date: Fri, 22 Apr 2022 11:08:17 +0100 Subject: [PATCH 41/50] Remove obsolete permission docs Signed-off-by: Joon Park --- docs/plugins/permissions/index.md | 5 ----- microsite/sidebars.json | 5 ----- 2 files changed, 10 deletions(-) delete mode 100644 docs/plugins/permissions/index.md diff --git a/docs/plugins/permissions/index.md b/docs/plugins/permissions/index.md deleted file mode 100644 index 56ec077895..0000000000 --- a/docs/plugins/permissions/index.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -id: index -title: Integrating Permissions into Plugins -description: Learn how to integrate permissions into a Backstage plugin by following along with this Todo Plugin tutorial. ---- diff --git a/microsite/sidebars.json b/microsite/sidebars.json index 02f16ffc78..daf452a42c 100644 --- a/microsite/sidebars.json +++ b/microsite/sidebars.json @@ -223,11 +223,6 @@ "plugins/add-to-marketplace", "plugins/observability" ] - }, - { - "type": "subcategory", - "label": "Permissions", - "ids": ["plugins/permissions/index"] } ], "Configuration": [ From 74c70f99d5a6b624528290493ff8e238ed8562ec Mon Sep 17 00:00:00 2001 From: Vincenzo Scamporlino Date: Tue, 26 Apr 2022 10:28:21 +0200 Subject: [PATCH 42/50] Move todo-list sourcecode to plugins Signed-off-by: Vincenzo Scamporlino --- contrib/plugins/README.md | 3 --- docs/permission/plugin-authors/01-setup.md | 12 +++++----- .../example-todo-list-backend}/.eslintrc.js | 0 .../example-todo-list-backend}/README.md | 0 .../example-todo-list-backend}/package.json | 14 ++++++------ .../example-todo-list-backend}/src/index.ts | 0 .../example-todo-list-backend}/src/run.ts | 0 .../src/service/router.test.ts | 0 .../src/service/router.ts | 0 .../src/service/standaloneServer.ts | 0 .../src/service/todos.ts | 0 .../src/setupTests.ts | 0 .../example-todo-list-common}/.eslintrc.js | 0 .../example-todo-list-common}/README.md | 0 .../example-todo-list-common}/package.json | 2 +- .../example-todo-list-common}/src/index.ts | 0 .../src/permissions.ts | 0 .../example-todo-list}/.eslintrc.js | 0 .../example-todo-list}/README.md | 0 .../example-todo-list}/package.json | 22 +++++++++---------- .../src/components/TodoList/TodoList.tsx | 0 .../src/components/TodoList/index.ts | 0 .../components/TodoListPage/TodoListPage.tsx | 0 .../src/components/TodoListPage/index.ts | 0 .../example-todo-list}/src/index.ts | 0 .../example-todo-list}/src/plugin.test.ts | 0 .../example-todo-list}/src/plugin.ts | 0 .../example-todo-list}/src/routes.ts | 0 .../example-todo-list}/src/setupTests.ts | 0 29 files changed, 25 insertions(+), 28 deletions(-) delete mode 100644 contrib/plugins/README.md rename {contrib/plugins/todo-list-backend => plugins/example-todo-list-backend}/.eslintrc.js (100%) rename {contrib/plugins/todo-list-backend => plugins/example-todo-list-backend}/README.md (100%) rename {contrib/plugins/todo-list-backend => plugins/example-todo-list-backend}/package.json (76%) rename {contrib/plugins/todo-list-backend => plugins/example-todo-list-backend}/src/index.ts (100%) rename {contrib/plugins/todo-list-backend => plugins/example-todo-list-backend}/src/run.ts (100%) rename {contrib/plugins/todo-list-backend => plugins/example-todo-list-backend}/src/service/router.test.ts (100%) rename {contrib/plugins/todo-list-backend => plugins/example-todo-list-backend}/src/service/router.ts (100%) rename {contrib/plugins/todo-list-backend => plugins/example-todo-list-backend}/src/service/standaloneServer.ts (100%) rename {contrib/plugins/todo-list-backend => plugins/example-todo-list-backend}/src/service/todos.ts (100%) rename {contrib/plugins/todo-list-backend => plugins/example-todo-list-backend}/src/setupTests.ts (100%) rename {contrib/plugins/todo-list-common => plugins/example-todo-list-common}/.eslintrc.js (100%) rename {contrib/plugins/todo-list-common => plugins/example-todo-list-common}/README.md (100%) rename {contrib/plugins/todo-list-common => plugins/example-todo-list-common}/package.json (97%) rename {contrib/plugins/todo-list-common => plugins/example-todo-list-common}/src/index.ts (100%) rename {contrib/plugins/todo-list-common => plugins/example-todo-list-common}/src/permissions.ts (100%) rename {contrib/plugins/todo-list => plugins/example-todo-list}/.eslintrc.js (100%) rename {contrib/plugins/todo-list => plugins/example-todo-list}/README.md (100%) rename {contrib/plugins/todo-list => plugins/example-todo-list}/package.json (67%) rename {contrib/plugins/todo-list => plugins/example-todo-list}/src/components/TodoList/TodoList.tsx (100%) rename {contrib/plugins/todo-list => plugins/example-todo-list}/src/components/TodoList/index.ts (100%) rename {contrib/plugins/todo-list => plugins/example-todo-list}/src/components/TodoListPage/TodoListPage.tsx (100%) rename {contrib/plugins/todo-list => plugins/example-todo-list}/src/components/TodoListPage/index.ts (100%) rename {contrib/plugins/todo-list => plugins/example-todo-list}/src/index.ts (100%) rename {contrib/plugins/todo-list => plugins/example-todo-list}/src/plugin.test.ts (100%) rename {contrib/plugins/todo-list => plugins/example-todo-list}/src/plugin.ts (100%) rename {contrib/plugins/todo-list => plugins/example-todo-list}/src/routes.ts (100%) rename {contrib/plugins/todo-list => plugins/example-todo-list}/src/setupTests.ts (100%) diff --git a/contrib/plugins/README.md b/contrib/plugins/README.md deleted file mode 100644 index 8fa0fecf0a..0000000000 --- a/contrib/plugins/README.md +++ /dev/null @@ -1,3 +0,0 @@ -# Plugin contributions - -Plugins in this directory are for demonstrative purposes, like documentation and tutorials. Refer to the READMEs provided by each plugin for more details. diff --git a/docs/permission/plugin-authors/01-setup.md b/docs/permission/plugin-authors/01-setup.md index 7011f52676..77dc67fd83 100644 --- a/docs/permission/plugin-authors/01-setup.md +++ b/docs/permission/plugin-authors/01-setup.md @@ -14,18 +14,18 @@ We will use a "Todo list" feature, composed of the `todo-list` and `todo-list-ba The source code is available here: -- [todo-list](https://github.com/backstage/backstage/blob/master/contrib/plugins/todo-list) -- [todo-list-backend](https://github.com/backstage/backstage/blob/master/contrib/plugins/todo-list-backend) -- [todo-list-common](https://github.com/backstage/backstage/blob/master/contrib/plugins/todo-list-common) +- [todo-list](https://github.com/backstage/backstage/blob/master/plugins/example-todo-list) +- [todo-list-backend](https://github.com/backstage/backstage/blob/master/plugins/example-todo-list-backend) +- [todo-list-common](https://github.com/backstage/backstage/blob/master/plugins/todo-list-common) 1. Copy-paste the three folders into the plugins folder of your backstage application repository or run the following script from the root of your backstage application: ```bash $ curl https://codeload.github.com/backstage/backstage/zip/refs/heads/master | \ tar -C plugins --strip-components=1 -xv \ - backstage-master/contrib/plugins/todo-list \ - backstage-master/contrib/plugins/todo-list-backend \ - backstage-master/contrib/plugins/todo-list-common + backstage-master/plugins/example-todo-list \ + backstage-master/plugins/example-todo-list-backend \ + backstage-master/plugins/example-todo-list-common ``` The `plugins` directory of your project should now include `todo-list`, `todo-list-backend`, and `todo-list-common`. diff --git a/contrib/plugins/todo-list-backend/.eslintrc.js b/plugins/example-todo-list-backend/.eslintrc.js similarity index 100% rename from contrib/plugins/todo-list-backend/.eslintrc.js rename to plugins/example-todo-list-backend/.eslintrc.js diff --git a/contrib/plugins/todo-list-backend/README.md b/plugins/example-todo-list-backend/README.md similarity index 100% rename from contrib/plugins/todo-list-backend/README.md rename to plugins/example-todo-list-backend/README.md diff --git a/contrib/plugins/todo-list-backend/package.json b/plugins/example-todo-list-backend/package.json similarity index 76% rename from contrib/plugins/todo-list-backend/package.json rename to plugins/example-todo-list-backend/package.json index 614f5520af..17c6d49057 100644 --- a/contrib/plugins/todo-list-backend/package.json +++ b/plugins/example-todo-list-backend/package.json @@ -20,12 +20,12 @@ "clean": "backstage-cli clean" }, "dependencies": { - "@backstage/backend-common": "^0.10.7", - "@backstage/config": "^0.1.13", - "@backstage/errors": "^0.2.0", - "@backstage/plugin-auth-node": "^0.1.0", - "@types/express": "*", - "cross-fetch": "^3.0.6", + "@backstage/backend-common": "^0.13.2-next.1", + "@backstage/config": "^1.0.0", + "@backstage/errors": "^1.0.0", + "@backstage/plugin-auth-node": "^0.2.0-next.0", + "@types/express": "^4.17.6", + "cross-fetch": "^3.1.5", "express": "^4.17.1", "express-promise-router": "^4.1.0", "uuid": "^8.3.2", @@ -33,7 +33,7 @@ "yn": "^4.0.0" }, "devDependencies": { - "@backstage/cli": "^0.13.2", + "@backstage/cli": "^0.17.0-next.1", "@types/supertest": "^2.0.8", "@types/uuid": "^8.0.0", "msw": "^0.35.0", diff --git a/contrib/plugins/todo-list-backend/src/index.ts b/plugins/example-todo-list-backend/src/index.ts similarity index 100% rename from contrib/plugins/todo-list-backend/src/index.ts rename to plugins/example-todo-list-backend/src/index.ts diff --git a/contrib/plugins/todo-list-backend/src/run.ts b/plugins/example-todo-list-backend/src/run.ts similarity index 100% rename from contrib/plugins/todo-list-backend/src/run.ts rename to plugins/example-todo-list-backend/src/run.ts diff --git a/contrib/plugins/todo-list-backend/src/service/router.test.ts b/plugins/example-todo-list-backend/src/service/router.test.ts similarity index 100% rename from contrib/plugins/todo-list-backend/src/service/router.test.ts rename to plugins/example-todo-list-backend/src/service/router.test.ts diff --git a/contrib/plugins/todo-list-backend/src/service/router.ts b/plugins/example-todo-list-backend/src/service/router.ts similarity index 100% rename from contrib/plugins/todo-list-backend/src/service/router.ts rename to plugins/example-todo-list-backend/src/service/router.ts diff --git a/contrib/plugins/todo-list-backend/src/service/standaloneServer.ts b/plugins/example-todo-list-backend/src/service/standaloneServer.ts similarity index 100% rename from contrib/plugins/todo-list-backend/src/service/standaloneServer.ts rename to plugins/example-todo-list-backend/src/service/standaloneServer.ts diff --git a/contrib/plugins/todo-list-backend/src/service/todos.ts b/plugins/example-todo-list-backend/src/service/todos.ts similarity index 100% rename from contrib/plugins/todo-list-backend/src/service/todos.ts rename to plugins/example-todo-list-backend/src/service/todos.ts diff --git a/contrib/plugins/todo-list-backend/src/setupTests.ts b/plugins/example-todo-list-backend/src/setupTests.ts similarity index 100% rename from contrib/plugins/todo-list-backend/src/setupTests.ts rename to plugins/example-todo-list-backend/src/setupTests.ts diff --git a/contrib/plugins/todo-list-common/.eslintrc.js b/plugins/example-todo-list-common/.eslintrc.js similarity index 100% rename from contrib/plugins/todo-list-common/.eslintrc.js rename to plugins/example-todo-list-common/.eslintrc.js diff --git a/contrib/plugins/todo-list-common/README.md b/plugins/example-todo-list-common/README.md similarity index 100% rename from contrib/plugins/todo-list-common/README.md rename to plugins/example-todo-list-common/README.md diff --git a/contrib/plugins/todo-list-common/package.json b/plugins/example-todo-list-common/package.json similarity index 97% rename from contrib/plugins/todo-list-common/package.json rename to plugins/example-todo-list-common/package.json index 6ea0334388..e6220c878b 100644 --- a/contrib/plugins/todo-list-common/package.json +++ b/plugins/example-todo-list-common/package.json @@ -36,7 +36,7 @@ "@backstage/core-app-api": "^1.0.1-next.0", "@backstage/dev-utils": "^1.0.1-next.0", "@backstage/test-utils": "^1.0.1-next.1", - "@types/node": "*", + "@types/node": "^14.14.32", "msw": "^0.35.0", "cross-fetch": "^3.1.5" }, diff --git a/contrib/plugins/todo-list-common/src/index.ts b/plugins/example-todo-list-common/src/index.ts similarity index 100% rename from contrib/plugins/todo-list-common/src/index.ts rename to plugins/example-todo-list-common/src/index.ts diff --git a/contrib/plugins/todo-list-common/src/permissions.ts b/plugins/example-todo-list-common/src/permissions.ts similarity index 100% rename from contrib/plugins/todo-list-common/src/permissions.ts rename to plugins/example-todo-list-common/src/permissions.ts diff --git a/contrib/plugins/todo-list/.eslintrc.js b/plugins/example-todo-list/.eslintrc.js similarity index 100% rename from contrib/plugins/todo-list/.eslintrc.js rename to plugins/example-todo-list/.eslintrc.js diff --git a/contrib/plugins/todo-list/README.md b/plugins/example-todo-list/README.md similarity index 100% rename from contrib/plugins/todo-list/README.md rename to plugins/example-todo-list/README.md diff --git a/contrib/plugins/todo-list/package.json b/plugins/example-todo-list/package.json similarity index 67% rename from contrib/plugins/todo-list/package.json rename to plugins/example-todo-list/package.json index 74fa881803..5cf6959383 100644 --- a/contrib/plugins/todo-list/package.json +++ b/plugins/example-todo-list/package.json @@ -21,9 +21,9 @@ "clean": "backstage-cli clean" }, "dependencies": { - "@backstage/core-components": "^0.8.8", - "@backstage/core-plugin-api": "^0.6.0", - "@backstage/theme": "^0.2.14", + "@backstage/core-components": "^0.9.3-next.0", + "@backstage/core-plugin-api": "^1.0.0", + "@backstage/theme": "^0.2.15", "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", "@material-ui/lab": "4.0.0-alpha.57", @@ -33,15 +33,15 @@ "react": "^16.13.1 || ^17.0.0" }, "devDependencies": { - "@backstage/cli": "^0.13.2", - "@backstage/core-app-api": "^0.5.2", - "@backstage/dev-utils": "^0.2.21", - "@backstage/test-utils": "^0.2.4", + "@backstage/cli": "^0.17.0-next.1", + "@backstage/core-app-api": "^1.0.1-next.0", + "@backstage/dev-utils": "^1.0.1-next.0", + "@backstage/test-utils": "^1.0.1-next.1", "@testing-library/jest-dom": "^5.10.1", - "@testing-library/react": "^11.2.5", - "@testing-library/user-event": "^13.1.8", - "@types/jest": "*", - "@types/node": "*", + "@testing-library/react": "^12.1.3", + "@testing-library/user-event": "^14.0.0", + "@types/jest": "^26.0.7", + "@types/node": "^14.14.32", "msw": "^0.35.0" }, "files": [ diff --git a/contrib/plugins/todo-list/src/components/TodoList/TodoList.tsx b/plugins/example-todo-list/src/components/TodoList/TodoList.tsx similarity index 100% rename from contrib/plugins/todo-list/src/components/TodoList/TodoList.tsx rename to plugins/example-todo-list/src/components/TodoList/TodoList.tsx diff --git a/contrib/plugins/todo-list/src/components/TodoList/index.ts b/plugins/example-todo-list/src/components/TodoList/index.ts similarity index 100% rename from contrib/plugins/todo-list/src/components/TodoList/index.ts rename to plugins/example-todo-list/src/components/TodoList/index.ts diff --git a/contrib/plugins/todo-list/src/components/TodoListPage/TodoListPage.tsx b/plugins/example-todo-list/src/components/TodoListPage/TodoListPage.tsx similarity index 100% rename from contrib/plugins/todo-list/src/components/TodoListPage/TodoListPage.tsx rename to plugins/example-todo-list/src/components/TodoListPage/TodoListPage.tsx diff --git a/contrib/plugins/todo-list/src/components/TodoListPage/index.ts b/plugins/example-todo-list/src/components/TodoListPage/index.ts similarity index 100% rename from contrib/plugins/todo-list/src/components/TodoListPage/index.ts rename to plugins/example-todo-list/src/components/TodoListPage/index.ts diff --git a/contrib/plugins/todo-list/src/index.ts b/plugins/example-todo-list/src/index.ts similarity index 100% rename from contrib/plugins/todo-list/src/index.ts rename to plugins/example-todo-list/src/index.ts diff --git a/contrib/plugins/todo-list/src/plugin.test.ts b/plugins/example-todo-list/src/plugin.test.ts similarity index 100% rename from contrib/plugins/todo-list/src/plugin.test.ts rename to plugins/example-todo-list/src/plugin.test.ts diff --git a/contrib/plugins/todo-list/src/plugin.ts b/plugins/example-todo-list/src/plugin.ts similarity index 100% rename from contrib/plugins/todo-list/src/plugin.ts rename to plugins/example-todo-list/src/plugin.ts diff --git a/contrib/plugins/todo-list/src/routes.ts b/plugins/example-todo-list/src/routes.ts similarity index 100% rename from contrib/plugins/todo-list/src/routes.ts rename to plugins/example-todo-list/src/routes.ts diff --git a/contrib/plugins/todo-list/src/setupTests.ts b/plugins/example-todo-list/src/setupTests.ts similarity index 100% rename from contrib/plugins/todo-list/src/setupTests.ts rename to plugins/example-todo-list/src/setupTests.ts From 7f484f496024fd0f943facef1be03030f182a49c Mon Sep 17 00:00:00 2001 From: Vincenzo Scamporlino Date: Tue, 26 Apr 2022 11:48:12 +0200 Subject: [PATCH 43/50] fix unused var Signed-off-by: Vincenzo Scamporlino --- .../plugin-authors/04-authorizing-access-to-paginated-data.md | 3 ++- plugins/example-todo-list-backend/src/service/router.ts | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/docs/permission/plugin-authors/04-authorizing-access-to-paginated-data.md b/docs/permission/plugin-authors/04-authorizing-access-to-paginated-data.md index b73352f549..f89553bbd8 100644 --- a/docs/permission/plugin-authors/04-authorizing-access-to-paginated-data.md +++ b/docs/permission/plugin-authors/04-authorizing-access-to-paginated-data.md @@ -85,7 +85,8 @@ So far we've only used the `PermissionEvaluator.authorize` method, which will ev + const transformConditions: ConditionTransformer = createConditionTransformer(Object.values(rules)); - router.get('/todos', async (req, res) => { +- router.get('/todos', async (_req, res) => { ++ router.get('/todos', async (req, res) => { + const token = getBearerTokenFromAuthorizationHeader( + req.header('authorization'), + ); diff --git a/plugins/example-todo-list-backend/src/service/router.ts b/plugins/example-todo-list-backend/src/service/router.ts index c6d9b503ed..d5584eacc6 100644 --- a/plugins/example-todo-list-backend/src/service/router.ts +++ b/plugins/example-todo-list-backend/src/service/router.ts @@ -43,7 +43,7 @@ export async function createRouter( response.send({ status: 'ok' }); }); - router.get('/todos', async (req, res) => { + router.get('/todos', async (_req, res) => { res.json(getAll()); }); From d1912729c9d4fed1152955240c4dc464ff4da433 Mon Sep 17 00:00:00 2001 From: Vincenzo Scamporlino Date: Tue, 26 Apr 2022 11:49:02 +0200 Subject: [PATCH 44/50] Improve todo-list clone script Signed-off-by: Vincenzo Scamporlino --- docs/permission/plugin-authors/01-setup.md | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/docs/permission/plugin-authors/01-setup.md b/docs/permission/plugin-authors/01-setup.md index 77dc67fd83..18f745a045 100644 --- a/docs/permission/plugin-authors/01-setup.md +++ b/docs/permission/plugin-authors/01-setup.md @@ -21,15 +21,19 @@ The source code is available here: 1. Copy-paste the three folders into the plugins folder of your backstage application repository or run the following script from the root of your backstage application: ```bash - $ curl https://codeload.github.com/backstage/backstage/zip/refs/heads/master | \ - tar -C plugins --strip-components=1 -xv \ - backstage-master/plugins/example-todo-list \ - backstage-master/plugins/example-todo-list-backend \ - backstage-master/plugins/example-todo-list-common + $ cd $(mktemp -d) + git clone --depth 1 --quiet --no-checkout --filter=blob:none https://github.com/backstage/backstage.git . + git checkout master -- plugins/example-todo-list/ + git checkout master -- plugins/example-todo-list-backend/ + git checkout master -- plugins/example-todo-list-common/ + cp -R plugins/* $OLDPWD/plugins + cd - ``` The `plugins` directory of your project should now include `todo-list`, `todo-list-backend`, and `todo-list-common`. + **Important**: if you are on **Windows**, make sure you have WSL and git installed on your machine before executing the script above. + 2. Add these packages as dependencies for your Backstage app: ``` From 172e5c58b670fca91fece4c5d917385030101926 Mon Sep 17 00:00:00 2001 From: Vincenzo Scamporlino Date: Wed, 27 Apr 2022 22:44:19 +0200 Subject: [PATCH 45/50] Add todo-list plugins prefix notice Signed-off-by: Vincenzo Scamporlino --- docs/permission/plugin-authors/01-setup.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/permission/plugin-authors/01-setup.md b/docs/permission/plugin-authors/01-setup.md index 18f745a045..2f070f603b 100644 --- a/docs/permission/plugin-authors/01-setup.md +++ b/docs/permission/plugin-authors/01-setup.md @@ -16,9 +16,9 @@ The source code is available here: - [todo-list](https://github.com/backstage/backstage/blob/master/plugins/example-todo-list) - [todo-list-backend](https://github.com/backstage/backstage/blob/master/plugins/example-todo-list-backend) -- [todo-list-common](https://github.com/backstage/backstage/blob/master/plugins/todo-list-common) +- [todo-list-common](https://github.com/backstage/backstage/blob/master/plugins/example-todo-list-common) -1. Copy-paste the three folders into the plugins folder of your backstage application repository or run the following script from the root of your backstage application: +1. Copy-paste the three folders into the plugins folder of your backstage application repository (removing the `example-` prefix from each folder) or run the following script from the root of your backstage application: ```bash $ cd $(mktemp -d) @@ -26,7 +26,7 @@ The source code is available here: git checkout master -- plugins/example-todo-list/ git checkout master -- plugins/example-todo-list-backend/ git checkout master -- plugins/example-todo-list-common/ - cp -R plugins/* $OLDPWD/plugins + for file in plugins/*; do mv "$file" "$OLDPWD/${file/example-todo/todo}"; done cd - ``` From f813a0ff51458acf3c7518eec74371873c5fc596 Mon Sep 17 00:00:00 2001 From: Vincenzo Scamporlino Date: Wed, 27 Apr 2022 22:48:53 +0200 Subject: [PATCH 46/50] Add todo-list api docs Signed-off-by: Vincenzo Scamporlino --- .../example-todo-list-backend/api-report.md | 22 ++++++++++++++++++ .../src/service/router.ts | 14 +++++++++++ .../example-todo-list-common/api-report.md | 12 ++++++++++ .../src/permissions.ts | 5 ++++ plugins/example-todo-list/api-report.md | 23 +++++++++++++++++++ plugins/example-todo-list/src/plugin.ts | 10 ++++++++ 6 files changed, 86 insertions(+) create mode 100644 plugins/example-todo-list-backend/api-report.md create mode 100644 plugins/example-todo-list-common/api-report.md create mode 100644 plugins/example-todo-list/api-report.md diff --git a/plugins/example-todo-list-backend/api-report.md b/plugins/example-todo-list-backend/api-report.md new file mode 100644 index 0000000000..fa62ada8e7 --- /dev/null +++ b/plugins/example-todo-list-backend/api-report.md @@ -0,0 +1,22 @@ +## API Report File for "@internal/plugin-todo-list-backend" + +> Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/). + +```ts +import express from 'express'; +import { IdentityClient } from '@backstage/plugin-auth-node'; +import { Logger } from 'winston'; + +// @public +export function createRouter(options: RouterOptions): Promise; + +// @public +export interface RouterOptions { + // (undocumented) + identity: IdentityClient; + // (undocumented) + logger: Logger; +} + +// (No @packageDocumentation comment for this package) +``` diff --git a/plugins/example-todo-list-backend/src/service/router.ts b/plugins/example-todo-list-backend/src/service/router.ts index d5584eacc6..cdaf1f82b4 100644 --- a/plugins/example-todo-list-backend/src/service/router.ts +++ b/plugins/example-todo-list-backend/src/service/router.ts @@ -25,11 +25,25 @@ import { import { add, getAll, update } from './todos'; import { InputError } from '@backstage/errors'; +/** + * Dependencies of the todo-list router + * + * @public + */ export interface RouterOptions { logger: Logger; identity: IdentityClient; } +/** + * Creates an express.Router with some endpoints + * for creating, editing and deleting todo items. + * + * @public + * @param options - the dependencies of the router + * @returns an express.Router + * + */ export async function createRouter( options: RouterOptions, ): Promise { diff --git a/plugins/example-todo-list-common/api-report.md b/plugins/example-todo-list-common/api-report.md new file mode 100644 index 0000000000..15ffb7b139 --- /dev/null +++ b/plugins/example-todo-list-common/api-report.md @@ -0,0 +1,12 @@ +## API Report File for "@internal/plugin-todo-list-common" + +> Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/). + +```ts +import { BasicPermission } from '@backstage/plugin-permission-common'; + +// @public +export const tempExamplePermission: BasicPermission; + +// (No @packageDocumentation comment for this package) +``` diff --git a/plugins/example-todo-list-common/src/permissions.ts b/plugins/example-todo-list-common/src/permissions.ts index a91cafad0e..439bf5e8b9 100644 --- a/plugins/example-todo-list-common/src/permissions.ts +++ b/plugins/example-todo-list-common/src/permissions.ts @@ -16,6 +16,11 @@ import { createPermission } from '@backstage/plugin-permission-common'; +/** + * An example of a permission. + * + * @public + */ export const tempExamplePermission = createPermission({ name: 'temp.example.noop', attributes: {}, diff --git a/plugins/example-todo-list/api-report.md b/plugins/example-todo-list/api-report.md new file mode 100644 index 0000000000..534c33200e --- /dev/null +++ b/plugins/example-todo-list/api-report.md @@ -0,0 +1,23 @@ +## API Report File for "@internal/plugin-todo-list" + +> Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/). + +```ts +/// + +import { BackstagePlugin } from '@backstage/core-plugin-api'; +import { RouteRef } from '@backstage/core-plugin-api'; + +// @public +export const TodoListPage: () => JSX.Element; + +// @public +export const todoListPlugin: BackstagePlugin< + { + root: RouteRef; + }, + {} +>; + +// (No @packageDocumentation comment for this package) +``` diff --git a/plugins/example-todo-list/src/plugin.ts b/plugins/example-todo-list/src/plugin.ts index 046c00d98c..0a6cf70476 100644 --- a/plugins/example-todo-list/src/plugin.ts +++ b/plugins/example-todo-list/src/plugin.ts @@ -20,6 +20,11 @@ import { import { rootRouteRef } from './routes'; +/** + * The todo-list plugin instance + * + * @public + */ export const todoListPlugin = createPlugin({ id: 'todolist', routes: { @@ -27,6 +32,11 @@ export const todoListPlugin = createPlugin({ }, }); +/** + * The Router and main entrypoint to the todo-list plugin. + * + * @public + */ export const TodoListPage = todoListPlugin.provide( createRoutableExtension({ name: 'TodoListPage', From 893ff145bc9cbed1e583f0de81e97ad03b5d3fa7 Mon Sep 17 00:00:00 2001 From: Vincenzo Scamporlino Date: Wed, 27 Apr 2022 22:59:14 +0200 Subject: [PATCH 47/50] todo-list: bump dependencies Signed-off-by: Vincenzo Scamporlino --- .../example-todo-list-backend/package.json | 20 ++++++------- plugins/example-todo-list-common/package.json | 18 ++++-------- plugins/example-todo-list/package.json | 28 +++++++++---------- 3 files changed, 30 insertions(+), 36 deletions(-) diff --git a/plugins/example-todo-list-backend/package.json b/plugins/example-todo-list-backend/package.json index 17c6d49057..471a496fd8 100644 --- a/plugins/example-todo-list-backend/package.json +++ b/plugins/example-todo-list-backend/package.json @@ -11,19 +11,19 @@ "types": "dist/index.d.ts" }, "scripts": { - "start": "backstage-cli backend:dev", - "build": "backstage-cli backend:build", - "lint": "backstage-cli lint", - "test": "backstage-cli test", - "prepack": "backstage-cli prepack", - "postpack": "backstage-cli postpack", - "clean": "backstage-cli clean" + "start": "backstage-cli package start", + "build": "backstage-cli package build", + "lint": "backstage-cli package lint", + "test": "backstage-cli package test", + "prepack": "backstage-cli package prepack", + "postpack": "backstage-cli package postpack", + "clean": "backstage-cli package clean" }, "dependencies": { - "@backstage/backend-common": "^0.13.2-next.1", + "@backstage/backend-common": "^0.13.3-next.0", "@backstage/config": "^1.0.0", "@backstage/errors": "^1.0.0", - "@backstage/plugin-auth-node": "^0.2.0-next.0", + "@backstage/plugin-auth-node": "^0.2.1-next.0", "@types/express": "^4.17.6", "cross-fetch": "^3.1.5", "express": "^4.17.1", @@ -33,7 +33,7 @@ "yn": "^4.0.0" }, "devDependencies": { - "@backstage/cli": "^0.17.0-next.1", + "@backstage/cli": "^0.17.1-next.0", "@types/supertest": "^2.0.8", "@types/uuid": "^8.0.0", "msw": "^0.35.0", diff --git a/plugins/example-todo-list-common/package.json b/plugins/example-todo-list-common/package.json index e6220c878b..746fbb3233 100644 --- a/plugins/example-todo-list-common/package.json +++ b/plugins/example-todo-list-common/package.json @@ -23,20 +23,14 @@ "postpack": "backstage-cli package postpack" }, "dependencies": { - "@backstage/core-components": "^0.9.3-next.0", - "@backstage/core-plugin-api": "^1.0.0", - "@backstage/plugin-permission-common": "^0.6.0-next.0", - "@backstage/theme": "^0.2.15" - }, - "peerDependencies": { - "react": "^16.13.1 || ^17.0.0" + "@backstage/plugin-permission-common": "^0.6.0" }, "devDependencies": { - "@backstage/cli": "^0.17.0-next.1", - "@backstage/core-app-api": "^1.0.1-next.0", - "@backstage/dev-utils": "^1.0.1-next.0", - "@backstage/test-utils": "^1.0.1-next.1", - "@types/node": "^14.14.32", + "@backstage/cli": "^0.17.1-next.0", + "@backstage/core-app-api": "^1.0.1", + "@backstage/dev-utils": "^1.0.2-next.0", + "@backstage/test-utils": "^1.0.2-next.0", + "@types/node": "^16.11.26", "msw": "^0.35.0", "cross-fetch": "^3.1.5" }, diff --git a/plugins/example-todo-list/package.json b/plugins/example-todo-list/package.json index 5cf6959383..e3431e5773 100644 --- a/plugins/example-todo-list/package.json +++ b/plugins/example-todo-list/package.json @@ -11,18 +11,18 @@ "types": "dist/index.d.ts" }, "scripts": { - "build": "backstage-cli plugin:build", - "start": "backstage-cli plugin:serve", - "lint": "backstage-cli lint", - "test": "backstage-cli test", + "build": "backstage-cli package build", + "start": "backstage-cli package start", + "lint": "backstage-cli package lint", + "test": "backstage-cli package test", "diff": "backstage-cli plugin:diff", - "prepack": "backstage-cli prepack", - "postpack": "backstage-cli postpack", - "clean": "backstage-cli clean" + "prepack": "backstage-cli package prepack", + "postpack": "backstage-cli package postpack", + "clean": "backstage-cli package clean" }, "dependencies": { - "@backstage/core-components": "^0.9.3-next.0", - "@backstage/core-plugin-api": "^1.0.0", + "@backstage/core-components": "^0.9.3", + "@backstage/core-plugin-api": "^1.0.1", "@backstage/theme": "^0.2.15", "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", @@ -33,15 +33,15 @@ "react": "^16.13.1 || ^17.0.0" }, "devDependencies": { - "@backstage/cli": "^0.17.0-next.1", - "@backstage/core-app-api": "^1.0.1-next.0", - "@backstage/dev-utils": "^1.0.1-next.0", - "@backstage/test-utils": "^1.0.1-next.1", + "@backstage/cli": "^0.17.1-next.0", + "@backstage/core-app-api": "^1.0.1", + "@backstage/dev-utils": "^1.0.2-next.0", + "@backstage/test-utils": "^1.0.2-next.0", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^12.1.3", "@testing-library/user-event": "^14.0.0", "@types/jest": "^26.0.7", - "@types/node": "^14.14.32", + "@types/node": "^16.11.26", "msw": "^0.35.0" }, "files": [ From 1cbab91f6d5c4f02d5f5742dfa2fd6cb10246925 Mon Sep 17 00:00:00 2001 From: Joe Porpeglia Date: Fri, 22 Apr 2022 15:29:56 -0400 Subject: [PATCH 48/50] Add note on cookie-based authentication Signed-off-by: Joe Porpeglia --- docs/permission/getting-started.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/permission/getting-started.md b/docs/permission/getting-started.md index 0d87393b26..b115b674d6 100644 --- a/docs/permission/getting-started.md +++ b/docs/permission/getting-started.md @@ -34,6 +34,10 @@ Like many other parts of Backstage, the permissions framework relies on informat [The IdentityResolver docs](../auth/identity-resolver.md) describe the process for resolving group membership on sign in. +## Optionally add cookie-based authentication + +Asset requests initiated by the browser will not include a token in the `Authorization` header. If these requests check authorization through the permission framework, as done in plugins like TechDocs, then you'll need to set up cookie-based authentication. Refer to the ["Authenticate API requests"](https://github.com/backstage/backstage/blob/master/contrib/docs/tutorials/authenticate-api-requests.md) tutorial for a demonstration on how to implement this behavior. + ## Integrating the permission framework with your Backstage instance ### 1. Set up the permission backend From d039fb44a754f3be60cdcd11ef560b4b05d90a19 Mon Sep 17 00:00:00 2001 From: Joe Porpeglia Date: Wed, 27 Apr 2022 18:58:42 -0400 Subject: [PATCH 49/50] Add documentation about package api conventions for permissions Signed-off-by: Joe Porpeglia --- .../02-adding-a-basic-permission-check.md | 2 +- .../03-adding-a-resource-permission-check.md | 47 ++++++++++++++----- ...04-authorizing-access-to-paginated-data.md | 13 ++--- 3 files changed, 41 insertions(+), 21 deletions(-) diff --git a/docs/permission/plugin-authors/02-adding-a-basic-permission-check.md b/docs/permission/plugin-authors/02-adding-a-basic-permission-check.md index de88b3f040..a670deb5ed 100644 --- a/docs/permission/plugin-authors/02-adding-a-basic-permission-check.md +++ b/docs/permission/plugin-authors/02-adding-a-basic-permission-check.md @@ -26,7 +26,7 @@ Let's navigate to the file `plugins/todo-list-common/src/permissions.ts` and add }); ``` -For this tutorial, we've automatically exported all permissions from this file (see `plugins/todo-list-common/src/index.ts`). For the actual plugins that you author, you must export any permission authorized by the plugin so Backstage integrators can import them when writing policies. +> Note: All permissions authorized by your plugin should be exported from a ["common-library" package](https://backstage.io/docs/local-dev/cli-build-system#package-roles). This allows Backstage integrators to reference them in frontend components and permission policies. ## Authorizing using the new permission diff --git a/docs/permission/plugin-authors/03-adding-a-resource-permission-check.md b/docs/permission/plugin-authors/03-adding-a-resource-permission-check.md index 1df78d52e1..e818557402 100644 --- a/docs/permission/plugin-authors/03-adding-a-resource-permission-check.md +++ b/docs/permission/plugin-authors/03-adding-a-resource-permission-check.md @@ -83,7 +83,7 @@ import { makeCreatePermissionRule } from '@backstage/plugin-permission-node'; import { TODO_LIST_RESOURCE_TYPE } from '@internal/plugin-todo-list-common'; import { Todo, TodoFilter } from './todos'; -const createTodoListPermissionRule = makeCreatePermissionRule< +export const createTodoListPermissionRule = makeCreatePermissionRule< Todo, TodoFilter >(); @@ -108,6 +108,8 @@ export const rules = { isOwner }; `makeCreatePermissionRule` is a helper used to ensure that rules created for this plugin use consistent types for the resource and query. +> Note: To support custom rules defined by Backstage integrators, you must export `createTodoListPermissionRule` from the backend package and provide some way for custom rules to be passed in before the backend starts, likely via `createRouter`. + We have created a new `isOwner` rule, which is going to be automatically used by the permission framework whenever a conditional response is returned in response to an authorized request with an attached `resourceRef`. Specifically, the `apply` function is used to understand whether the passed resource should be authorized or not. @@ -149,9 +151,33 @@ Now, let's create the new endpoint by editing `plugins/todo-list-backend/src/ser router.post('/todos', async (req, res) => { ``` +## Provide utilities for policy authors + +Now that we have a new resource type and a corresponding rule, we need to export some utilities for policy authors to reference them. + +Create a new `plugins/todo-list-backend/src/conditionExports.ts` file and add the following code: + +```typescript +import { TODO_LIST_RESOURCE_TYPE } from '@internal/plugin-todo-list-common'; +import { createConditionExports } from '@backstage/plugin-permission-node'; +import { permissionRules } from './service/rules'; + +const { conditions, createConditionalDecision } = createConditionExports({ + pluginId: 'catalog', + resourceType: RESOURCE_TYPE_CATALOG_ENTITY, + rules: permissionRules, +}); + +export const todoListConditions = conditions; + +export const createTodoListConditionalDecision = createConditionalDecision; +``` + +Make sure `todoListConditions` and `createTodoListConditionalDecision` are exported from the `todo-list-backend` package. + ## Test the authorized update endpoint -Now let's go back to the permission policy's handle function and try to authorize our new permission. +Let's go back to the permission policy's handle function and try to authorize our new permission with an `isOwner` condition. ```diff // packages/backend/src/plugins/permission.ts @@ -171,6 +197,10 @@ Now let's go back to the permission policy's handle function and try to authoriz + todoListUpdate, + TODO_LIST_RESOURCE_TYPE, + } from '@internal/plugin-todo-list-common'; ++ import { ++ todoListConditions, ++ createTodoListConditionalDecision, ++ } from '@internal/plugin-todo-list-backend'; ... @@ -181,15 +211,10 @@ Now let's go back to the permission policy's handle function and try to authoriz } + if (isPermission(request.permission, todoListUpdate)) { -+ return { -+ result: AuthorizeResult.CONDITIONAL, -+ pluginId: 'todolist', -+ resourceType: TODO_LIST_RESOURCE_TYPE, -+ conditions: { -+ rule: 'IS_OWNER', -+ params: [user?.identity.userEntityRef], -+ }, -+ }; ++ return createTodoListConditionalDecision( ++ request.permission, ++ todoListConditions.isOwner(user?.identity.userEntityRef), ++ ); + } + return { diff --git a/docs/permission/plugin-authors/04-authorizing-access-to-paginated-data.md b/docs/permission/plugin-authors/04-authorizing-access-to-paginated-data.md index f89553bbd8..582553832b 100644 --- a/docs/permission/plugin-authors/04-authorizing-access-to-paginated-data.md +++ b/docs/permission/plugin-authors/04-authorizing-access-to-paginated-data.md @@ -139,15 +139,10 @@ import { + isPermission(request.permission, todoListUpdate) || + isPermission(request.permission, todoListRead) + ) { - return { - result: AuthorizeResult.CONDITIONAL, - pluginId: 'todolist', - resourceType: TODO_LIST_RESOURCE_TYPE, - conditions: { - rule: 'IS_OWNER', - params: [user?.identity.userEntityRef], - }, - }; + return createTodoListConditionalDecision( + request.permission, + todoListConditions.isOwner(user?.identity.userEntityRef), + ); } ``` From b706a8d728ad3b8932412a6fb6e32fac64bbefbe Mon Sep 17 00:00:00 2001 From: Joe Porpeglia Date: Thu, 28 Apr 2022 11:51:31 -0400 Subject: [PATCH 50/50] Add original note stating that permissions are already exported for the this tutorial Signed-off-by: Joe Porpeglia --- .../plugin-authors/02-adding-a-basic-permission-check.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/permission/plugin-authors/02-adding-a-basic-permission-check.md b/docs/permission/plugin-authors/02-adding-a-basic-permission-check.md index a670deb5ed..c73fe800b4 100644 --- a/docs/permission/plugin-authors/02-adding-a-basic-permission-check.md +++ b/docs/permission/plugin-authors/02-adding-a-basic-permission-check.md @@ -26,6 +26,8 @@ Let's navigate to the file `plugins/todo-list-common/src/permissions.ts` and add }); ``` +For this tutorial, we've automatically exported all permissions from this file (see `plugins/todo-list-common/src/index.ts`). + > Note: All permissions authorized by your plugin should be exported from a ["common-library" package](https://backstage.io/docs/local-dev/cli-build-system#package-roles). This allows Backstage integrators to reference them in frontend components and permission policies. ## Authorizing using the new permission