Скрытие необходимых пунктов меню для конкретного пользователя в angular 2

Я создал приложение angular, в котором у меня есть форма входа, в которой я реализовал аутентификацию с использованием службы и защиты.

Я определил пользователя интерфейса с именем пользователя и паролем. Используя этот интерфейс в authentication.service.ts, я определил двух пользователей: admin и user.

Я также реализовал защиту с именем authentication.guard.ts, где я использовал CanActivate RouteGaurd, чтобы направить пользователя на страницу, к которой он может получить доступ.

В моем приложении есть страница администратора, к которой может получить доступ только пользователь admin, поэтому, если администратор входит только тогда, он переходит на страницу администратора. Если пользователь войдет в систему, затем он будет перенаправлен на главную страницу, пропустив страницу администратора.

Когда администратор или пользователь входит в приложение, появляется строка меню, в которой есть три пункта: Главная, AdminActivity, RegisterUser.

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

Я попытался импортировать службу аутентификации в app.component.ts, но не могу получить зарегистрированное имя пользователя и пароль.

Может ли кто-нибудь помочь мне в реализации желаемой функциональности, которую мне нужно было реализовать в моем приложении

Пожалуйста, откройте мой образец приложения здесь


person Heena    schedule 04.08.2018    source источник
comment
Ссылка на Stackblitz не работает.   -  person Krishna Rathore    schedule 04.08.2018
comment
да, я пытался решить, но я застрял   -  person Heena    schedule 04.08.2018
comment
пожалуйста, посоветуйте мне, как я могу реализовать эту функциональность .....?   -  person Heena    schedule 04.08.2018
comment
имя пользователя сохраняется в локальном хранилище?   -  person Abdul Rafay    schedule 04.08.2018
comment
@AbdulRafay ..... да ..... как показано в authentication.service.ts .......... let authenticatedUser = users.find (u = ›u.username === this.user .имя пользователя); если (AuthenticatedUser && authenticatedUser.password == this.user.password) {localStorage.setItem (пользователь, this.user.username); this._router.navigate (['/ Admin']); }   -  person Heena    schedule 04.08.2018
comment
обновите свой код, чтобы проверить пользователя с правами администратора с локальным хранилищем, как: isSuperAdmin () {if (localStorage.getItem ('user') === admin) {return true; } else {вернуть ложь; }}   -  person Abdul Rafay    schedule 04.08.2018
comment
@Heena Пожалуйста, рассмотрите возможность размещения своего кода в своем вопросе, нажав ссылку изменить, расположенную прямо под вашим вопросом.   -  person Edric    schedule 05.08.2018


Ответы (2)


Обновлен образец кода ЗДЕСЬ

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

Изменения в AuthenticationService:

объявил userType BehaviorSubject как:

  userType: BehaviorSubject<string> = new BehaviorSubject<string>(this.getUserType());

добавлен метод для получения типа пользователя из локального хранилища как:

  getUserType() {
    return localStorage.getItem('user')
  }

обновление userType BehaviorSubject в логине:

login(username, password) {
...
localStorage.setItem("user", this.user.username);
this.userType.next(this.user.username);

Изменения в app.componet.ts:

подписавшись на userType BehaviorSubject:

  userType: string = '';

  ngOnInit(){
    ...
    this.authService.userType.subscribe(value => this.userType = value);
  }

Изменения в app.componet.html:

показать / скрыть пункты меню с *ngIf:

  <button *ngIf="userType === 'admin'" mat-raised-button routerLink='application/AdminAccess/admin-activity' routerLinkActive="active">Admin Activity </button>

  <button *ngIf="userType === 'user'" mat-raised-button routerLink='application/UserManagement/add-users' routerLinkActive="active">Register User</button>
person Abdul Rafay    schedule 04.08.2018
comment
Большое спасибо за ваш отзыв ... он работает именно так, как мне было нужно ... Я изменил изменения в моем предыдущем приложении, и оно работает нормально ... еще раз большое спасибо .. - person Heena; 06.08.2018

Поскольку ваш stackbliz не работает, но ниже я хотел бы предоставить полезный код: -

В вашем routing.module.ts измените маршрут «Admin»,

{path:'Admin',component: AdminComponent,
data: {
    authorities: ['ROLE_ADMIN'],
},
canActivate: [AuthenticationGuard]}

В вашем authenticationguard.guard.ts измените, как показано ниже: -

 constructor( private auth: AuthenticationService,  private _router: Router) {} 
    
 

    canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean | Promise<boolean> {

        const authorities = route.data['authorities'];
        // here you get authorities user role name, now you can apply your service logic
         if (!this.auth.isSuperAdmin(authorities)) { // add arg in isSuperAdmin to validate username
      this._router.navigate(['/application/home']);
      return false; 
    }
    
    return true;
    }

Надеюсь, это поможет.

person Gautam    schedule 04.08.2018
comment
спасибо за ваш ответ ... когда я изменяю свой authenticationguard.guard.ts, это приводит к следующей ошибке в моей консоли ... Невозможно вызвать выражение, тип которого не имеет сигнатуры вызова. Тип Boolean не имеет совместимых сигнатур вызовов. - person Heena; 04.08.2018