Отображать имя пользователя и роль на каждой странице Angular 2

Я новичок в angular 2; У меня есть приложение, и я хочу отображать текущее имя пользователя и назначенную роль в моем компоненте заголовка на каждой странице в моем приложении. У меня есть:

  • user-model (пользовательский интерфейс с необходимыми для отображения полями, такими как имя пользователя, роль и имя человека)
  • user-service (класс службы для вызова конечной точки REST для получения данных из нашей системы аутентификации

Я могу легко получить информацию о пользователе из входа в систему, она выглядит как действительный JSON, но как мне отобразить ее на каждой странице (компонентах) БЕЗ необходимости вызывать мою службу для каждого отдельного компонента? В идеале, после страницы входа заголовок или начальный компонент загружает пользовательский объект и внедряет или передает его всем последующим компонентам, поэтому пользовательский объект сохраняется (из-за отсутствия лучшего слова) от компонента к компоненту, поэтому выполняется только 1 HTTP-вызов. требуется при загрузке приложения.

По сути, я ищу лучший, наиболее рациональный подход к этому. Это кажется распространенным сценарием, но большинство людей, которых я читал, которые пишут ответы, связанные с этим, говорят, что нужно вызывать службу в каждом компоненте. Это будет означать, что вызов конечной точки API инициируется при каждой загрузке страницы? Можем ли мы сохранить эти данные в сеансе или файле cookie?

Спасибо!


person J-man    schedule 26.06.2017    source источник
comment
Если бы я вручную сгенерировал действительный объект пользователя и сохранил его в файлах cookie, я мог бы притвориться кем-то другим?   -  person Nope    schedule 26.06.2017
comment
Насколько я понимаю... ваш компонент заголовка (например, навигационная панель) должен быть частью некоторого основного модуля, который будет загружен только один раз и будет содержать вызов службы для получения текущего пользователя, вошедшего в систему. Так. будет только один вызов API, чтобы получить текущего пользователя, вошедшего в систему, когда приложение загружается. Дайте мне знать, если мой комментарий имеет смысл.   -  person mrsan22    schedule 26.06.2017
comment
@Fran, потенциально да, кто-то может манипулировать файлом cookie, чтобы имитировать кого-то другого (довольно легко), я бы предпочел держаться подальше от этого. Хорошо то, что любая информация о файлах cookie, которую я бы сохранил (гипотетическая), не имеет ценности, кроме имени и отображения роли, реальные данные поступают из защищенной конечной точки API. Заголовок просто отображает общую информацию о пользователе и никак не транспонируется в приложение.   -  person J-man    schedule 26.06.2017
comment
@ mrsan22, да, ваш комментарий имеет смысл. Я это подозревал. Хитрость заключалась в том, чтобы переместить этот пользовательский объект вместе с другими компонентами, либо передав его в качестве аргумента конструктора, либо каким-либо общедоступным свойством.   -  person J-man    schedule 26.06.2017


Ответы (1)


Вы можете создать сервис, который удерживает вашего пользователя. У меня есть пример: https://github.com/DeborahK/Angular-Routing

Вот один из его фрагментов:

import { Injectable } from '@angular/core';

import { IUser } from './user';
import { MessageService } from '../messages/message.service';

@Injectable()
export class AuthService {
    currentUser: IUser;
    redirectUrl: string;

    constructor(private messageService: MessageService) { }

    isLoggedIn(): boolean {
        return !!this.currentUser;
    }

    login(userName: string, password: string): void {
        if (!userName || !password) {
            this.messageService.addMessage('Please enter your userName and password');
            return;
        }
        if (userName === 'admin') {
            this.currentUser = {
                id: 1,
                userName: userName,
                isAdmin: true
            };
            this.messageService.addMessage('Admin login');
            return;
        }
        this.currentUser = {
            id: 2,
            userName: userName,
            isAdmin: false
        };
        this.messageService.addMessage(`User: ${this.currentUser.userName} logged in`);
    }

    logout(): void {
        this.currentUser = null;
    }
}

Ключевой частью для вас является свойство currentUser.

ПРИМЕЧАНИЕ. Это пример приложения, поэтому информация о пользователе жестко запрограммирована. Вам нужно будет получить фактические данные.

ОБНОВЛЕНИЕ: при доступе к currentUser из компонента обязательно используйте геттер. Это гарантирует, что вы всегда получите текущее значение, если оно будет изменено. Я получаю доступ к имени текущего пользователя в моем MenuComponent, поэтому код выглядит так:

  get userName(): string {
    return this.authService.currentUser.userName;
  }

Если вам нужен весь пользовательский экземпляр, используйте что-то вроде этого:

  get user(): IUser {
    return this.authService.currentUser;
  }
person DeborahK    schedule 26.06.2017
comment
Превосходно. Я попробую этот вариант. В качестве альтернативы я вызываю свой класс обслуживания в качестве поставщика внутри моего файла app.ts, а в компоненте заголовка я извлекаю экземпляр службы из аргумента конструктора и вызываю функцию, которая получает пользовательские данные, а затем просто отображаю эти значения. в HTML заголовка. Это работает, но не уверен, что это правильный способ сделать это. - person J-man; 26.06.2017
comment
У меня есть аналогичный случай в Angular5. У меня есть зарегистрированное имя пользователя, доступное в AuthenticateService. У меня есть отдельный компонент для отображения сведений о пользователе в заголовке. Этот компонент не обновляется и не отображает новое имя пользователя, если я не обновлю браузер. Я даже пытался вызвать ngOnInit() компонента заголовка после успешного входа в систему. Любая помощь? - person Jay; 13.04.2018
comment
Использует ли ваш компонент геттер для доступа к пользовательскому свойству? Или простое пользовательское свойство? См. обновление к моему ответу выше для примера кода геттера. - person DeborahK; 13.04.2018