내 앱에 인증 가드를 구현하려고합니다. 즉; 인증 된 사용자 만 내 앱의 특정 경로에 액세스 할 수 있습니다. 나는 here 주어진 주어진 혀를 따르고있어.Angular2 Service 싱글 톤을 만드는 방법은 무엇입니까?
일단 사용자가 로그인하면 내 AuthService의 부울 값이 true로 변경되어 사용이 로그인되었음을 나타냅니다. 앱 수명 기간 동안 유지해야하는 항목이 있습니다. 소스 코드 아래
:
인증-guard.service.ts
import { Injectable } from '@angular/core';
import {
CanActivate, Router,
ActivatedRouteSnapshot,
RouterStateSnapshot
} from '@angular/router';
import { AuthService } from './auth.service';
@Injectable()
export class AuthGuardService implements CanActivate {
constructor(private authService: AuthService, private router: Router) {}
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean {
let url: string = state.url;
return this.checkLogin(url);
}
checkLogin(url: string): boolean {
console.log('Auth Guard Service: ' + this.authService.isLoggedIn);
if (this.authService.isLoggedIn) { return true; }
// Store the attempted URL for redirecting
this.authService.redirectUrl = url;
// Navigate to the login page with extras
this.router.navigate(['/admin', 'admin-login']);
return false;
}
}
auth.service.ts
import { Injectable } from '@angular/core';
import { Http } from '@angular/http';
import { User } from '../user/shared/user.model';
import { ServiceBase } from '../../core/service.base';
import { appConfig } from '../../core/app.config';
@Injectable()
export class AuthService extends ServiceBase {
public isLoggedIn: boolean = false;
redirectUrl: string;
apiUrl: string;
constructor(private http: Http) {
super();
this.apiUrl = appConfig.apiBaseUrl + '/users/signin';
}
signin(user: User, successCallback, errorCallback) {
return this.http.post(this.apiUrl, user).subscribe(
res => {
this.isLoggedIn = true;
successCallback(res);
},
err => {
//this.isLoggedIn = false;
errorCallback(err);
}
);
}
}
login.component.ts
(210)import { Component, OnInit } from '@angular/core';
import { FormGroup, FormBuilder, FormControl, Validators } from '@angular/forms';
import { Router } from '@angular/router';
import { User } from '../../user/shared/user.model';
import { AuthService } from '../auth.service';
@Component({
moduleId: module.id,
templateUrl: 'login.component.html'
})
export class AdminLoginComponent implements OnInit{
user: User;
userLoginForm: FormGroup;
constructor(
private formBuilder: FormBuilder,
private authService: AuthService,
private router: Router){
this.user = new User();
}
ngOnInit(){
this.buildLoginForm();
}
buildLoginForm() {
...
}
login() {
if(!this.userLoginForm.valid) return false;
this.authService.signin(this.user,
response => {
console.log('Login Component: ' + this.authService.isLoggedIn);
this.router.navigate(['/admin', 'products']);
},
response => {}
);
}
}
콘솔 출력
XHR finished loading: POST "http://localhost:3000/api/users/signin".
login.component.ts:40 Login Component: true
auth-guard.service.ts:23 Auth Guard Service: false
편집 : 내가 잘못 여기서 뭐하는 거지
import { NgModule } from '@angular/core';
...
import { AuthGuardService } from './auth/auth-guard.service';
import { AuthService } from './auth/auth.service';
@NgModule({
imports: [
...
AdminRoutingModule
],
exports: [
],
declarations: [
...
AdminLoginComponent,
...
],
providers: [
AuthGuardService,
AuthService,
...
],
bootstrap:[]
})
export class AdminModule {}
을 app.module.ts? 어떤 도움을 주시면 감사하겠습니다.
참조하십시오. 구성 요소의'providers' 섹션에 서비스를 추가 한 경우 해당 구성 요소에 대해 새 서비스 인스턴스가 초기화됩니다. – ranakrunal9
어디에서이 서비스를 추가했는지 보여주십시오. App.module – Milad