Защита на основе ролей Angular 15 и сообщение пользователю

Я использую Angular 15, я поддерживаю маршруты пользователей, как показано ниже. Защита работает очень хорошо, но есть небольшая проблема. Страница по-прежнему открывается, если у пользователя нет привилегии «CompanyRole».

Итак, если у пользователя нет авторизации, как я могу заставить console.info(' ') написать сообщение в консоли?

Я исследовал эту ситуацию в течение недели, но я никак не мог решить ее.

приложение-routing.module.ts

    const routes: Routes = [
      {
        path: '', component: AppLayoutComponent,
        children: [
          { path: '', loadChildren: () => import('./applications/components/dashboard/dashboard.module').then(m => m.DashboardModule), canActivate: [RoleGuard], data: {roles: ['DashboardRole', 'AdminRole'] } },
          { path: 'company', loadChildren: () => import('./applications/components/company/company.module').then(m => m.CompanyModule), canActivate: [RoleGuard], data: {roles: ['CompanyRole'] }},
          { path: 'inventory', loadChildren: () => import('./applications/components/inventory/inventory.module').then(m => m.InventoryModule) },
          { path: 'category', loadChildren: () => import('./applications/components/category/category.module').then(m => m.CategoryModule), canActivate: [RoleGuard], data: {roles: ['CategoryRole'] }},
          { path: 'brand', loadChildren: () => import('./applications/components/brand/brand.module').then(m => m.BrandModule), canActivate: [RoleGuard], data: {roles: ['BrandRole'] } }
        ], 
      },

      { path: 'auth', loadChildren: () => import('./applications/components/auth/auth.module').then(m => m.AuthModule)},

      { path: 'notfound', component: NotfoundComponent, canActivate: [RoleGuard]}, //AuthGuard
      { path: '**', redirectTo: '/notfound', canActivate: [RoleGuard]} //AuthGuard
    ];

РольГард

  import { Injectable } from '@angular/core';
  import {ActivatedRouteSnapshot, CanActivate, Router, RouterStateSnapshot, UrlTree} from '@angular/router';
  import {AuthService} from "../service/auth/auth.service";
  import {Observable} from "rxjs";

  @Injectable({
    providedIn: 'root'
  })
  export class RoleGuard {
    constructor(private service: AuthService, private route: Router) {
    }
    
    canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) {
      //if (this.service.IsLoggedIn()) {
        console.info('RoleGuard: login olundu');
        const userRoles = this.service.getRoles();
        console.info(userRoles);

        if (userRoles) {
          // check if route is restricted by role
          const { roles } = route.data;


          if (!roles) {
            // role not authorized so redirect to home page
            //this.route.navigate(['']);
            console.info(roles)
            console.info(roles.includes(userRoles))
            console.info('RoleGuard: user not authorized')
            return false;
          }
          // authorized so return true
          console.info('RoleGuard: user authorized')
          return true;
        }
        console.info('RoleGuard: login değil');
        //this.route.navigate(['auth/login'])
      this.route.navigate(['auth/login'], { queryParams: { returnUrl: state.url } });
        return false;

      //} else {
      //  console.info('RoleGuard: not login');
      //  this.route.navigate(['auth/login'])
      //  return false;
      //}
    }
  }

АутСервис

getRoles() {
  const loginToken = window.sessionStorage.getItem('access_permission_token') || '';
  const _extractedToken=loginToken.split('.')[1];
  const _atobData=atob(_extractedToken);
  const _finalData=JSON.parse(_atobData);
  return _finalData.resource_access.api_inventory.roles;
}

Таким образом приходят роли пользователя, и я перенаправляю их на страницу route-guard, но он продолжает получать «false», несмотря на авторизацию.

  canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) {
  const user = this.service.getRoles();
  if (user) {
    console.info(route.data['roles'])
    console.info(user)

    // check if route is restricted by role
    if (route.data['roles'] && route.data['roles'].indexOf(user) === -1) {
      // role not authorised so redirect to home page

      console.info('false')
      this.route.navigate(['/']);
      return false;
    }
    console.info('true')
    // authorised so return true
    return true;
  }

  // not logged in so redirect to login page with the return url
  this.route.navigate(['auth/login'], { queryParams: { returnUrl: state.url } });
  return false;
  }

Я думаю, что проблема в const { roles } = route.data, вы используете деконструктор, тогда вам нужно сделать const roles = route.data.roles; и в случае необходимости добавить проверку || роли.длина === 0; Дайте мне знать

Den 06.04.2023 10:03
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Angular и React для вашего проекта веб-разработки?
Angular и React для вашего проекта веб-разработки?
Когда дело доходит до веб-разработки, выбор правильного front-end фреймворка имеет решающее значение. Angular и React - два самых популярных...
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Мы провели Twitter Space, обсудив несколько проблем, связанных с последними дополнениями в Angular. Также прошла Angular Tiny Conf с 25 докладами.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
Мое недавнее углубление в Angular
Мое недавнее углубление в Angular
Недавно я провел некоторое время, изучая фреймворк Angular, и я хотел поделиться своим опытом со всеми вами. Как человек, который любит глубоко...
Освоение Observables и Subjects в Rxjs:
Освоение Observables и Subjects в Rxjs:
Давайте начнем с основ и постепенно перейдем к более продвинутым концепциям в RxJS в Angular
0
1
70
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Предполагая, что пользователи получат доступ к маршруту, если у них есть какая-либо из ролей, которыми защищен маршрут. Вы можете попробовать что-то вроде

 export class RoleGuard {
        constructor(private service: AuthService, private route: Router) {
        }
        
        canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) {     
            const roles  = route.data.roles;//make sure you are getting the roles here
            if (!roles.length){
              return true; //no role applied on route so just return true
            } 
            const userRoles = this.service.getRoles();
            let isAuthrised=!!userRoles?.length && roles.some(r=>userRoles.includes(r))
            if (isAuthrised) {
              // authorized so return true
              console.info('RoleGuard: user authorized')
              return true;
            }
            console.info('RoleGuard: login değil');
            this.route.navigate(['auth/login'], { queryParams: { returnUrl: state.url } });
            return false;
    }
  

прочитайте комментарий, а затем напишите ответ... хорошая работа

Den 06.04.2023 10:37

@Den не уверен, что вы пытаетесь сказать здесь !!userRoles?.length && roles.some(r=>userRoles.includes(r)) Это строка, которая выполняет основную проверку, также могут быть тысячи людей, которые могут думать так же, поэтому нет необходимости, если кто-то включает часть вашего комментария, скопирован, это может быть есть и собственное мышление

jitender 06.04.2023 10:43

Другие вопросы по теме