Angular 使用路由器保护重定向用户

Angular 使用路由器保护重定向用户,angular,typescript,Angular,Typescript,我想重定向用户。如果存在cookie,则它们不应访问页面/登录名/注册名和/(主页)。因此,他们应该总是被重定向到页面/搜索。如果不存在cookie,则他们应该无权访问页面/搜索,因此他们应该被重定向到主页 这就是我想要的: 用户未登录 | Page | Redirect to | |----------|--------------| | Search | Home | | Page | Redirect to | |----------|------

我想重定向用户。如果存在cookie,则它们不应访问页面/登录名/注册名和/(主页)。因此,他们应该总是被重定向到页面/搜索。如果不存在cookie,则他们应该无权访问页面/搜索,因此他们应该被重定向到主页

这就是我想要的: 用户未登录

| Page     | Redirect to  |
|----------|--------------|
| Search   | Home         |
| Page     | Redirect to  |
|----------|--------------|
| Login    | Search       |
| Register | Search       |
| Home     | Search       |
用户已登录

| Page     | Redirect to  |
|----------|--------------|
| Search   | Home         |
| Page     | Redirect to  |
|----------|--------------|
| Login    | Search       |
| Register | Search       |
| Home     | Search       |
我正在使用
this.router.navigateByUrl('/search')
将用户从主页重定向到/搜索页面,但这不起作用。浏览器的控制台每秒打印一次测试。Chrome的状态栏告诉我要么等待本地主机。。。或连接。。。。这种情况会一直重复。我想这是因为我对多个组件使用相同的防护

login.guard.ts

从'@angular/core'导入{Injectable};
从'@angular/Router'导入{CanActivate,ActivatedRouteSnapshot,RouterStateSnashot,Router};
从“../search/search/search.component”导入{SearchComponent};
从“ngx cookie服务”导入{CookieService};
从“./login.service”导入{LoginService};
从“@angular/common”导入{Location};
@注射的({
providedIn:'根'
})
导出类LoginGard实现CanActivate{
构造函数(私有searchComponent:searchComponent,私有cookieService:cookieService,私有loginService:loginService,私有路由器:路由器,私有位置:位置){
}
激活(
下一步:ActivatedRouteSnapshot,
状态:RouterStateSnapshot):任何{
返回这个.hasAccess();
}
hasAccess(){
返回新承诺(解决=>{
this.loginService.hascokie(this.cookieService.get('login')).subscribe(hascokie=>{
如果(hasCookie==1){
返回新承诺(()=>{
this.loginService.getCookie().subscribe(cookieFromServer=>{
if(cookieFromServer===this.cookieService.get('login')){
if(this.location.path()=='/login'| | this.location.path()==='/register'){
这个.router.navigateByUrl(“”);
返回解析(false);
}else if(this.location.path()=''){
console.log('test');

这个.router.navigateByUrl('/search');//我在这里有一些理论。我多次看到这项工作与此非常类似。我认为基本用例是PageX有一个AuthGuard,它要么允许并返回true,要么将它们重定向到“登录页面”并返回false以拒绝访问。此外,登录页面没有身份验证保护,因此没有理由“循环”,它只会在点击“登录页面”时结束

我想这里的不同之处在于: 1) 我认为你永远不会回到现实 2) 它永远不会把他们踢到一个像“登录页面”这样没有授权保护的页面上

我的理论是因为1和2的组合,逻辑永远无法完成,所以它是无限循环

因此,您可以尝试几件事情,尝试从/search页面中删除auth-guard,这会让循环结束,因为它最终会访问到它可以访问的页面

或者,很有希望,这就像调整逻辑一样简单,这样您就可以从正在重复的auth-guard返回TRUE,这也很有希望允许循环结束

如果你在那里运气好,请告诉我

基本上:
我认为,无论何时返回resolve(false);您必须导航到登录页面,如果您转到任何其他页面,则返回resolve(true)

我在这里有一些理论。我已经多次看到这项工作与此非常类似。我认为基本用例是第X页有一个AuthGuard,它要么允许并返回true,要么将它们重定向到“登录页”并返回false以拒绝访问。此外,登录页没有AuthGuard,因此没有理由“循环”它将在点击“登录页面”时结束

我想这里的不同之处在于: 1) 我认为你永远不会回到现实 2) 它永远不会把他们踢到一个像“登录页面”这样没有授权保护的页面上

我的理论是因为1和2的组合,逻辑永远无法完成,所以它是无限循环

因此,您可以尝试几件事情,尝试从/search页面中删除auth-guard,这会让循环结束,因为它最终会访问到它可以访问的页面

或者,很有希望,这就像调整逻辑一样简单,这样您就可以从正在重复的auth-guard返回TRUE,这也很有希望允许循环结束

如果你在那里运气好,请告诉我

基本上:
我认为,无论何时返回resolve(false);您必须导航到登录页面,如果您转到任何其他页面,则返回resolve(true)

你是对的。如果我从/search页面删除了auth-guard,那么它就会工作,不再有循环。但是我需要/search页面的auth-guard。如果用户没有登录,他们就不应该访问该页面。我想只要你返回resolve(false),就可以了;您必须导航到登录页面,如果转到任何其他页面,则必须解析(true)你是对的。如果我从/search页面删除了auth-guard,那么它就会工作,不再有循环。但是我需要/search页面的auth-guard。如果用户没有登录,他们就不应该访问该页面。我想,只要你返回resolve(false),就可以了;您必须导航到登录页面,如果转到任何其他页面,则必须解析(true)