typescript - Angular 2 - redirecționare pagină de autentificare
Apelați mai întâi șablonul de autentificare (login.component). După autentificare, se încarcă app.component.
Întrebarea mea este: este posibil acest lucru? Cum fac?
Întrebare Editată:
Deja folosesc Can Activate. Îmi pare rău, încă învăț engleza. Vreau următoarele...
bootstrap-ul a apelat prima dată app.component.
@Component({
selector: 'my-app',
template: `
<ul class="sidebar-menu">
<li class="header">Painel</li>
<li class="treeview">
<a href="#"><i class="fa fa-link"></i> <span>Loja</span>
<span class="pull-right-container">
<i class="fa fa-angle-left pull-right"></i>
</span>
</a>
<ul class="treeview-menu">
<li><a routerLink="/dashboard">Dashboard</a></li>
</ul>
</li>
<li><a routerLink="/users"><i class="fa fa-book"></i> <span>User</span></a></li>
</ul>
<div class="content-wrapper">
<router-outlet></router-outlet>
</div>`,
})export class AppComponent implements OnInit{}
Vreau să apelez login.component înainte de a apela app.component. Doar după ce utilizatorul se autentifică să apelez app.component.
Meniul va fi încărcat dacă login.component este o rută deoarece meniul ar fi încărcat în <router-outlet></router-outlet>.
Răspuns #1
Da; este posibil - și este descris frumos în documentul avansat Routing & Navigation, în special în secțiunea Milestone #4: Route Guards.
Trebuie să definești un CanActivate guard și apoi să protejezi ruta cu guardul:
auth-guard.service.ts
import { Injectable } from '@angular/core';
import { CanActivate } from '@angular/router';
@Injectable()
export class AuthGuard implements CanActivate {
canActivate() {
console.log('AuthGuard#canActivate called');
return true;
}
}
Apoi folosește garda pentru a proteja partea site-ului tău care necesită autentificare:
admin.routing.ts
import { AuthGuard } from '../auth-guard.service';
const adminRoutes: Routes = [
{
path: 'admin',
component: AdminComponent,
canActivate: [AuthGuard],
children: [
{
path: '',
children: [
{ path: 'crises', component: ManageCrisesComponent },
{ path: 'heroes', component: ManageHeroesComponent },
{ path: '', component: AdminDashboardComponent }
],
}
]
}
];
export const adminRouting: ModuleWithProviders =
RouterModule.forChild(adminRoutes);
Răspunsul #2
folosește CanActivate poți permite utilizatorului să acceseze pagina doar dacă aceasta a fost activată în rută sau să fie redirecționat către autentificare.
import { ModuleWithProviders } from '@angular/core';
import { Routes, RouterModule } from '@angular/router';
import { CanActivateAuthGuard } from './auth.service'
import { MyComponent } from './app.component';
const routes: Routes = [
{ path: '/home', component: MyComponent , canActivate: [CanActivateAuthGuard]}]
/============/
import { CanActivate, Router } from '@angular/router';
@Injectable()
export class CanActivateAuthGuard implements CanActivate {
constructor(private router: Router) {}
if (this.authService.isLoggedIn()) {
return true;
}
//Redirect the user before denying them access to this route
this.router.navigate(['/login']);
return false;
}
