首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Aurelia:如何管理会话

Aurelia:如何管理会话
EN

Stack Overflow用户
提问于 2015-08-19 02:37:21
回答 2查看 2.9K关注 0票数 8

我试图开发一个网站,其中导航栏项目取决于用户的角色,谁是登录。

正如Patrick在他的博客上建议的那样,我正在考虑创建一个session.js文件,在该文件中存储关于当前用户的信息:他们的用户名和角色。然后,我将该文件注入nav-bar.js,并为用户无法访问的路由创建一个筛选器。一切正常直到我按下刷新按钮..。实际上,它创建了一个新的会话对象,而我在前一个中丢失了所有的信息存储。

我在文档中看到了单例方法,但我不知道如何使用它。如果我将它插入我的代码中,如下面所示,我将得到消息:aurelia.use.singleton is not a function

代码语言:javascript
复制
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代码

代码语言:javascript
复制
export class Session {
    username = '';
    role = '';
    reset() {
        console.log('Resetting session');
        this.username = '';
        this.role = '';
    };
}

我就是这样注射的:

代码语言:javascript
复制
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
        });
    }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-08-21 00:59:27

在主入口点(假设它是index.html),您应该有如下内容:

代码语言:javascript
复制
<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中获取用户数据更方便。

票数 5
EN

Stack Overflow用户

发布于 2015-09-22 16:45:50

尽管Laurentiu的回答不错,但是有更好的方法可以解决这个问题,这不会增加应用程序的复杂性。

您不需要将此指定为单例。这个特定的函数更适合边缘情况,在启动之前,您希望将特定项作为单例公开给依赖项注入容器。

事实上,-- Aurelia依赖注入框架--除非另有规定,否则将所有模块视为单例。因此,如果没有配置函数,代码就应该像您在这里编写的那样工作。

我写了一个深入的博客,你可以在这里找到有帮助的:http://davismj.me/blog/aurelia-auth-pt2/

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32085649

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档