рдЕрдиреБрдорддрд┐рдпреЛрдВ рдХреЗ рддрд╣рдд UX / UI рдХреИрд╕реЗ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░реЗрдВ

рдХрдИ рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╣реЛрддреА рд╣реИ (рдПрдХ рдбрд┐рдЧреНрд░реА рдпрд╛ рдХрд┐рд╕реА рдЕрдиреНрдп рдХреЗ рд▓рд┐рдП)ред рд╕рднреА рдЬреНрдЮрд╛рдд рддрдХрдиреАрдХреЛрдВ рдЖрджрд┐ рдореЗрдВ рдХрдИ рд╕рд░реНрд╡реЛрддреНрддрдо рдкреНрд░рдерд╛рдПрдВ рд▓рд┐рдЦреА рдЧрдИ рд╣реИрдВред рдЖрджрд┐


рд▓реЗрдХрд┐рди рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдиреЗ рд▓реЙрдЧрд┐рди рдХрд┐рдпрд╛ рдФрд░? рдЖрдЦрд┐рд░рдХрд╛рд░, рд╡рд╣ рд╕рдм рдХреБрдЫ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ред рдпрд╣ рдХреИрд╕реЗ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдП рдХрд┐ рд╡рд╣ рдХреНрдпрд╛ рджреЗрдЦ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдХреНрдпрд╛ рдирд╣реАрдВред рдХреМрди рд╕реЗ рдмрдЯрди рдХреЛ рджрдмрд╛рдиреЗ рдХрд╛ рдЕрдзрд┐рдХрд╛рд░ рд╣реИ, рдЬреЛ рдмрджрд▓ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдмрдирд╛рдПрдВ рдпрд╛ рд╣рдЯрд╛рдПрдВред


рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдореИрдВ рд╡реЗрдм рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдкрд░ рдЗрди рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред


рдЫрд╡рд┐


рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╡рд╛рд╕реНрддрд╡рд┐рдХ / рдкреНрд░рднрд╛рд╡реА рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдХреЗрд╡рд▓ рд╕рд░реНрд╡рд░ рдкрд░ рд╣реА рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдлреНрд░рдВрдЯ рдПрдВрдб рдореЗрдВ, рд╣рдо рдХреЗрд╡рд▓ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ (рд╣рдореНрдо, рд░реВрд╕реА рднрд╛рд╖рд╛ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдореЗрд╢рд╛ рдирд╣реАрдВ ...) рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╣ рдпреВрдПрдХреНрд╕ рд╕реЗ рдкрд░реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЕрдиреБрднрд╡ рднреА рд╣реИред рд╣рдо рдЙрди рдмрдЯрди рдХреЛ рдЫрд┐рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рди рдкрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдкреНрд░реЗрд╕ рдХрд░рдиреЗ рдХрд╛ рдЕрдзрд┐рдХрд╛рд░ рдирд╣реАрдВ рд╣реИ, рдпрд╛ рдЙрд╕реЗ рдкреГрд╖реНрда рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рд╕реЗ рд░реЛрдХ рд╕рдХрддрд╛ рд╣реИ, рдпрд╛ рдПрдХ рд╕рдВрджреЗрд╢ рджрд┐рдЦрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЙрд╕рдХреЗ рдкрд╛рд╕ рдЗрд╕ рдпрд╛ рдЙрд╕ рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХреЗ рдЕрдзрд┐рдХрд╛рд░ рдирд╣реАрдВ рд╣реИрдВред


рдФрд░ рдпрд╣рд╛рдВ рд╕рд╡рд╛рд▓ рдЙрдарддрд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рдПред


рдЖрдЗрдП рд╕рдорд╕реНрдпрд╛ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдХреЗ рд╢реБрд░реВ рдХрд░реЗрдВред


рд╣рдордиреЗ рдЯреЛрдбреЛ рдРрдк рдмрдирд╛рдпрд╛ рдФрд░ рдЗрд╕рдХреЗ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╣реИрдВ:


USER - рд╕рднреА рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ (V рдХреЛ рд╕реЗрдЯ рдФрд░ рд╣рдЯрд╛ рд╕рдХрддреЗ рд╣реИрдВ), рд▓реЗрдХрд┐рди рдЖрдБрдХрдбрд╝реЗ рд╣рдЯрд╛ рдпрд╛ рдирд╣реАрдВ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдирд╣реАрдВ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред


