Aurelia:如何管理会话

Gpa*_*ack 8 aurelia aurelia-navigation

我正在尝试开发一个网站,其中导航栏项目取决于登录用户的角色.

正如Patrick Walter在他的博客上建议的那样,我正在考虑创建一个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 = '';
    };
}
Run Code Online (Sandbox Code Playgroud)

我的最后一个想法是加密角色/用户名并使用浏览器的会话来存储信息.但我想向更有经验的开发人员询问他们对该主题的看法.

谢谢你的帮助!

编辑:这是我的session.js代码

export class Session {
    username = '';
    role = '';
    reset() {
        console.log('Resetting session');
        this.username = '';
        this.role = '';
    };
}
Run Code Online (Sandbox Code Playgroud)

这就是我注入它的方式:

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
        });
    }
}
Run Code Online (Sandbox Code Playgroud)

Lau*_*ate 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>
Run Code Online (Sandbox Code Playgroud)

这会导入整个aurelia环境,因此当它到达时export function configure(aurelia) { ... }它应该传递一个类型的实例Aurelia并将其绑定到aurelia参数并应解决您的aurelia.use.singleton is not a function.错误.之后,在您session.js使用@inject(Session)它的文件中应传递您在启动时声明的相同实例.

我还实现了一个单例会话对象来存储用户数据,并选择了这种方法,因为依赖依赖注入更方便,而不是总是调用一个方法来从cookie中获取用户数据.