Squeak.ru - шаблоны программирования

Как скрыть ссылку с помощью Guard angular2

Как скрыть ссылку администратора в представлении html. Я должен охранять: администратор и менеджер

Конфиг роутера:

{
   path: 'manager',
   component: ManagerComponent,
   canActivate: [ManagerGuard]
},
{
   path: 'user',
   component: UserAdminComponent,
   canActivate: [AdminGuard]
}

С учетом :

 <li>
    <a routerLink="/user" routerLinkActive="active-link">User</a>
 </li>

Я хочу скрыть ссылку на /user для ManagerGuard, но показать ее для AdminGuard.

09.11.2016

Ответы:


1

Кроме того, если я уже ответил таким образом, который может быть полезен, я использовал здесь другой подход. Поскольку у вас уже есть метод canActivate в Guard, вы также можете внедрить свой навигационный компонент с этим Guards и вызвать эти методы canActivate напрямую:

В вашем компоненте, который содержит навигацию

constructor(private adminGuard: AdminGuard)

а потом в шаблоне

<li *ngIf="adminGuard.canActivate()">
  <a routerLink="/user" routerLinkActive="active-link">User</a>
</li>

Изменить

В моем случае это не работает в режиме prod (если вы используете параметры, которые необходимо вводить). Я только что попытался скомпилировать его, но angular жалуется на отсутствующие параметры. Если вы не используете параметры, это работает нормально, или, если вы не используете параметры в своей функции, то просто проходите

<li *ngIf="adminGuard.canActivate(null,null)">
  <a routerLink="/user" routerLinkActive="active-link">User</a>
</li>

Еще одно: если в шаблоне есть такие переменные, как «adminGuard» выше, они должны быть общедоступными, а не частными.

16.05.2017
  • Это отличное решение. Что, если ваш метод canActivate использует параметры? например canActivate(маршрут: ActivatedRouteSnapshot, состояние: RouterStateSnapshot). Как вы получаете указанные параметры маршрута в шаблон? 23.06.2017
  • Я просто споткнулся об это. Если вы пытаетесь создать свое приложение в режиме prod, оно жалуется на эти отсутствующие параметры. Я проверю, возможно ли в любом случае достичь этой цели. 19.07.2017
  • В итоге я написал свою собственную пользовательскую директиву, которая в основном заменяет ваш *ngIf. Поскольку я использую параметры, я не могу вызывать их напрямую, поэтому мне приходится дублировать логику везде, где мне нужно применять разрешения, например. *showForRoles=[UserTypes.Admin, UserTypes.SuperUser] 20.07.2017
  • Запрос функции здесь: github.com/angular/angular/issues/25342 многие люди перенаправляют на охранников, что может привести к тому, что все будет работать не так, как ожидалось. Решение здесь правильное, но в защиту можно добавить дополнительные аргументы (как я показываю в запросе функции), чтобы позволить ему работать с перенаправлением или нет. 17.01.2019

  • 2

    На мой взгляд, это никак не связано с самим роутером.

    Ваши Guards могут вызывать другую службу, у которой есть информация о том, какой пользователь вошел в систему: Admin или Manager.

    Вы должны создать службу, которая знает тип пользователя. Затем внедрите этот сервис с помощью внедрения зависимостей в свой компонент, где у вас есть routerLink.

    Там вы можете задать сервис и переключить ссылку с *ngIf:

    <li *ngIf="myService.getCurrentUser().isAdmin()">
        <a routerLink="/user" routerLinkActive="active-link">User</a>
    </li>
    

    Таким образом, служба предоставляет функцию, которая дает вам пользователя, который в данный момент вошел в систему, а isAdmin()-функция пользователя возвращает true или false. Если пользователь является администратором, то будет отображаться <li>, в противном случае он будет скрыт.

    Это всего лишь пример, но я надеюсь, что вы поняли суть. Это больше связано с базовой функциональностью Angular 2, чем с маршрутизатором Angular 2. Дополнительную информацию о *ngIf можно найти здесь.

    09.11.2016
  • Я согласен, что имеет смысл использовать логику внутри вашего сервиса вместо Guard. Guard предназначен для защиты компонента от несанкционированного доступа. Он может включать в себя некоторые другие функции, такие как переход на запрещенную страницу. 18.10.2017
  • Новые материалы

    Угловая структура архитектуры
    Обратите внимание, что эта статья устарела, я решил создать новую с лучшей структурой и с учетом автономных компонентов: https://medium.com/@marekpanti/angular-standalone-architecture-b645edd0d54a..

    «Данные, которые большинство людей используют для обучения своих моделей искусственного интеллекта, поставляются со встроенным…
    Первоначально опубликовано HalkTalks: https://hacktown.com.br/blog/blog/os-dados-que-a-maioria-das-pessoas-usa-para-treinar-seus-modelos-de-inteligencia-artificial- ja-vem-com-um-vies-embutido/..

    Сильный ИИ против слабого ИИ: различия парадигм искусственного интеллекта
    В последние годы изучению и развитию искусственного интеллекта (ИИ) уделяется большое внимание и прогресс. Сильный ИИ и Слабый ИИ — две основные парадигмы в области искусственного интеллекта...

    Правильный способ добавить Firebase в ваш проект React с помощью React Hooks
    React + Firebase - это мощная комбинация для быстрого и безопасного создания приложений, от проверки концепции до массового производства. Раньше (знаете, несколько месяцев назад) добавление..

    Создайте API с помощью Python FastAPI
    Создание API с помощью Python становится очень простым при использовании пакета FastAPI. После установки и импорта вы можете создать приложение FastAPI и указать несколько конечных точек. Каждой..

    Веселье с прокси-сервером JavaScript
    Прокси-серверы JavaScript — это чистый сахар, если вы хотите создать некоторую общую логику в своих приложениях, чтобы облегчить себе жизнь. Вот один пример: Связь клиент-сервер Мы..

    Получить бесплатный хостинг для разработчиков | Разместите свой сайт за несколько шагов 🔥
    Статические веб-сайты — это веб-страницы с фиксированным содержанием и его постоянным содержанием. Но теперь статические сайты также обрабатывают динамические данные с помощью API и запросов...