Son yönlendirici ile kullanım
Yeni yönlendiricinin tanıtılmasıyla rotaları korumak daha kolay hale geldi. Hizmet olarak hareket eden bir koruma tanımlamanız ve bunu rotaya eklemeniz gerekir.
import { Injectable } from '@angular/core';
import { CanActivate } from '@angular/router';
import { UserService } from '../../auth';
@Injectable()
export class LoggedInGuard implements CanActivate {
constructor(user: UserService) {
this._user = user;
}
canActivate() {
return this._user.isLoggedIn();
}
}
Şimdi LoggedInGuard
rotayı rotaya aktarın ve ayrıca onu providers
modül dizisine ekleyin .
import { LoginComponent } from './components/login.component';
import { HomeComponent } from './components/home.component';
import { LoggedInGuard } from './guards/loggedin.guard';
const routes = [
{ path: '', component: HomeComponent, canActivate: [LoggedInGuard] },
{ path: 'login', component: LoginComponent },
];
Modül beyanı:
@NgModule({
declarations: [AppComponent, HomeComponent, LoginComponent]
imports: [HttpModule, BrowserModule, RouterModule.forRoot(routes)],
providers: [UserService, LoggedInGuard],
bootstrap: [AppComponent]
})
class AppModule {}
Son sürümle nasıl çalıştığı hakkında ayrıntılı blog yazısı: https://medium.com/@blacksonic86/angular-2-authentication-revisited-611bf7373bf9
Kullanımdan kaldırılan yönlendiriciyle kullanım
Daha sağlam bir çözüm, RouterOutlet
bir rota kontrolünü ve etkinleştirirken kullanıcının oturum açıp açmadığını genişletmektir . Bu şekilde direktifinizi kopyalayıp her bileşene yapıştırmanız gerekmez. Ayrıca, bir alt bileşene göre yeniden yönlendirme yapmak yanıltıcı olabilir.
@Directive({
selector: 'router-outlet'
})
export class LoggedInRouterOutlet extends RouterOutlet {
publicRoutes: Array;
private parentRouter: Router;
private userService: UserService;
constructor(
_elementRef: ElementRef, _loader: DynamicComponentLoader,
_parentRouter: Router, @Attribute('name') nameAttr: string,
userService: UserService
) {
super(_elementRef, _loader, _parentRouter, nameAttr);
this.parentRouter = _parentRouter;
this.userService = userService;
this.publicRoutes = [
'', 'login', 'signup'
];
}
activate(instruction: ComponentInstruction) {
if (this._canActivate(instruction.urlPath)) {
return super.activate(instruction);
}
this.parentRouter.navigate(['Login']);
}
_canActivate(url) {
return this.publicRoutes.indexOf(url) !== -1 || this.userService.isLoggedIn()
}
}
UserService
İş mantığı kullanıcı veya kayıt tutulmasını olmadığını bulunduğu yerde yer almaktadır. Yapıcıda DI ile kolayca ekleyebilirsiniz.
Kullanıcı web sitenizde yeni bir url'ye gittiğinde, etkinleştirme yöntemi mevcut Talimat ile çağrılır. Ondan url'yi alabilir ve izin verilip verilmediğine karar verebilirsiniz. Sadece giriş sayfasına yönlendirmek değilse.
Çalışması için geriye kalan son bir şey, onu yerleşik bileşen yerine ana bileşenimize geçirmektir.
@Component({
selector: 'app',
directives: [LoggedInRouterOutlet],
template: template
})
@RouteConfig(...)
export class AppComponent { }
Bu çözüm, @CanActive
yaşam döngüsü dekoratörü ile kullanılamaz , çünkü ona iletilen işlev yanlışı çözerse, etkinleştirme yöntemi RouterOutlet
çağrılmayacaktır.
Ayrıca bununla ilgili ayrıntılı bir blog yazısı yazdı: https://medium.com/@blacksonic86/authentication-in-angular-2-958052c64492