Аурелия: как управлять сессиями
Я пытаюсь разработать веб-сайт, где элементы навигационной панели зависят от роли пользователя, который вошел в систему.
Как предложил Патрик Уолтер в своем блоге, я подумывал создать файл session.js, в котором я буду хранить информацию о текущем пользователе: его имя пользователя и роль. Затем я вставил бы этот файл в nav-bar.js и создал бы фильтр для маршрутов, к которым у пользователя нет доступа. Все работало нормально, пока я не нажал кнопку обновления... На самом деле, он создает новый объект сеанса, и я теряю все хранилище информации в предыдущем.
Я видел в документах метод синглтона, но я не уверен, как его использовать. Если я вставлю его в мой код, такой как ниже, я получу сообщение: 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 = '';
};
}
Моя последняя идея - зашифровать роль / имя пользователя и использовать сеанс браузера для хранения информации. Но я хотел бы спросить у более опытных разработчиков их мнение по теме.
Спасибо за вашу помощь!
РЕДАКТИРОВАТЬ: Вот мой код для 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
});
}
}
2 ответа
В главной точке входа (давайте предположим, что это 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>
Это импортирует всю среду аурелию и поэтому, когда она достигает export function configure(aurelia) { ... }
он должен передать экземпляр типа Aurelia
и привязать его к aurelia
параметр и должен разрешить ваш aurelia.use.singleton is not a function.
ошибка. После этого в вашем session.js
файл при использовании @inject(Session)
он должен передать тот же экземпляр, который вы объявили при запуске.
Я также реализовал одноэлементный объект сеанса для хранения пользовательских данных и выбрал этот метод, потому что удобнее полагаться на внедрение зависимостей, а не всегда вызывать метод для получения пользовательских данных из файла cookie.
Хотя ответ Laurentiu неплохой, есть лучшие способы справиться с этим, которые не добавляют сложности вашему приложению.
Вам не нужно указывать это как синглтон. Эта конкретная функция больше подходит для крайнего случая, когда вы хотите представить конкретный элемент в контейнере внедрения зависимостей как одиночный перед запуском.
Фактически, структура внедрения зависимостей Aurelia рассматривает все модули как синглтоны, если не указано иное. Таким образом, код должен работать так, как вы его там написали, без функции configure.
Я написал подробный блог, который вы можете найти полезным здесь: http://davismj.me/blog/aurelia-auth-pt2/