如何实现AuthorizeStep referer重定向?

时间:2017-03-10 10:23:41

标签: aurelia aurelia-router aurelia-framework

我已经实现了Aurelia doc(http://aurelia.io/hub.html#/doc/article/aurelia/router/latest/router-configuration/8

中的AuthorizeStep示例代码
@inject(MdToastService,I18N)
class AuthorizeStep {
    constructor(toast:MdToastService,i18n:I18N) {
        this.toast = toast;
        this.i18n = i18n;
    }

    run(navigationInstruction, next) {
        if (window.sessionStorage.getItem('subject')===null
            && navigationInstruction.config.settings!==undefined
            && navigationInstruction.config.settings.auth!==false) {
            this.toast.show(this.i18n.tr('backend:LOGIN_REQUIRED_DESCRIPTION'), 5000, 'error');
            return next.cancel(new Redirect('welcome'));
        }
        return next();
    }
}

如果用户访问受限区域" / admin",他将被重定向到" / welcome"。但我想记住引用者" / admin",并在登录后将用户重定向到该区域。

return next.cancel(new Redirect('welcome',{referer:navigationInstruction.fragment}));

实现这一目标的最佳方法是什么?

1 个答案:

答案 0 :(得分:1)

我遇到了同样的问题。在我让他们进入之前,我不得不问用户使用条款。使用条款是一条不同的路线,我必须记住用户来自哪里。我用以下代码存档了它。

注入一个可以保存之后所需状态的服务类的技巧。

我写了一个服务类TermsOfUseOptInService来处理用户来自的optin状态和重定向路由。 在路由器管道步骤中,您可以从navigationInstructions参数获取有关当前路由(fragment + queryString)的信息,并将它们设置为注入的服务类。

import { autoinject } from 'aurelia-framework'
import { Redirect, NavigationInstruction, Next } from 'aurelia-router';
import { TermsOfUseOptInService } from '../resources/services/terms-of-use-opt-in-service'

@autoinject()
export class TermsOfUseOptInStep {

  constructor(private optInService: TermsOfUseOptInService) {

}
run(navigationInstructions: NavigationInstruction, next: Next): Promise<any>
{
  if (navigationInstructions.getAllInstructions().some(i => i.config.settings.thersOfUseOptIn)) {
    if (!this.optInService.TermsOfUseAccepted) {
      let backUrl = navigationInstructions.fragment;
      if (navigationInstructions.queryString) {
        backUrl += '?' + navigationInstructions.queryString;
      }
      this.optInService.backUrl = backUrl;
      let redirect = new Redirect(this.optInService.RedirectRoute);
      return next.cancel(redirect);
    }
  }
  if (!(navigationInstructions.config.name == this.optInService.RedirectRoute)) {
    this.optInService.backUrl = null;
  }
  return next();
  }
}

处理opt in的视图也会注入TermsOfUseOptInService并可以处理反向重定向。

if (this.optInService.backUrl) {
  this.router.navigate(this.optInService.backUrl);
}