如何保护angular4中的路线

时间:2018-02-13 13:30:34

标签: javascript angular angular-routing angular-router-guards

我在我的应用程序中有登录/创建帐户。我希望如果用户已经登录,用户将无法看到登录/创建帐户。 我正在使用Authguard来保护路线:

@Injectable()
export class AuthGuard implements CanActivate {

    constructor(private router: Router) { }

    canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) {debugger;
        if (localStorage.getItem('UserLoggedIn')) {
            // logged in so return true
            this.router.navigate(['']);
            return true;
        }

        // not logged in so redirect to login page with the return url
         this.router.navigate(['login']);
         return false;
    }

在这种情况下,页面将进入无限循环。

这是我的路线:

const appRoutes: Routes = [
  { path: '', component: HomeComponent , data: { animation: '' }},
  { path: 'login', component: UserloginComponent , data: { animation: 'login' },canActivate:[AuthGuard]},
  { path: 'create-account', component: CreateAccountComponent, data: { animation: 'create-account' } },
  { path: 'forgot-password', component: ForgotPasswordComponent, data: { animation: 'forgot-password' } },
  { path: '**', component: PageNotfoundComponent }
];

请帮助。我希望它用于登录和创建帐户。

2 个答案:

答案 0 :(得分:1)

这是因为您已将rules: { shop_name: { minlength: 4, remote: { type: 'POST', url: window.location.origin + '/api/shop/', dataFilter: function (data) { result = $.parseJSON(data); return result.exist; }, }, required: true } }, 添加到您的authguard,并且此authguard已附加到this.router.navigate(['login']);路由。每次访问路线时,它总是呼叫所有附加的警卫。因此,在您的情况下,如果您访问登录,它将无限重定向到登录。有很多方法可以解决您的问题。如果您打算在登录路线上添加防护,只需删除login以避免无限循环。但我建议只在用户未登录时将保护添加到您要保护的路由中。

答案 1 :(得分:0)

试试这个:

canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) {debugger;

        let redirect: boolean = false;

        if (localStorage.getItem('UserLoggedIn')) {
            // logged in so return true
            this.router.navigate(['']);
            redirect = true;
        } else {
            // not logged in so redirect to login page with the return url
            this.router.navigate(['login']);
            redirect =  false;
        }


        return redirect;

    }