2015-08-19 5 views
8

Я пытаюсь разработать веб-сайт, где нав-бар элементы зависят от роли пользователя, вошедшего вAurelia: как управлять сеансами

Как Патрик Уолтер предложил на его blog, я думал. для создания файла session.js, где я буду хранить информацию о текущем пользователе: имя пользователя и роль. Затем я вставляю этот файл в nav-bar.js и создаю фильтр для маршрутов, к которым у пользователя нет доступа. Все работало нормально, пока я не нажал кнопку обновления ... На самом деле он создает новый объект сеанса, и я теряю все хранилище информации в предыдущем.

Я видел в методе singleton docs, но я не уверен, как его использовать. Если я вставляю его в свой код, например, ниже, я получаю сообщение: aurelia.use.singleton is not a function.

import config from './auth-config'; 

export function configure(aurelia) { 
    console.log('Hello from animation-main config'); 
    aurelia.use 
     .singleton(Session) 
     .standardConfiguration() 
     .developmentLogging() 
     .plugin('aurelia-animator-css') 
     .plugin('paulvanbladel/aurelia-auth', (baseConfig) => { 
      baseConfig.configure(config); 
    }); 
    aurelia.start().then(a => a.setRoot()); 
} 

export class Session { 
    username = ''; 
    role = ''; 
    reset() { 
     console.log('Resetting session'); 
     this.username = ''; 
     this.role = ''; 
    }; 
} 

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

Спасибо за помощь!

EDIT: Вот мой код session.js

export class Session { 
    username = ''; 
    role = ''; 
    reset() { 
     console.log('Resetting session'); 
     this.username = ''; 
     this.role = ''; 
    }; 
} 

И это, как я впрыснуть его:

import {Session} from './services/session'; 
@inject(Session) 
export class RoleFilterValueConverter { 
    constructor(session) { 
     console.log('Hello from RoleFilter constructor', session) 
     this.session = session; 
    }; 
    toView(routes, role) { 
     console.log('Hello from view', role, this.session) 
     if (this.session.role == 'Superuser') 
      return routes; 
     return routes.filter(r => { 
      var res = !r.config.role || (r.config.role == this.session.role); 
      return res 
     }); 
    } 
} 

ответ

5

В основной точке входа (давайте предположим, что это index.html) вас должно иметь примерно следующее:

<body aurelia-app="path/to/main"> 
    <script src="jspm_packages/system.js"></script> 
    <script src="config.js"></script> 
    <script> 
     System.import('aurelia-bootstrapper'); 
    </script> 
</body> 

Это импортирует весь запас aurelia, поэтому, когда он достигает export function configure(aurelia) { ... }, он должен передать экземпляр типа Aurelia и привязать его к параметру aurelia и должен решить вашу ошибку aurelia.use.singleton is not a function.. После этого в файле session.js при использовании @inject(Session) он должен передать тот же экземпляр, который вы указали при запуске.

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

2

Хотя ответ Laurentiu не плох, есть лучшие способы справиться с этим, что не добавляет сложности вашему приложению.

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

Фактически, Интерфейс инъекций зависимостей Aurelia рассматривает все модули как одиночные, если не указано иное. Таким образом, код должен работать так, как вы его там написали, без функции configure.

Я написал подробный блог, который вы можете найти здесь: http://davismj.me/blog/aurelia-auth-pt2/

Смежные вопросы