Aurelia:如何管理会话
Aurelia: how to manage sessions
我正在尝试开发一个网站,其中的导航栏项目取决于登录用户的角色。
正如 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 = '';
};
}
我最后的想法是加密 role/username 并使用浏览器的会话来存储信息。但我想向更有经验的开发人员询问他们对该主题的看法。
感谢您的帮助!
编辑: 这是我的 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
});
}
}
在主入口点(假设它是 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)
时,它应该传递您在启动时声明的相同实例。
我还实现了一个单例会话对象来存储用户数据,并选择了这种方法,因为依赖注入比总是调用方法从 cookie 中获取用户数据更方便。
尽管 Laurentiu 的回答还不错,但有更好的方法来处理这个问题,不会增加您的应用程序的复杂性。
您不需要将其指定为单例。这个特殊的功能更适用于边缘情况,在这种情况下,您希望在启动前将特定项目作为单例公开给依赖项注入容器。
事实上,Aurelia 依赖注入框架将所有模块视为单例,除非另有说明。因此,代码应该像您在那里编写的那样工作,没有配置功能。
我写了一篇深入的博客,您可能会发现这里有帮助:http://davismj.me/blog/aurelia-auth-pt2/
我正在尝试开发一个网站,其中的导航栏项目取决于登录用户的角色。
正如 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 = '';
};
}
我最后的想法是加密 role/username 并使用浏览器的会话来存储信息。但我想向更有经验的开发人员询问他们对该主题的看法。
感谢您的帮助!
编辑: 这是我的 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
});
}
}
在主入口点(假设它是 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)
时,它应该传递您在启动时声明的相同实例。
我还实现了一个单例会话对象来存储用户数据,并选择了这种方法,因为依赖注入比总是调用方法从 cookie 中获取用户数据更方便。
尽管 Laurentiu 的回答还不错,但有更好的方法来处理这个问题,不会增加您的应用程序的复杂性。
您不需要将其指定为单例。这个特殊的功能更适用于边缘情况,在这种情况下,您希望在启动前将特定项目作为单例公开给依赖项注入容器。
事实上,Aurelia 依赖注入框架将所有模块视为单例,除非另有说明。因此,代码应该像您在那里编写的那样工作,没有配置功能。
我写了一篇深入的博客,您可能会发现这里有帮助:http://davismj.me/blog/aurelia-auth-pt2/