Оновлення: Я опублікував повний скелетний проект Angular 2 з інтеграцією OAuth2 в Github, який показує дію вказану нижче директиву.
Один із способів зробити це через використання а directive
. На відміну від Angular 2 components
, які є принципово новими тегами HTML (із асоційованим кодом), які ви вставляєте на свою сторінку, атрибутивна директива - це атрибут, який ви поміщаєте в тег, який спричиняє певну поведінку. Документи тут .
Наявність вашого спеціального атрибута призводить до того, що відбувається з компонентом (або елементом HTML), у який ви розмістили директиву. Розгляньте цю директиву, яку я використовую для свого поточного додатка Angular2 / OAuth2:
import {Directive, OnDestroy} from 'angular2/core';
import {AuthService} from '../services/auth.service';
import {ROUTER_DIRECTIVES, Router, Location} from "angular2/router";
@Directive({
selector: '[protected]'
})
export class ProtectedDirective implements OnDestroy {
private sub:any = null;
constructor(private authService:AuthService, private router:Router, private location:Location) {
if (!authService.isAuthenticated()) {
this.location.replaceState('/'); // clears browser history so they can't navigate with back button
this.router.navigate(['PublicPage']);
}
this.sub = this.authService.subscribe((val) => {
if (!val.authenticated) {
this.location.replaceState('/'); // clears browser history so they can't navigate with back button
this.router.navigate(['LoggedoutPage']); // tells them they've been logged out (somehow)
}
});
}
ngOnDestroy() {
if (this.sub != null) {
this.sub.unsubscribe();
}
}
}
Це використовує службу аутентифікації, яку я написав, щоб визначити, чи користувач уже ввійшов у систему, а також підписався на подію аутентифікації, щоб він міг вигнати користувача, якщо він або вона вийде або вимкнеться.
Ви могли зробити те саме. Ви б створили таку директиву, як моя, яка перевіряє наявність необхідного файлу cookie або іншої інформації про стан, яка вказує на те, що користувач має автентифікацію. Якщо у вас немає тих прапорів, які ви шукаєте, перенаправляйте користувача на вашу головну загальнодоступну сторінку (як я) або на ваш сервер OAuth2 (або що завгодно). Ви покладете цей атрибут директиви на будь-який компонент, який потрібно захистити. У цьому випадку це може називатися protected
як в директиві, яку я вставив вище.
<members-only-info [protected]></members-only-info>
Тоді ви хочете перейти / перенаправити користувача до перегляду входу у вашій програмі та обробити там автентифікацію. Вам доведеться змінити поточний маршрут на той, який ви хотіли це зробити. Тож у такому випадку ви використовуєте ін'єкцію залежності, щоб отримати об’єкт Router у функції вашої директиви, constructor()
а потім скористатися navigate()
методом для відправки користувача на вашу сторінку входу (як у моєму прикладі вище).
Це передбачає, що у вас є серія маршрутів, десь десь керується <router-outlet>
тегом, який виглядає приблизно так:
@RouteConfig([
{path: '/loggedout', name: 'LoggedoutPage', component: LoggedoutPageComponent, useAsDefault: true},
{path: '/public', name: 'PublicPage', component: PublicPageComponent},
{path: '/protected', name: 'ProtectedPage', component: ProtectedPageComponent}
])
Якщо замість цього вам потрібно було переспрямувати користувача на зовнішню URL-адресу, наприклад, на ваш сервер OAuth2, ви отримаєте директиву зробити щось на зразок наступного:
window.location.href="https://myserver.com/oauth2/authorize?redirect_uri=http://myAppServer.com/myAngular2App/callback&response_type=code&client_id=clientId&scope=my_scope