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/