Получить данные о маршруте с помощью URL маршрута - PullRequest
0 голосов
/ 17 октября 2018

Я хотел создать систему разрешений, в которой я сохранил все разрешения, которые должен иметь пользователь для доступа к определенному URL.

Примерно так:

{ path: '/path/to/page', canActivate: [CustomGuard], data: {'permissions': ['can_edit','can_delete']}}

Guard работаетхорошо, я могу получить доступ к данным маршрута через там.Но теперь я хочу скрыть некоторые элементы из меню, основываясь на этих разрешениях.

Поэтому я думал о создании метода, который получает URL (/path/to/page), а затем сравнивает разрешения пользователя с разрешениями маршрута,Примерно так:

canAccess(url: string) {
    const data = getRouteData(url); // I need this method
    return compare(this.userPermissions, data['permissions']) // true or false
}

Но я до сих пор не нашел, как получить доступ к данным маршрута из URL.Мне действительно нужна помощь!

Ответы [ 2 ]

0 голосов
/ 17 октября 2018

То, что вы можете использовать, это Resolver , в основном он помогает вам перед фактической маршрутизацией на маршрут обрабатывать то, что вы хотите, прежде чем что-то делать.Поэтому, в основном, добавьте Службу в резольвер, а затем используйте ту же услугу в используемом вами компоненте Меню.

ОБНОВЛЕНИЕ

Как описано в комментариях, что вы можете затем в своемguard просто внедряет вашу службу разрешений, как показано в следующем примере (обратите внимание на службы в конструкторе):

@Injectable()
export class AuthGuardService implements CanActivate {

    constructor(private userPermissions: PermissionService, private router: Router) { }

    canActivate() {


        if (compare(this.userPermissions.permissions, route.config.data.permissions) ) {

            return true;
        }

        return false;
    }

    private compare(userPermissions:any, routePermissions): boolean {
        // compare permissions and return true or false
    }
}

Затем, чтобы прочитать разрешения после завершения маршрутизации, используйте службу Router, внедренную в ваш компонент или службу, подобную этой

@Component({
  selector: 'app-page1',
  templateUrl: './page1.component.html',
  styleUrls: ['./page1.component.css']
})
export class Page1Component implements OnInit {

  public permissions: Data;

  constructor(private route: Router) {
   }

  ngOnInit() {
    this.permissions = this.route.config[1].data.permissions;
  }

}

вот стек стека для просмотра в действии

0 голосов
/ 17 октября 2018

Вы можете получить доступ к массиву маршрутов, используя Router:

  constructor(router: Router) {
    console.log(router.config);
  }

Там вы можете прочитать атрибут data.Однако этот подход не будет работать для лениво загруженных модулей.Кроме того, вам придется сопоставлять URL самостоятельно.

Afaik Нет способа получить эту информацию от маршрутизатора.Вместо этого я бы предложил вам внедрить систему разрешений, которую могут использовать как охранники, так и директивы, скрывающие / показывающие ссылки.

Или используйте существующее решение, например ngx-permissions

...