我正在尝试开发一个网站,其中导航栏项目取决于登录用户的角色。
正如Patrick Walter在他的blog上建议的那样,我正在考虑创建一个session.js文件,在那里我将存储有关当前用户的信息:他们的用户名和角色。然后我会在nav-bar.js中注入此文件,并为路由创建一个过滤器,用户无权访问。一切正常,直到我点击刷新按钮...实际上,它创建了一个新的会话对象,并且我放弃了前一个中的所有信息存储。
我在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 = '';
};
}
我的最后一个想法是加密角色/用户名并使用浏览器的会话来存储信息。但我想向更有经验的开发人员询问他们对该主题的看法。
感谢您的帮助!
编辑:这是我的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
});
}
}
答案 0 :(得分: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
参数,并应解析您的{{1}错误。之后,在aurelia.use.singleton is not a function.
文件中使用session.js
时,它应该传递您在启动时声明的相同实例。
我还实现了一个单例会话对象来存储用户数据并选择了这个方法,因为依赖依赖注入更方便,而不是总是调用一个方法从cookie中获取用户数据。
答案 1 :(得分:2)
尽管Laurentiu的回答并不差,但有更好的方法可以解决这个问题,而不会增加应用程序的复杂性。
您无需将此指定为单例。此特定函数更适用于边缘情况,在此情况下,您希望在启动之前将特定项目作为单例暴露给依赖项注入容器。
事实上, Aurelia依赖注入框架将所有模块视为单例,除非另有说明。因此,代码应该像你在那里编写一样工作,而不需要配置函数。
我写了一篇深度博客,你可以在这里找到帮助:http://davismj.me/blog/aurelia-auth-pt2/