我正在创建一个示例MEAN身份验证应用程序,其中我有一个主页,注册页面,登录页面,仪表板和配置文件页面。我试图在angular2-jwt的帮助下应用身份验证。但这对我不起作用。我被困在登录页面。当我输入用户名密码(正确)时,会出现“您已登录”的闪存消息,但不会将我重定向到仪表板页面(在认证部分之前工作)。当我手动输入仪表板页面的URL(现在应该可以在我登录时访问)时,它仍然会将我重定向到登录页面。
另一个问题是我编写了登录和注册按钮的代码,一旦用户登录就会消失,但是在“你登录”的flash消息后它们也没有消失。
任何形式的帮助都将受到高度赞赏。
这是我的navbar.component.html
<nav class="navbar navbar-default">
<div class="container">
<div class="navbar-header">
<button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar" aria-expanded="false"
aria-controls="navbar">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a class="navbar-brand" href="#">MEAN Auth App</a>
</div>
<div id="navbar" class="collapse navbar-collapse">
<ul class="nav navbar-nav navbar-left">
<li [routerLinkActive]="['active']" [routerLinkActiveOptions]="{exact:true}"><a [routerLink]="['/']">Home</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
<li *ngIf="authService.loggedIn()" [routerLinkActive]="['active']" [routerLinkActiveOptions]="{exact:true}"><a [routerLink]="['/dashboard']">Dashboard</a></li>
<li *ngIf="authService.loggedIn()" [routerLinkActive]="['active']" [routerLinkActiveOptions]="{exact:true}"><a [routerLink]="['/profile']">Profile</a></li>
<li *ngIf="!authService.loggedIn()" [routerLinkActive]="['active']" [routerLinkActiveOptions]="{exact:true}"><a [routerLink]="['/login']">Login</a></li>
<li *ngIf="!authService.loggedIn()" [routerLinkActive]="['active']" [routerLinkActiveOptions]="{exact:true}"><a [routerLink]="['/register']">Register</a></li>
<li *ngIf="authService.loggedIn()"><a (click)="onLogoutClick()" href="#">Logout</a></li>
</ul>
</div>
<!--/.nav-collapse -->
</div>
</nav>
我的navbar.component.ts
import { Component, OnInit } from '@angular/core';
import {AuthService} from '../../services/auth.service';
import {Router} from '@angular/router';
import {FlashMessagesService} from 'angular2-flash-messages';
@Component({
selector: 'app-navbar',
templateUrl: './navbar.component.html',
styleUrls: ['./navbar.component.css']
})
export class NavbarComponent implements OnInit {
constructor(
private authService:AuthService,
private router:Router,
private flashMessage:FlashMessagesService) { }
ngOnInit() {
}
onLogoutClick(){
this.authService.logout();
this.flashMessage.show('You are logged out', {
cssClass:'alert-success',
timeout: 3000
});
this.router.navigate(['/login']);
return false;
}
}
我的app.module.ts
import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
import { FormsModule } from '@angular/forms';
import { HttpModule } from '@angular/http';
import {RouterModule, Routes} from '@angular/router';
import { AppComponent } from './app.component';
import { NavbarComponent } from './components/navbar/navbar.component';
import { LoginComponent } from './components/login/login.component';
import { RegisterComponent } from './components/register/register.component';
import { HomeComponent } from './components/home/home.component';
import { DashboardComponent } from './components/dashboard/dashboard.component';
import { ProfileComponent } from './components/profile/profile.component';
import {ValidateService} from './services/validate.service';
import {AuthService} from './services/auth.service';
import {FlashMessagesModule} from 'angular2-flash-messages';
import {AuthGuard} from './guards/auth.guard';
const appRoutes: Routes = [
{path:'', component: HomeComponent},
{path:'register', component: RegisterComponent},
{path:'login', component: LoginComponent},
{path:'dashboard', component: DashboardComponent, canActivate:[AuthGuard]},
{path:'profile', component: ProfileComponent, canActivate:[AuthGuard]}
]
@NgModule({
declarations: [
AppComponent,
NavbarComponent,
LoginComponent,
RegisterComponent,
HomeComponent,
DashboardComponent,
ProfileComponent
],
imports: [
BrowserModule,
FormsModule,
HttpModule,
RouterModule.forRoot(appRoutes),
FlashMessagesModule
],
providers: [ValidateService, AuthService, AuthGuard],
bootstrap: [AppComponent]
})
export class AppModule { }
我的auth.gaurd.ts
import {Injectable} from '@angular/core';
import {Router, CanActivate} from '@angular/router';
import {AuthService} from '../services/auth.service';
@Injectable()
export class AuthGuard implements CanActivate{
constructor(private authService:AuthService, private router:Router){
}
canActivate(){
if(this.authService.loggedIn()){
return true;
} else {
this.router.navigate(['/login']);
return false;
}
}
}
我的auth.service.ts
import { Injectable } from '@angular/core';
import {Http, Headers} from '@angular/http';
import 'rxjs/add/operator/map';
import {tokenNotExpired} from 'angular2-jwt';
@Injectable()
export class AuthService {
authToken: any;
user: any;
isDev:boolean;
constructor(private http:Http) {
this.isDev = false; // Change to false before deployment
}
registerUser(user){
let headers = new Headers();
headers.append('Content-Type','application/json');
let ep = this.prepEndpoint('users/register');
return this.http.post(ep, user,{headers: headers})
.map(res => res.json());
}
authenticateUser(user){
let headers = new Headers();
headers.append('Content-Type','application/json');
let ep = this.prepEndpoint('users/authenticate');
return this.http.post(ep, user,{headers: headers})
.map(res => res.json());
}
getProfile(){
let headers = new Headers();
this.loadToken();
headers.append('Authorization', this.authToken);
headers.append('Content-Type','application/json');
let ep = this.prepEndpoint('users/profile');
return this.http.get(ep,{headers: headers})
.map(res => res.json());
}
storeUserData(token, user){
localStorage.setItem('id_token', token);
localStorage.setItem('user', JSON.stringify(user));
this.authToken = token;
this.user = user;
}
loadToken(){
const token = localStorage.getItem('id_token');
this.authToken = token;
}
loggedIn(){
return tokenNotExpired();
}
logout(){
this.authToken = null;
this.user = null;
localStorage.clear();
}
prepEndpoint(ep){
if(this.isDev){
return ep;
} else {
return 'http://localhost:8080/'+ep;
}
}
}
和我的login.component.ts
import { Component, OnInit } from '@angular/core';
import {AuthService} from '../../services/auth.service';
import {Router} from '@angular/router';
import {FlashMessagesService} from 'angular2-flash-messages';
@Component({
selector: 'app-login',
templateUrl: './login.component.html',
styleUrls: ['./login.component.css']
})
export class LoginComponent implements OnInit {
username: String;
password: String;
constructor(
private authService:AuthService,
private router:Router,
private flashMessage:FlashMessagesService
) { }
ngOnInit() {
}
onLoginSubmit(){
const user = {
username: this.username,
password: this.password
}
this.authService.authenticateUser(user).subscribe(data => {
if(data.success){
this.authService.storeUserData(data.token, data.user);
this.flashMessage.show('You are now logged in', {
cssClass: 'alert-success',
timeout: 5000});
this.router.navigate(['dashboard']);
console.log("I have navigated");
} else {
this.flashMessage.show(data.msg, {
cssClass: 'alert-danger',
timeout: 5000});
this.router.navigate(['login']);
}
});
}
}
如果我需要上传任何其他文件,请告诉我。并且“我已导航”正在控制台中打印,这是用login.comonent.ts编写的(我写的只是为了检查)。