【问题标题】:How to show an unauthorized view at the requested URL in Aurelia如何在 Aurelia 中请求的 URL 上显示未经授权的视图
【发布时间】:2015-12-12 08:04:41
【问题描述】:

如果在 Aurelia canActivate 方法内,则确定用户不应该能够查看请求的页面。如何在不允许访问的 URL 处向该用户显示“未经授权”页面?

我不想返回 new Redirect("#/unauthorized"),因为这样用户就看不到他们不允许访问的 URL,而且我在 URL 中有一些导航栏状态会丢失。

注意:一个可能的答案可能是“你做错了”。 :)

【问题讨论】:

  • 您是否有理由不只是保存来自 URL 的数据,然后在未经授权的页面中显示该信息?看来您还可以保存 url 中的任何状态以供以后使用。
  • 我们有从 URL 获取状态的导航栏组件,因此我们不想更改 URL 并丢失导航栏状态。如果 URL 没有改变,则导航栏保持其状态,因此用户可以使用它从未经授权的页面快速移动。
  • 但是你不能修改它,让导航栏状态绑定到 ViewModel 的属性而不是 URL 吗?然后,如果 URL 更改,则无关紧要。将导航栏直接绑定到 URL 似乎有点脆弱。
  • 是的,但对我来说,在两个地方维护该状态更为脆弱,因为那样它们可能会不同步。如果 URL 说您在“公司 A”,但导航栏说您在“公司 B”,那就不好了。
  • 好的,只是一个建议。 :)

标签: javascript routing aurelia


【解决方案1】:

您希望在不更改 URL 的情况下显示未经授权的页面。因此,如果用户访问“/restricted-page”并且不允许他们看到它,则显示未经授权的模板而不是实际页面。

为此,如果用户未通过适当的检查,您可以在 canActivate 方法中为 ViewModel 本身设置一个模板值。然后在 ViewModel 上的 getViewStrategy 中检查是否已设置此值并显示该视图,如果没有,则显示您的常规视图。

export class ViewModel {
  viewTemplate = "./view-model.html";

  canActivate(params, routeConfig) {
    if (!canViewPage) {
      this.viewTemplate = "./401-unauthorized.html";
    }
  }

  getViewStrategy() {
    return this.viewTemplate;
  }  
}

为了进一步简化这一点,您可以从canActivate 内部设置getViewStrategy 函数本身。

export class ViewModel {
  canActivate(params, routeConfig) {
    if (!canViewPage) {
      this.getViewStrategy = function() { return "./401-unauthorized.html"; };
    }
  }
}

【讨论】:

  • 我了解授权管道,但我们的应用程序有非常复杂的逐案授权要求。我们想把这些东西放在每个canActivate 方法中,这样它就不会全部被扔到一个巨大的管道步骤中。正如我所说,我不想重定向。你能详细说明为什么这一切都是错误的吗?如果不是这个,canActivate 是什么?
  • 对不起。我读你的问题太快了。请查看我添加的最新编辑。我相信这可以通过您的 ViewModel 中的 getViewStrategy 来完成。
  • 在这种特定情况下,您根本不需要 canActivate 因为它总是正确的。因此,只需实现 getViewStrategy 钩子并进行条件检查以及那边的 unauth 页面的返回
猜你喜欢
  • 2017-11-21
  • 2012-08-17
  • 1970-01-01
  • 2012-12-04
  • 2014-07-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-25
相关资源
最近更新 更多