ADMIN - рд╕рднреА рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдирдП рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЖрдВрдХрдбрд╝реЗ рдирд╣реАрдВ рджреЗрдЦрддреЗ рд╣реИрдВред


SUPER_ADMIN - рд╕рднреА рдХрд╛рд░реНрдп рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдирдП рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд╣рдЯрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдЖрдБрдХрдбрд╝реЗ рднреА рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред


рдХрд╛рд░реНрдп рджреЗрдЦреЗрдВрдХрд╛рд░реНрдп рдмрдирд╛рдПрдБрдЪреЗрдХ / рдЕрдирдЪреЗрдХ рдХрд╛рд░реНрдп (рдЕрдкрдбреЗрдЯ)рдХрд╛рд░реНрдп рд╣рдЯрд╛рдПрдБрдЖрдБрдХрдбрд╝реЗ рджреЗрдЦреЗрдВ
рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рд╡реАрдПрдХреНрд╕рд╡реАрдПрдХреНрд╕рдПрдХреНрд╕
рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХрд╡реАрд╡реАрд╡реАрдПрдХреНрд╕рдПрдХреНрд╕
SUPER_ADMINрд╡реАрд╡реАрд╡реАрд╡реАрд╡реА

рдРрд╕реА рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рд╣рдо рднреВрдорд┐рдХрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдЖрд╕рд╛рдиреА рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╕реНрдерд┐рддрд┐ рдмрд╣реБрдд рдмрджрд▓ рд╕рдХрддреА рд╣реИред рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ рдХрд┐ рдПрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╣реИ рдЬрд┐рд╕рдХреЗ рдкрд╛рд╕ ADMIN рдкреНрд▓рд╕ рдХрд╛рд░реНрдп рд╣рдЯрд╛рдиреЗ рдХреЗ рд╕рдорд╛рди рдЕрдзрд┐рдХрд╛рд░ рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдПред рдпрд╛ рд╕рд┐рд░реНрдл рдЖрдВрдХрдбрд╝реЛрдВ рдХреЛ рджреЗрдЦрдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рд╡рд╛рд▓реЗ USER ред


рдПрдХ рд╕рд░рд▓ рд╕рдорд╛рдзрд╛рди рдирдИ рднреВрдорд┐рдХрд╛рдПрдВ рдмрдирд╛рдирд╛ рд╣реИред
рд▓реЗрдХрд┐рди рдмрдбрд╝реА рдкреНрд░рдгрд╛рд▓рд┐рдпреЛрдВ рдкрд░, рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд╕рд╛рде, рд╣рдо рдЬрд▓реНрджреА рд╕реЗ рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рднреВрдорд┐рдХрд╛рдУрдВ рдореЗрдВ рдЦреЛ рдЬрд╛рдПрдВрдЧреЗ ... рдФрд░ рдпрд╣рд╛рдВ рд╣рдо "рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЕрдзрд┐рдХрд╛рд░" рдЕрдиреБрдорддрд┐рдпреЛрдВ рдХреЛ рдпрд╛рдж рдХрд░рддреЗ рд╣реИрдВред рдЖрд╕рд╛рди рдкреНрд░рдмрдВрдзрди рдХреЗ рд▓рд┐рдП, рд╣рдо рдХрдИ рдЕрдиреБрдорддрд┐рдпреЛрдВ рдХреЗ рд╕рдореВрд╣ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд╕рд╛рде рд╕рдВрд▓рдЧреНрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдХрд┐рд╕реА рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЕрдиреБрдорддрд┐ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рдЕрд╡рд╕рд░ рд╣рдореЗрд╢рд╛ рд╣реЛрддрд╛ рд╣реИред


