使用Aurelia进行Firebase角色授权

时间:2018-04-17 12:54:03

标签: javascript firebase firebase-authentication aurelia

目前,为避免未登录的用户未经许可进入任何路线,我已设置此课程:

export class AuthorizeStep {
  run(navigationInstruction, next) {
    return new Promise((resolve, reject) => {
      firebase.auth().onAuthStateChanged(user => {
        let currentRoute = navigationInstruction.config;
        let loginRequired = currentRoute.auth && currentRoute.auth === true;

        if (!user && loginRequired) {
          return resolve(next.cancel(new Redirect('')));
        }

        return resolve(next());
      });
    });
  }

这里叫做:

configureRouter(config, router) {
    this.router = router;
    config.title = 'title';

    config.map([
      { route: ['', 'inicio'], name: 'inicio', moduleId: './modules/contacts/components/inicio', title: 'au-samples.contacts.mainPage' },
      { route: 'conta', name: 'conta', moduleId: './modules/admin/conta', title: 'accountMessages.account', auth: true},
      { route: 'contacts', name: 'contacts', moduleId: './modules/contacts/components/list', title: 'au-samples.contacts.contacts', auth: true},
      { route: ':id', name: 'contact-details', moduleId: './modules/contacts/components/details', auth: true },
      { route: ':id/edit', name: 'contact-edition', moduleId: './modules/contacts/components/edition', auth: true },
      { route: ':id/photo', name: 'contact-photo', moduleId: './modules/contacts/components/photo', auth: true }
    ]);
    config.mapUnknownRoutes('not-found');
    config.addPipelineStep('authorize', AuthorizeStep);
  }

所有这一切都运行良好,但我希望有一种方法让我能够提取用户的数据,我有办法去做它的角色(我也可以这样做)在获得对特定路径的访问权之前检查用户是否具有该角色,我想知道是否需要执行另一个类并使用addPipelineStep在我的configureRouter中调用它,或者通过另一种方式启用基于角色的授权检查变量(在这种情况下,如果数组包含单词)。

提前致谢。

1 个答案:

答案 0 :(得分:1)

假设我正确阅读了您的问题并且您能够正确检索用户角色,那么您正在寻找一种方法来根据用户可以拥有的某个角色授权访问某些路线。

使用管道步骤,您可以自由地找出您喜欢的任何实现。您可以在这样的路线上使用settings - 参数:

config.map([
  { 
    route: 'conta', 
    name: 'conta', 
    moduleId: './modules/admin/conta', 
    title: 'accountMessages.account', 
    auth: true,
    settings: {
      role: 'admin' /* or any naming of choice */
    }
  }
]);

然后在管道步骤中,您可以检查此属性并根据用户是否拥有该属性来限制访问:

run(navigationInstruction, next) {
    return new Promise((resolve, reject) => {
      firebase.auth().onAuthStateChanged(user => {
        let currentRoute = navigationInstruction.config;
        let loginRequired = currentRoute.auth && currentRoute.auth === true;

        if (!user && loginRequired) {
          return resolve(next.cancel(new Redirect('')));
        }

        // hasRole checks the user roles for the role set on the route
        if (currentRoute.settings && currentRoute.settings.role) {
           if (!user.hasRole(currentRoute.settings.role) {
              return resolve(next.cancel(new Redirect('')));
           }
        }

        return resolve(next());
      });
    });
  }

您显然可以自由地以您喜欢的方式对此进行编码,这更像是一个普遍的想法。