Бұрыштық - Рөлге және нысан күйіне байланысты рұқсатты қалай тексеруге болады

Қазіргі уақытта сіздің өтініміңіз аутентификация мен авторизация процесінде болуы әдеттегідей. Егер сіз интернеттен авторизация кітапханалары мен әдістерін іздесеңіз, сіз тек рөлге негізделген авторизацияны ұсынатын, бірақ параққа кіруге кедергі келтіретін шешімдерді оңай таба аласыз.Сонымен бірге сізге субъект мәртебесі үшін басқа авторизация қажет.

TL үшін; DR мында демо-коды және демо-коды қолданылады.

Кескін несиелері

Мемлекеттің авторизациясы деген не?

Менің ойымша, бұл постты жазған кезде оны атаудың жақсы ештеңесі болған жоқ. Алайда, менің айтайын дегенім көп немесе аз болуы қазіргі қолданушының ағымдағы мәртебесі X күйіне және басқасына тәуелді болған кезде сіз қазіргі пайдаланушыны белгілі бір әрекетті орындау мүмкіндігіңізден айыруыңыз керек. Кәсіпорын қосылған кезде Y күйін орнатады және ең нашар жағдай сол экранда немесе тіпті сол компонентте болған кезде пайда болды. Рөлдік авторизациясы бар барлық кітапханалар сізді бұл мәселеден құтқарады. Рөлге негізделген беттер шешім қабылдауға кедергі болатын түрлі мақалаларды оқыудан шаршадым және ештеңе ойламай-ақ ойлана және бағдарламалай бастадым. Кенеттен мен төрт бөліктен тұратын қарапайым, күрделі және өте икемді шешім түрін таптым.

  • Ағымдағы пайдаланушы туралы ақпаратты ұсынатын қызмет (шын мәнінде маңыздысы - ағымдағы пайдаланушыға тиесілі немесе қосымшада оларға тағайындалған пайдаланушы рөлдерін анықтау әдісі).
  • Жұмыс процесінің авторизация картасы (JSON файлы)
  • Авторизацияны тексеруді жүзеге асыратын авторизация қызметі
  • Авторизация қызметін тексеру туралы нұсқаулық

1-қадам: Ағымдағы пайдаланушы рөлдерін алыңыз

Сервер жағынан (бірінші рет) немесе сеанстан немесе cookie файлдарынан кейінірек пайдалану үшін алу үшін қызметті іске қосыңыз. Пайдаланушыға дағдылардың (рөлдердің) тізімін беру маңызды.

// Мысал {Аты: «Джон До», электронды пошта: '[email protected]', рөлдер: ['сатушы', 'сатушы_манагер'], <- бұл қатынасТокенге байланысты: 'Хабарлама таратушылар, дианаксесстокенхахаааа!' ... толығырақ
}

Менің жағдайымда ол аз немесе аз көрінеді:

