【问题标题】:Invalid url in Angular should check some condition before redirectingAngular 中的无效 url 应该在重定向之前检查一些条件
【发布时间】:2020-03-12 09:30:53
【问题描述】:

我的初始域是 localhost:4200,它根据我的路由将我重定向到某个页面,但我想输入一个无效域,例如 localhost:4200/Whasup 或 localhost:4200/Whasdown,其中 Whasup 和 whasdown页面不存在。在我被重定向到默认的 Angular 404 页面之前,我需要检查一些条件。如果我的条件不满足,那么我想将其重定向到 404 页面,否则我想处理它。

my app-routing.module.ts(Auth Guard 检查用户是否登录)

const routes: Routes = [
  // Fallback when no prior route is matched
  // Shell.childRoutes([]),
  // { path:'home', component: HomeComponent},
  // { path: '**', redirectTo: '', pathMatch: 'full' }

  Shell.childRoutes([
    { path: '', component: RedirectToComponent, canActivate: [AuthGuard] },
    {
      path: 'dashboard',
      loadChildren: 'src/app/dashboard/dashboard.module#DashboardModule',
      canActivate: [AuthGuard]


    },
    {
      path: 'exec-dashboard',
      loadChildren:
        'src/app/exec-dashboard/exec-dashboard.module#ExecDashboardModule',
      canActivate: [AuthGuard]
    },
    {
      path: '**',
      redirectTo: '',
      canActivate: [AuthGuard]
    }
  ]),
  {
    path: 'auth',
    loadChildren: 'src/app/auth/auth.module#AuthModule',
    canActivate: [AuthGuard]
  }

];

@NgModule({
  imports: [
    RouterModule.forRoot(routes, {
      enableTracing: false, // Enable for debug purpose.
      useHash: true,
      preloadingStrategy: PreloadAllModules
    })
  ],
  exports: [RouterModule],
  providers: [AuthGuard]
})

我还实现了 KeyCloak Angular 拦截器,如果用户未登录,它可以帮助我进入 keycloak 登录页面。我在 app.module.ts 中定义了提供程序。

 providers: [
    {
      provide: APP_INITIALIZER,
      useFactory: initializer,
      multi: true,
      deps: [KeycloakService]
    }
  ],

所以每当我点击我的初始域(localhost:4200)时,初始化函数在我被重定向到任何页面之前都会被调用,同样的情况也会发生在无效的子域 url(localhost:4200/Whasup)上。 编辑:我可以实现上述任何机会,或者我可以在角度实现子域逻辑,例如,tenant1.localhost:4200 或tenant2.localhost:4200,(部署时它将是tenant1.mycompany.com)。有人可以建议我一种以角度实现子域路由的方法。 非常感谢。

【问题讨论】:

  • 根据您的描述,如果用户登陆不存在的页面,您希望将用户重定向到登录页面。这个逻辑与是否有子域无关。您可以简单地重定向到路由配置中“**”的登录页面(stackoverflow.com/a/36261194)。我想这就是你所追求的。
  • @DanielGrima 如果你看到我的应用程序路由模块,我已经完成了那部分,实际上在我的情况下,当我启动我的应用程序时,它不应该重定向到 localhost:4200,它应该直接去到 localhost:4200/tenantname 或tenantName.localhost:4200。
  • 我已经发布了一个答案,因为我的解释无法放入评论中。希望对您有所帮助。

标签: javascript html angular routing


【解决方案1】:

我将在这里发布,因为我的解释不适合评论。我不确定这是否一定会回答您的问题,因为有很多事情需要考虑。就这样吧……

注意

如果您希望您的应用程序与子域一起使用,您不能将localhost 与子域(如tenantName.localhost:4200)一起使用来进行本地测试,您必须使用主机文件设置自定义域。您可以查看此here 的示例。就我个人而言,我更喜欢拥有/tenantname 而不是子域,但这是个人喜好,我猜是基于您的业务需求。

处理重定向

无论是使用子域还是客户端名称作为 URL 的一部分,您都应该能够在用户登录后处理“自动重定向”到“租户 URL”。我是假设作为响应的一部分成功登录后,您将拥有租户名称。获得租户名称后,您可以轻松地将用户重定向到正确的 URL。

我之所以提到这一点,是因为您在上一条评论中表示,在应用程序启动时,您希望重定向到“特定于租户”的 URL。 重要提示:如果用户没有登录,您将无法知道要重定向到哪个 URL。

现在,如果用户已登录并访问该网站?那么在AuthGuard 中,您可以有一个条件来检查用户是否已登录,如果是,则将用户重定向到正确的租户 URL。我再次假设,作为登录响应的一部分,您有一些信息可以让您知道用户所属的租户。

简而言之,我建议:

  • 确保身份验证成功的响应返回有关租户的一些信息。
  • 使用身份验证响应中的租户信息,您可以将用户从 Angular 应用程序重定向到正确的租户 URL。
  • 另外请记住,当用户尝试访问他们无权访问的租户的 URL 时,您需要处理这种情况。

【讨论】:

  • 嗨@DanielGrima,感谢您的努力,但我启动应用程序的起点是tenantName.localhots:4200,然后我将被重定向到登录门户,在我登录之前,我应该有租户信息基于 url。然后根据我的租户信息验证,我将重定向到登录页面。
  • 好的,然后有一个“静态”页面,它只是用来将用户重定向到登录页面。因此,您的主页将位于 localhost:4200 上,并且您在此处放置一个“登录”按钮,单击该按钮后,您会将用户重定向到门户。登录成功后,您将用户重定向到正确的租户 URL。这样您就不必担心应用程序的起点应该是什么。
  • 嗨@DanielGrima,我正在尝试实现这样的目标:“localhost:4200/tenantName”或 localhost:4200/tenantName2,基本上我想在我的主机名上附加一个字符串,这个主机名有是字符串,这作为响应将我重定向到登录页面,因此在点击 localhost:4200/tenantName 后它应该重定向到 localhost:4200/tenantName/ui/dashboard/login,所有其他路由将遵循 localhost:4200/tenantName/${ }。这种事情能不能做到。
猜你喜欢
  • 1970-01-01
  • 2012-12-17
  • 2011-01-19
  • 2018-02-21
  • 1970-01-01
  • 2021-04-28
  • 1970-01-01
  • 2018-02-20
  • 1970-01-01
相关资源
最近更新 更多