рдЗрд╕реА рддрд░рд╣ рдХреЗ рд╕рдорд╛рдзрд╛рди рдХрдИ рдорд╣рд╛рди рд╕реЗрд╡рд╛рдУрдВ рдореЗрдВ рдкрд╛рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред AWS, Google рдХреНрд▓рд╛рдЙрдб, SalesForce, рдЖрджрд┐ред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЗрд╕реА рддрд░рд╣ рдХреЗ рд╕рдорд╛рдзрд╛рди рдХрдИ рд░реВрдкрд░реЗрдЦрд╛рдУрдВ рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд▓рд╛рдЧреВ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, Django (рдЕрдЬрдЧрд░)ред


рдореИрдВ рдХреЛрдгреАрдп рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рджреЗрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред (рдЙрд╕реА ToDo App рдХреЗ рдЙрджрд╛рд╣рд░рдг рдкрд░)ред


рдкрд╣рд▓реЗ рдЖрдкрдХреЛ рд╕рднреА рд╕рдВрднрд╛рд╡рд┐рдд рдЕрдиреБрдорддрд┐рдпреЛрдВ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред


рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд


  1. рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХрд╛рд░реНрдп рдФрд░ рдЖрдВрдХрдбрд╝реЗ рд╣реИрдВред
  2. рд╣рдо рдЙрдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХреЗ рд╕рд╛рде рд╕рдВрднрд╛рд╡рд┐рдд рдХреНрд░рд┐рдпрд╛рдУрдВ рдХрд╛ рдирд┐рд░реНрдзрд╛рд░рдг рдХрд░рддреЗ рд╣реИрдВред
    • рдХрд╛рд░реНрдп: рдмрдирд╛рдПрдВ, рдкрдврд╝реЗрдВ, рдЕрдкрдбреЗрдЯ рдХрд░реЗрдВ, рд╣рдЯрд╛рдПрдВ
    • рд╕рд╛рдВрдЦреНрдпрд┐рдХреА: рдкрдврд╝реЗрдВ (рд╣рдорд╛рд░реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдХреЗрд╡рд▓ рджреЗрдЦреЗрдВ)
  3. рднреВрдорд┐рдХрд╛рдУрдВ рдФрд░ рдЕрдиреБрдорддрд┐рдпреЛрдВ рдХрд╛ рдПрдХ рдирдХреНрд╢рд╛ (рдПрдордПрдкреА) рдмрдирд╛рдПрдВ

export const permissionsMap = { todos:{ create:'*', read:'*', update:'*', delete:'*' }, stats:'*' } 

рдореЗрд░реА рд░рд╛рдп рдореЗрдВ рдпрд╣ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдХрд▓реНрдк рд╣реИ, рд▓реЗрдХрд┐рди рдЬреНрдпрд╛рджрд╛рддрд░ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рд╕рд░реНрд╡рд░ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд▓реМрдЯреЗрдЧрд╛:


 export permissions = [ 'todos_create', 'todos_read', 'todos_update', 'todos_delete', 'stas' ] 

рдХрдо рдкрдардиреАрдп, рд▓реЗрдХрд┐рди рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рднреАред


рдпрджрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдкрд╛рд╕ рд╕рднреА рд╕рдВрднрд╛рд╡рд┐рдд рдЕрдиреБрдорддрд┐рдпрд╛рдВ рд╣реИрдВ, рддреЛ рдпрд╣ рд╣рдорд╛рд░рд╛ рдЖрд╡реЗрджрди рдХреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИред


рдЫрд╡рд┐


рдЖрдЗрдП USER рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ, рдпрд╣ рд╡рд╣реА рд╣реИ рдЬреЛ рдЗрд╕рдХреА рдЕрдиреБрдорддрд┐рдпрд╛рдБ рджрд┐рдЦрддреА рд╣реИрдВ:


 export const USERpermissionsMap = { todos:{ read:'*', update:'*', } } 

1) USER рдЖрдБрдХрдбрд╝реЗ рдирд╣реАрдВ рджреЗрдЦ рд╕рдХрддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рдд, рд╡рд╣ рдЖрдБрдХрдбрд╝реЛрдВ рдХреЗ рдкреГрд╖реНрда рдкрд░ рдирд╣реАрдВ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред


рдРрд╕реА рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП, рдХреЛрдгреАрдп рдореЗрдВ рдЧрд╛рд░реНрдб рд╣реИрдВ, рдЬреЛ рд░реВрдЯ рд╕реНрддрд░ ( рдкреНрд░рд▓реЗрдЦрди ) рдореЗрдВ рдкрдВрдЬреАрдХреГрдд рд╣реИрдВред


рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:


 const routes: Routes = [ // {...Other routes}, { path: 'stats', component: TodoStatisticsComponent, canActivate: [ PermissionsGuardService ], data: { permission: 'stats' }, } ]; 

рдЖрдкрдХреЛ рдбреЗрдЯрд╛ рдореЗрдВ рдСрдмреНрдЬреЗрдХреНрдЯ рдкрд░ рдзреНрдпрд╛рди рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдПред


рдкреЗрд░реАрдореЗрдВрд╕ = 'рдЖрдБрдХрдбрд╝реЗ', рдпреЗ рдЕрдиреБрдорддрд┐рдпрд╛рдБ рд╣реИрдВ рдЬреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдкрд╛рд╕ рдЗрд╕ рдкреГрд╖реНрда рддрдХ рдкрд╣реБрдБрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред


рдЖрд╡рд╢реНрдпрдХ рдбреЗрдЯрд╛ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ред рдЕрдиреБрдорддрд┐рдпрд╛рдБ рдФрд░ рдЕрдиреБрдорддрд┐рдпрд╛рдБ рдЬреЛ рдЕрдиреБрдорддрд┐рдпрд╛рдБ рдЧрд┐рдЧрд╛рд░реНрдбрд╕рд░реНрд╡рд┐рд╕ рд╕рд░реНрд╡рд░ рдиреЗ рд╣рдореЗрдВ рджреА рд╣реИрдВ, рдпрд╣ рддрдп рдХрд░реЗрдЧреА рдХрд┐ USER рдХреЛ '/ рдЖрдБрдХрдбрд╝реЗ' рдкреГрд╖реНрда рдкрд░ рдЬрд╛рдиреЗ рджрд┐рдпрд╛ рдЬрд╛рдП рдпрд╛ рдирд╣реАрдВред


 @Injectable({ providedIn: 'root' }) export class PermissionsGuardService implements CanActivate { constructor( private store: Store<any>) { } canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<boolean> | boolean { // Required permission to continue navigation const required = route.data.permission; // User permissions that we got from server const userPerms = this.getPermissions(); // verification const isPermitted = checkPermissions(required, userPerms); if (!isPermitted) { alert('ROUTE GUARD SAYS: \n You don\'t have permissions to see this page'); } return isPermitted; } getPermissions() { return localStorage.get('userPermissions') } } 

рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдирд┐рд░реНрдгрдп рддрд░реНрдХ рд╣реЛрддрд╛ рд╣реИ - рдХреНрдпрд╛ USER (userPerms) рдХреА рд╕рднреА рдЕрдиреБрдорддрд┐рдпреЛрдВ рдореЗрдВ рдПрдХ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рдЕрдиреБрдорддрд┐ (рдЖрд╡рд╢реНрдпрдХ) рдореМрдЬреВрдж рд╣реИред


 export function checkPermissions(required: string, userPerms) { // 1) Separate feature and action const [feature, action] = required.split('_'); // 2) Check if user have any type of access to the feature if (!userPerms.hasOwnProperty(feature)) { return false; } // 3) Check if user have permission for required action if (!userPerms[feature].hasOwnProperty(action)) { return false; } return true; } 

рдЫрд╡рд┐


рдФрд░ рдРрд╕рд╛ рд╣реИред рд╣рдорд╛рд░рд╛ USER рдЖрдВрдХрдбрд╝реЗ рдкреГрд╖реНрда рдкрд░ рдирд╣реАрдВ рдЬрд╛ рд╕рдХрддрд╛ред рд╣рд╛рд▓рд╛рдБрдХрд┐, рд╡рд╣ рдЕрднреА рднреА рдХрд╛рд░реНрдп рдмрдирд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдЙрдиреНрд╣реЗрдВ рд╣рдЯрд╛ рд╕рдХрддрд╛ рд╣реИред


USER рдХрд╛рд░реНрдп рдХреЛ рд╣рдЯрд╛рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП, рдпрд╣ рдХрд╛рд░реНрдп рд░реЗрдЦрд╛ рд╕реЗ рд▓рд╛рд▓ (X) рдХреЛ рдирд┐рдХрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реЛрдЧрд╛ред
рдЗрд╕ рдЙрджреНрджреЗрд╢реНрдп рдХреЗ рд▓рд┐рдП рд╣рдо рд╕реНрдЯреНрд░рдХреНрдЪрд░рд▓ рдбрд╛рдпрд░реЗрдХреНрдЯрд┐рд╡ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред


 <!-- Similar to other Structural Directives in angular (*ngIF, *ngFor..) we have '*' in directive name Input for directive is a required permission to see this btn. --> <button *appPermissions="'todos_delete'" class="delete-button" (click)="removeSingleTodo()"> X </button> 

 @Directive({ selector: '[appPermissions]' }) export class PermissionsDirective { private _required: string; private _viewRef: EmbeddedViewRef<any> | null = null; private _templateRef: TemplateRef<any> | null = null; @Input() set appPermissions(permission: string) { this._required = permission; this._viewRef = null; this.init(); } constructor(private templateRef: TemplateRef<any>, private viewContainerRef: ViewContainerRef) { this._templateRef = templateRef; } init() { const isPermitted = checkPermissions(this._required, this.getPermissions()); if (isPermitted) { this._viewRef = this.viewContainerRef.createEmbeddedView(this.templateRef); } else { console.log('PERMISSIONS DIRECTIVE says \n You don\'t have permissions to see it'); } } getPermissions() { localStorage.get('userPermissions') } } 

рдЫрд╡рд┐


рдЕрдм USER DELETE рдмрдЯрди рдирд╣реАрдВ рджреЗрдЦрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА рдирдП рдХрд╛рд░реНрдп рдЬреЛрдбрд╝ рд╕рдХрддрд╛ рд╣реИред


рдПрдХ рдЗрдирдкреБрдЯ рдлрд╝реАрд▓реНрдб рдХреЛ рдирд┐рдХрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП - рд╣рдорд╛рд░реЗ рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдЦрд░рд╛рдм рдХрд░ рджреЗрдЧрд╛ред рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╕рд╣реА рд╕рдорд╛рдзрд╛рди рдЗрдирдкреБрдЯ рдлрд╝реАрд▓реНрдб рдХреЛ disable ред


рд╣рдо рдкрд╛рдЗрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред


 <!-- as a value `permissions` pipe will get required permissions `permissions` pipe return true or false, that's why we have !('todos_create' | permissions) to set disable=true if pipe returns false --> <input class="centered-block" [disabled]="!('todos_create' | permissions)" placeholder="What needs to be done?" autofocus/> 

 @Pipe({ name: 'permissions' }) export class PermissionsPipe implements PipeTransform { constructor(private store: Store<any>) { } transform(required: any, args?: any): any { const isPermitted = checkPermissions(required, this.getPermissions()); if (isPermitted) { return true; } else { console.log('[PERMISSIONS PIPE] You don\'t have permissions'); return false; } } getPermissions() { return localStorage.get('userPermissions') } } 

рдФрд░ рдЕрдм USER рдХреЗрд╡рд▓ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рджреЗрдЦ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдмрджрд▓ рд╕рдХрддрд╛ рд╣реИ (V / X)ред рд╣рд╛рд▓рд╛рдБрдХрд┐, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЕрднреА рднреА рдПрдХ рдФрд░ рдмрдЯрди рд╣реИ рдЬрд┐рд╕реЗ 'рдХреНрд▓рд┐рдпрд░ рдкреВрд░рд╛' рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред


рдорд╛рди рд▓реЗрдВ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЙрддреНрдкрд╛рдж рдкреНрд░рдмрдВрдзрдХ рдЖрд╡рд╢реНрдпрдХрддрд╛рдПрдБ рд╣реИрдВ:


  1. 'рдХреНрд▓рд┐рдпрд░ рдХрдореНрдкреНрд▓реАрдЯреЗрдб' рдмрдЯрди рд╣рд░ рдХрд┐рд╕реА рдХреЛ рдФрд░ рд╣рдореЗрд╢рд╛ рджрд┐рдЦрдирд╛ рдЪрд╛рд╣рд┐рдПред
  2. рдпрд╣ рднреА рдХреНрд▓рд┐рдХ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
  3. рдпрджрд┐ рд╕рдВрдмрдВрдзрд┐рдд рдЕрдиреБрдорддрд┐рдпреЛрдВ рдХреЗ рдмрд┐рдирд╛ USER рдмрдЯрди рджрдмрд╛рддрд╛ рд╣реИ, рддреЛ рдПрдХ рд╕рдВрджреЗрд╢ рджрд┐рдЦрд╛рдИ рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдПред

рд░рдЪрдирд╛рддреНрдордХ рдирд┐рд░реНрджреЗрд╢ рд╣рдорд╛рд░реА рдорджрдж рдирд╣реАрдВ рдХрд░реЗрдЧрд╛, рд╕рд╛рде рд╣реА рд╕рд╛рде рдкрд╛рдЗрдк рднреАред
рдШрдЯрдХ рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рдЕрдиреБрдорддрд┐рдпреЛрдВ рдХреА рдЬрд╛рдБрдЪ рд▓рд┐рдЦрдирд╛ рднреА рдмрд╣реБрдд рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдирд╣реАрдВ рд╣реИред


рд╣рдореЗрдВ рдХреЗрд╡рд▓ рдХреНрд▓рд┐рдХ рдФрд░ рдмрд╛рдзреНрдп рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рдмреАрдЪ рдПрдХ рдЕрдиреБрдорддрд┐рдпреЛрдВ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдирд╛ рд╣реИред


рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рдпрд╣ рд╕рдЬреНрдЬрд╛рдХрд╛рд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд╛рдпрдХ рд╣реИред


 export function Permissions(required) { return (classProto, propertyKey, descriptor) => { const originalFunction = descriptor.value; descriptor.value = function (...args: any[]) { const userPerms = localStorage.get('userPermissions') const isPermitted = checkPermissions(required, userPerms); if (isPermitted) { originalFunction.apply(this, args); } else { alert('you have no permissions \n [PERMISSIONS DECORATOR]'); } }; return descriptor; }; } 

 @Component({ selector: 'app-actions', templateUrl: './actions.component.html', styleUrls: ['./actions.component.css'] }) export class ActionsComponent implements OnInit { @Output() deleteCompleted = new EventEmitter(); constructor() { } @Permissions('todos_delete') public deleteCompleted() { this.deleteCompleted.emit(); } } 

рд╕реНрдкреАрдХрд░ рдПрдХ рдЕрд▓рдЧ рд▓реЗрдЦ рдХреЗ рд▓рд╛рдпрдХ рд╣реИрдВред


рд╣рдорд╛рд░рд╛ рдЕрдВрддрд┐рдо рдкрд░рд┐рдгрд╛рдо:


рдЫрд╡рд┐


рдкрд░рд┐рдгрд╛рдо:


рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╣рдореЗрдВ рдЖрд╕рд╛рдиреА рд╕реЗ рдФрд░ рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рд╣рдорд╛рд░реЗ рдпреВрдПрдХреНрд╕ рдХреЛ рдЙрди рдЕрдиреБрдорддрд┐рдпреЛрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдЬреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдкрд╛рд╕ рд╣реИред


рдФрд░ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдЗрд╕рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ hammer * рдПрдирдЬреАрдЖрдИрдПрдл тАЩрдЯреЗрдореНрдкреНрд▓реЗрдЯ рдореЗрдВ рд╕рднреА рдХрдВрдкреЛрдиреЗрдВрдЯреНрд╕ рдпрд╛ рд╣реИрдорд░ рдХреЛ рд╕реЗрд╡рд╛рдПрдВ рджреЗрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред


рдкреВрд░рд╛ рдЖрд╡реЗрджрди рдкреВрд░рд╛ рд╣реЛ рдЧрдпрд╛ рд╣реИ ред


рдореБрдЭреЗ рдЯрд┐рдкреНрдкрдгреА рдХрд░рдиреЗ рдореЗрдВ рдЦреБрд╢реА рд╣реЛрдЧреАред

Source: https://habr.com/ru/post/hi439100/


All Articles