// импорттау ...
@Injectable () экспорттау класы CurrentUserService {жеке userSubject = жаңа ReplaySubject (1); жеке hasUser = жалған; Конструктор (жеке пайдаланушыларApi: UserApi) {} public getUser (): байқалатын {if (! this.hasUser) {this.fetchUser (); } this.userSubject.asObservable () қайтарыңыз; } public fetchUser (): void {this.usersApi.getCurrent () // userInfo .subscribe (пайдаланушы => {// пайдаланушы үшін this.hasUser = true; рөлі берілген рөлдерге ие болу керек) {<. userSubject.next (пайдаланушы); this.userSubject.complete ();}, (қате) => {this.hasUser = жалған; this.userSubject.error (қате;;}); }}

Екінші қадам: жұмыс процесі мен авторизацияға шолу жасаңыз

Бұл әр түрлі нысандармен және өз мемлекеттерімен ағаш құру арқылы біз не істей алатынымызды және кім жасай алатынымызды суреттейтін нәрсе ғана. Мысалы, келесі сату процесін қарастырыңыз: Біздің қосымшамызда бірнеше рөл түрлері болуы мүмкін. Біздің мысалда рөлдерді сатушыға, архитектуралық шешімдерге және тапсырыс берушіге тағайындаймыз.

Бұл процесс туралы сөйлеспеу үшін:

  • Біріншіден, сатушы мүмкіндік мәртебесін құруы мүмкін «Жаңа мүмкіндік қосу» әрекетін орындау арқылы мүмкіндік береді
  • Осы кезде, тапсырыс беруші және сатушы мүмкіндіктер үшін талаптарды қоса алады, осылайша екеуі де талаптар жасалған кезде «Қосу талаптары» әрекетін қолдана алады. Мүмкіндік мәртебесі Ұсынылғанға өзгеруі мүмкін
  • Талаптар орындалғаннан кейін, АРХИТЕКТ шешім қабылдауды қалауы мүмкін, сондықтан әрекет қажет: шешім жүктеліп, мәртебе өзгеруі мүмкін
  • Шешім орналастырылғаннан кейін, тапсырыс беруші оны қабылдауды қалауы мүмкін, сондықтан оны бекіту және күй шешімін бекіту үшін әрекет қажет.

Біз мұндағы процесті қысқартамыз, әйтпесе бұл шамадан тыс артуы мүмкін және бұл оқылымда олай емес. Осы процесті, карта жасауды және мүмкіндік субъектісінің мәртебесін бақылау өрісін құруды негізге ала отырып, біздің жұмыс процесі келесідей болады:

{«Мүмкіндік»: {«addOpportunity»: {«рұқсат етілген рөлдер»: [«SELLER»]}}, «жасалды»: {«addRequidence»: {«рұқсат етілген рөлдер»: [«SELLER», «CLIENT»]}}, « ұсынылған «: {» addSolution «: {» рұқсат етілген рөлдер «: [» ARCHITECT «]}},» шешілді «: {» təsdiqSolution «: {» рұқсатRoles «: [» CLIENT «]}}}}

3-қадам: жұмыс процесі мен авторизацияны шолуды пайдалану үшін авторизацияны тексеру қызметі

Процесті жұмыс процесінде және рұқсат картасын салыстырудан кейін біз оны пайдалану үшін қызметті құрып, пайдаланушының рұқсаты бар немесе жоқтығын тексеруіміз керек. Бұл келесідей көрінуі мүмкін:

// Мұнда нұсқауларды импорттаңыз // Айтпақшы, Angular-Cli-де JSON файлын // Environment.ts ішіне салуға болады
@Injectable () экспорттық класы WorkflowEvents {тек оқуға арналған жеке WORKFLOW_EVENTS = Қоршаған орта ['Жұмыс процесі']; жеке пайдаланушыРөлдері: жиынтығы ;
// 1-қадам есіңізде ме? ол мұнда конструкторда қолданылады (жеке ағымдағыUserService: CurrentUserService) {} // логикалық бақыланатын қоғамдық тексеруді қайтарадыAvtorization (жол: кез келген): Байқалатын {// Біз рөлдерді тек бір рет жүктейміз (! This.userRoles) {return this.currentUserService.getUser () .map (currentUser => currentUser.roles) .do (role => {const role = role.map () role => role.name); this.userRoles = жаңа жиын (рөлдер);}) .map (role => this.doCheckAuthorization (path)); } қайтару Observable.of (this.doCheckAuthorization (жол)); } жеке doCheckAuthorization (жол: жол []): логикалық {егер (жол.length) {const енгізу = this.findEntry (this.WORKFLOW_EVENTS, жол); егер (енгізу және & жазба ['allowRoles'] && this.userRoles.size) {return entry.permissionsRoles .some (allowRole => this.userRoles.has (allowRole)); } false қайтарады; } false қайтарады; }
/ ** * жұмыс жолының картасының жазбаларын жол жолдарының негізінде қайталап іздеңіз * / private findEntry (currentObject: any, key: string [], index = 0) {const key = key [index]; if (currentObject [key] && индексі)

Негізінен, сіз жарамды жазбаны іздеп, қолданыстағы пайдаланушы рөлдерінің рұқсат етілген Ролдарға қосылған-кірмегенін тексеруіңіз керек.

4-файл: Саясат

Бізде қазіргі пайдаланушы рөлдері, жұмыс ағынын авторизациялау ағашы және ағымдағы пайдаланушы рөлдеріне авторизацияны тексеру қызметі болған соң, оны директива арқылы 2/4 бұрышта орындауымыз керек. Бастапқыда мен жазған директива CSS төлсипатын ауыстыратын атрибуттық директива болды. Дегенмен, бұл өнімділікке қатысты мәселелерге әкелуі мүмкін, өйткені DOM-да сақталған компоненттер әлі де жүктелген. Сондықтан құрылымдық директиваларды қолданған дұрыс (менің әріптесім Петё Чолаковқа алғысым шексіз (мұндағы айырмашылықты қараңыз), өйткені пайдаланылмаған элементтердің жүктелуіне жол бермеу үшін біз мақсатты элементтің және оның ұрпақтарының DOM-ын өзгерте аламыз.

@Directive ({Selector: '[appCanAccess]'}) экспорттау класы CanAccessDirective OnInit, OnDestroy {@Input ('appCanAccess') appCanAccess: жол | жол []; жеке рұқсат $: жазылу; Конструктор (жеке шаблонRef: TemplateRef , жеке көрінісContainer: ViewContainerRef, жеке жұмыс процесіEvents: WorkflowEvents) {} ngOnInit (): void {this.applyPermission (); } жеке applyPermission (): void {this.permission $ = this.workflowEvents .checkAuthorization (this.appCanAccess) .subs жазылу (авторландырылған => {егер (авторланған) {this.viewContainer.createEmbeddedView (this.templateRef);} тағы {осы) .viewContainer.clear ();}}); } ngOnDestroy (): жарамсыз {this.permission $ .unsubscribe (); }}

Соңында алынған жұмыс

Енді бізге оны жүзеге асыруға уақыт керек. Біздің HTML шаблонында жасай алатын жалғыз нәрсе - келесі код

Мүмкіндік нысаны бар үлгі компоненті бар делік:

@Component ({селектор: 'sp-pricing-panel', шаблон: ` 
 
 
 
 `}) SampleComponent экспорт класы OnInit {@Input () OpportunityObject: кез келген;
Дизайнер () {} ngOnInit () {}}

Пайдаланушы рөлі мен субъект мәртебесіне негізделген мінез-құлықты білдіретін қарапайым компонент бола алады.

Менің Petyo және Govind әріптестеріме менің дұрыс емес кодтауымды қабылдағаны және сынға алғаны үшін, біздің қажеттіліктерімізге сәйкес келетін шешім таба алдық. Бұл сізге де көмектеседі деп сенемін.

JUN 2018, кішігірім жұмыс үлгісі => https://emsedano.github.io/ng-entity-state/