通过SmartEdit访问Spartacus时是否可以禁用protected routes?
SmartEdit访问Spartacus时禁用受保护路由的实现方法
可以实现该需求,核心思路是识别当前是否运行在SmartEdit环境中,动态关闭受保护路由的未登录强制跳转逻辑,具体步骤如下:
步骤1:调用官方能力识别SmartEdit环境
Spartacus已经封装了环境检测能力,直接注入SmartEditLauncherService调用其isLaunchInSmartEdit()方法,即可拿到当前是否为SmartEdit访问场景的布尔值。
步骤2:自定义路由守卫覆盖原生拦截逻辑
原生的受保护路由跳转逻辑由ProtectedRoutesGuard实现,你可以自定义一个Guard继承该原生守卫,在路由拦截逻辑前加入SmartEdit环境判断:
import { Injectable } from '@angular/core'; import { ProtectedRoutesGuard, ActivatedRouteSnapshot, RouterStateSnapshot, UrlTree } from '@spartacus/core'; import { SmartEditLauncherService } from '@spartacus/smartedit/root'; import { Observable } from 'rxjs'; import { map } from 'rxjs/operators'; @Injectable({ providedIn: 'root' }) export class CustomProtectedRoutesGuard extends ProtectedRoutesGuard { constructor( protected smartEditLauncherService: SmartEditLauncherService, // 按项目实际配置补全原生ProtectedRoutesGuard需要的其他依赖 ) { // 调用父类构造函数,传入对应依赖 super(/* 传入原生守卫要求的参数 */); } canActivate( route: ActivatedRouteSnapshot, state: RouterStateSnapshot ): Observable<boolean | UrlTree> | Promise<boolean | UrlTree> | boolean | UrlTree { return this.smartEditLauncherService.isLaunchInSmartEdit().pipe( map(isInSmartEdit => { // SmartEdit环境直接放行,不触发登录跳转 if (isInSmartEdit) { return true; } // 普通环境走原生受保护路由判断逻辑 return super.canActivate(route, state) as boolean | UrlTree; }) ) } }
步骤3:根模块替换原生守卫的服务提供者
import { NgModule } from '@angular/core'; import { ProtectedRoutesGuard } from '@spartacus/core'; import { CustomProtectedRoutesGuard } from './guards/custom-protected-routes.guard'; @NgModule({ providers: [ { provide: ProtectedRoutesGuard, useClass: CustomProtectedRoutesGuard } ] }) export class AppModule {}
补充说明:如果你的项目开启的是全局早登录(所有路由默认受保护),不需要自定义Guard也可以实现需求,直接在
earlyLogin配置的provider中加入SmartEdit环境判断,动态将earlyLogin.enabled设置为false即可。
内容的提问来源于stack exchange,提问作者Krzysztof Platis
相关产品推荐
相关产品推荐

