Angular2: предотвратить авторизованным пользователям доступ к определенным маршрутам
Я определил некоторые routes
в своем :
const routes: RouterConfig = [
{ path: '', component: HomeComponent },
{ path: '', redirectTo: 'home', terminal: true },
{ path: 'dashboard', component: DashboardComponent, canActivate: [LoggedInGuard] },
{ path: 'login', component: LoginComponent },
{ path: 'about', component: AboutComponent }
];
после успешного входа в систему я хочу, чтобы мои аутентифицированные пользователи могли использовать определенные маршруты (например,dashboard
). И без логина они не могут получить доступ dashboard
но они могут быть в состоянии посетить о программе, Главная, вход
мне удалось ограничить пользователей обходе dashboard
без логина, используя CanActivate
.
canActivate(): boolean {
if (this.authService.isLoggedIn()) {
return true;
}
this.router.navigateByUrl('/login');
return false;
}
но, используя эти маршруты и CanActivate
подход после успешный вход, пользователи также могут перейти маршруты, как login
, home
. Как я могу это предотвратить?
В. Н. я использую angular2 алгоритма RC4.
3 ответов
import { Injectable } from '@angular/core';
import { CanActivate } from '@angular/router';
import { AuthService } from './your-auth.service';
@Injectable()
export class PreventLoggedInAccess implements CanActivate {
constructor(private authService: AuthService) {}
canActivate() {
return !this.authService.isLoggedIn();
}
}
добавьте его в свою функцию bootstrap, и все готово. Вам просто нужно сделать в своих маршрутах:
{ path: 'login', component: LoginComponent, canActivate: [PreventLoggedInAccess] },
сделать имя файла TS auth.охрана.ts поставил следующий код на это
написать код охраны
import { Injectable } from '@angular/core';
import { Router, CanActivate, ActivatedRouteSnapshot, RouterStateSnapshot } from '@angular/router';
@Injectable()
export class AuthGuard implements CanActivate {
constructor(private router: Router) { }
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) {
if (localStorage.getItem('currentUser')) {
// logged in so return true
return true;
}
// not logged in so redirect to login page with the return url
this.router.navigate(['/login'], { queryParams: { returnUrl: state.url }});
return false;
}
}
добавить код ниже в файл маршрутизации ts
app-маршрутизация.модуль.ТС
{
path: 'user', component: UserComponent,canActivate: [AuthGuard] ,
children: [{ path: 'home', component: HomeComponent },
{ path: 'view/:id', component: UserViewComponent },
{ path: 'add', component: UserAddComponent },
{ path: 'edit/:id', component: UserAddComponent }
]
},
добавить поставщиков в приложение.модуль.файл TS
app.модуль.ТС
@NgModule({
declarations: [
AppComponent
--------
],
imports: [
BrowserModule
--------
],
providers: [
AuthGuard
],
bootstrap: [AppComponent]
})
вы могли бы написать охранник такой:
import { Injectable } from '@angular/core';
import {
ActivatedRouteSnapshot,
CanActivate,
RouterStateSnapshot
} from '@angular/router';
import { AuthService } from './your-auth.service';
@Injectable()
export class UserAccessGuard implements CanActivate {
constructor(private authService: AuthService) {
}
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean {
return route.data['onlyGuests'] != authService.isAuthenticated();
}
}
а затем используйте его в определении маршрута:
const routes: Routes = [
{ path: '', redirectTo: 'home' },
// accessible only to guests
{
path: '',
component: HomeComponent,
data: { onlyGuests: true },
canActivate: [ UserAccessGuard ]
},
{
path: 'login',
component: LoginComponent,
data: { onlyGuests: true },
canActivate: [ UserAccessGuard ]
},
// accessible only to authenticated users
{
path: 'dashboard',
component: DashboardComponent,
canActivate: [ UserAccessGuard ]
}
];