Angular2 сохраняет конфиденциальную информацию после обновления браузера

Мое действие входа в систему возвращает информацию о вошедшем в систему пользователе, является ли он администратором или нет, скажем, (isAdmin: true) я могу хранить эту информацию между компонентами до обновления браузера или аналогичного действия. Но я теряю эту информацию после обновления браузера. Я запутался, как сохранить это значение.

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

Есть ли способ сделать это с помощью angular2?


person Philip John    schedule 05.04.2017    source источник
comment
вы можете хранить эти данные в службе, поскольку службы являются синглтонами, они должны длиться до тех пор, пока загружено приложение.   -  person Ofer Herman    schedule 05.04.2017
comment
@OferHerman Да. Я оставлю это в сервисе для инъекций. Но я видел, что это длится до тех пор, пока обновляется браузер.   -  person Philip John    schedule 05.04.2017
comment
Я столкнулся с той же проблемой. Ты нашел решение, @PhilipJohn?   -  person Max Bertoli    schedule 23.05.2017
comment
@MaxBertoli Пожалуйста, проверьте принятый ответ ниже. Вы можете хранить данные в компоненте после получения из API и передавать их конструкторам компонентов. После обновления браузера этот компонент должен снова обновить конфиденциальные данные с помощью вызова API.   -  person Philip John    schedule 23.05.2017
comment
Спасибо @PhilipJohn, у меня уже есть пункты 1 и 2, я создал серверную функцию isAdmin, но не передал ей токен. Я попробую, и я надеюсь, что это обновит пользовательский интерфейс моего компонента.   -  person Max Bertoli    schedule 23.05.2017


Ответы (4)


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

Когда вы входите в систему, сгенерируйте токен, сохраните его в сеансе и отправьте вместе с вызовом API, о котором я упоминал ранее.

Это был бы мой подход:

  1. Логин -> сгенерировать токен
  2. Хранить токен
  3. Вызов API для получения токена передачи информации о пользователе (инициализация в приложении)

Надеюсь, это поможет или, по крайней мере, даст вам несколько ценных идей... Дайте нам знать, как вы решили свою проблему! :D

person SrAxi    schedule 05.04.2017
comment
Истинный. Это лучшее решение. Но я бы хранил информацию в сервисе для инъекций до тех пор, пока информация не будет потеряна или не обновится браузер. Вызов API каждый раз при загрузке компонента довольно затратен! - person Philip John; 05.04.2017
comment
@PhilipJohn Нет, мой хороший друг! Вы вызываете API только один раз. Сохраните эти данные в объекте, а затем поделитесь этими данными с общей службой. Вы делаете 1 звонок, но используете информацию во всех приложениях. Установите этот shared services для связи между компонентами: angular. io/docs/ts/latest/поваренная книга/ - person SrAxi; 05.04.2017
comment
@PhilipJohn при обновлении браузера, все данные, передаваемые через общие службы, удаляются. Как я могу предотвратить это? - person Nick; 15.11.2017
comment
@PhilipJohn Ты не можешь. Или вы где-то сохраняете данные (sessionStorage, localStorage, куки), или вы запускаете методы onInit(), и поэтому прослушиватели будут запускаться, и все данные будут присутствовать при инициализации компонентов. - person SrAxi; 16.11.2017

Вы не можете доверять клиенту. Вы можете создать службу API, которая возвращает логическое значение, если этот пользователь является администратором, и проверить его, если значение isAdmin не установлено.

person Nick    schedule 05.04.2017
comment
Вы бы делали этот вызов API при каждом изменении маршрута, если используете защиту? нужно где-то хранить - person Ofer Herman; 05.04.2017

sessionStorage и localStorage должны обновляться последней страницей по дизайну

в то время как данные, хранящиеся в localStorage, не имеют установленного срока действия, данные, хранящиеся в sessionStorage, очищаются, когда сеанс страницы заканчивается. Сеанс страницы длится до тех пор, пока открыт браузер, и сохраняется после перезагрузки и восстановления страницы.

Вы должны получить данные из API и сохранить их в службе, поскольку служба является одноэлементной, это означает, что она будет доступна на время работы приложения и не будет сохраняться.

import { Injectable } from '@angular/core';
import {Http} from 'angular2/http';
import {Observable} from 'rxjs/Observable';

@Injectable()
export class StorageService {
    private _isAdmin = null;

    constructor(private http: Http) {}

    public get isAdmin() {
            // If we need to fetch the data
            if (_isAdmin === null) {
              return this.http.get('https://myapi.myserver.com')
                   .map((response) => response.json().isAdmin)
                   .do(isAdmin: boolean) { this._isAdmin = isAdmin);
            })
            return Observable.of(this._isAdmin);
    }
}

Вы также можете использовать angular-redux или другую библиотеку хранения, если вам нужно хранить больше, чем только это бит данных

person Ofer Herman    schedule 05.04.2017
comment
Но остается ли это даже после обновления браузера? Я не могу хранить эту информацию в localStorage или sessionStorage, так как это конфиденциально. Я буду использовать эту информацию в сервисе Injectable и вызывать API для каждого обновления браузера, как сказал @Nick. Думаю, это лучшее решение моей проблемы. В любом случае спасибо! - person Philip John; 05.04.2017
comment
он не останется после обновления, вам нужно будет получить его снова. см. примечание в геттере. - person Ofer Herman; 05.04.2017

Я сохранил профиль пользователя в localStorage и подписался на события роутера. Затем я зарегистрировал события и выбрал начальное событие маршрута, с которым у меня возникли проблемы. Когда происходит событие, я сбрасываю профиль пользователя из localStorage, который удовлетворяет моим проверкам AuthGuard. Теперь в любое время, когда я обновляюсь, мои данные все еще там, и меня не выгоняют из защищенных маршрутов.

person Keith Powers    schedule 08.05.2017