Skip to content

Commit 44f6b96

Browse files
committed
Angular Security course
1 parent 3b26757 commit 44f6b96

File tree

6 files changed

+54
-10
lines changed

6 files changed

+54
-10
lines changed

server/create-user.route.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ async function createUserAndSession(res:Response, credentials) {
4444

4545
res.cookie("XSRF-TOKEN", csrfToken);
4646

47-
res.status(200).json({id:user.id, email:user.email});
47+
res.status(200).json({id:user.id, email:user.email, roles: user.roles});
4848
}
4949

5050

server/database.ts

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,9 +30,7 @@ class InMemoryDatabase {
3030
id,
3131
email,
3232
passwordDigest,
33-
roles: {
34-
"STUDENT":true
35-
}
33+
roles: ["STUDENT"]
3634
};
3735

3836
USERS[id] = user;

server/login.route.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ async function loginAndBuildResponse(credentials:any, user:DbUser, res: Respons
3737

3838
res.cookie("XSRF-TOKEN", csrfToken);
3939

40-
res.status(200).json({id:user.id, email:user.email});
40+
res.status(200).json({id:user.id, email:user.email, roles: user.roles});
4141

4242
}
4343
catch(err) {

src/app/app.module.ts

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,11 @@
11
import { BrowserModule } from '@angular/platform-browser';
2-
import { NgModule } from '@angular/core';
2+
import {NgModule, Provider} from '@angular/core';
33
import {HttpClientModule, HttpClientXsrfModule} from '@angular/common/http';
44

55
import { AppComponent } from './app.component';
66
import { LessonsComponent } from './lessons/lessons.component';
77
import { LoginComponent } from './login/login.component';
88
import { SignupComponent } from './signup/signup.component';
9-
import {RouterModule} from "@angular/router";
109
import {routesConfig} from "./routes.config";
1110
import {LessonsService} from "./services/lessons.service";
1211
import {ReactiveFormsModule} from "@angular/forms";
@@ -19,9 +18,14 @@ import 'rxjs/add/operator/shareReplay';
1918
import 'rxjs/add/operator/do';
2019
import 'rxjs/add/operator/filter';
2120
import 'rxjs/add/operator/catch';
22-
21+
import 'rxjs/add/operator/first';
2322
import 'rxjs/add/observable/of';
2423
import { AdminComponent } from './admin/admin.component';
24+
import {AuthorizationGuard} from "./services/auth.guard";
25+
import {Router, RouterModule} from "@angular/router";
26+
27+
28+
2529

2630

2731
@NgModule({
@@ -42,7 +46,19 @@ import { AdminComponent } from './admin/admin.component';
4246
RouterModule.forRoot(routesConfig),
4347
ReactiveFormsModule
4448
],
45-
providers: [LessonsService, AuthService],
49+
providers: [
50+
{
51+
provide: 'adminsOnlyGuard',
52+
useFactory: (authService:AuthService,
53+
router:Router) => new AuthorizationGuard(['ADMIN'], authService, router),
54+
deps: [
55+
AuthService,
56+
Router
57+
]
58+
},
59+
LessonsService,
60+
AuthService
61+
],
4662
bootstrap: [AppComponent]
4763
})
4864
export class AppModule {

src/app/routes.config.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,8 @@ export const routesConfig: Routes = [
1919
},
2020
{
2121
path: 'admin',
22-
component: AdminComponent
22+
component: AdminComponent,
23+
canActivate: ["adminsOnlyGuard"]
2324
},
2425
{
2526
path: '',

src/app/services/auth.guard.ts

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
import {CanActivate, ActivatedRouteSnapshot, RouterStateSnapshot, Router} from "@angular/router";
2+
import {Observable} from "rxjs/Rx";
3+
import {Injectable} from "@angular/core";
4+
import {AuthService} from "./auth.service";
5+
import * as _ from 'lodash';
6+
7+
@Injectable()
8+
export class AuthorizationGuard implements CanActivate {
9+
10+
constructor(private allowedRoles: string[], private authService:AuthService, private router:Router) {
11+
12+
}
13+
14+
canActivate(route:ActivatedRouteSnapshot,
15+
state:RouterStateSnapshot):Observable<boolean> {
16+
17+
return this.authService.user$
18+
.do(user => console.log(user, this.allowedRoles, _.intersection(user.roles, this.allowedRoles)))
19+
.map(user => _.intersection(user.roles, this.allowedRoles).length > 0)
20+
.first()
21+
.do(allowed => {
22+
console.log(allowed);
23+
if(!allowed) {
24+
this.router.navigate(['/lessons']);
25+
}
26+
});
27+
}
28+
29+
}

0 commit comments

Comments
 (0)