【问题标题】:Angular2 Unique variable setting issueAngular2独特的变量设置问题
【发布时间】:2016-11-15 07:14:53
【问题描述】:

所以我一直在关注一个在线教程,并且有一个简单的登录组件,但似乎没有像我预期的那样工作?我在下面有一个登录组件:

import { Component } from '@angular/core';
import { Router } from '@angular/router';
import { FormGroup } from '@angular/forms';

// Services
import { AuthService } from '../../_services/auth.service';

@Component({
    styles: [require('./login.component.css')],
    template: require('./login.component.html'),
    providers: [AuthService]
})
export class LoginComponent {

    constructor(private _router: Router, private _authService: AuthService) {

    }

    login(form) {
        var email = form.form._value.email;
        var password = form.form._value.password;
        var response = this._authService.login(email, password);
        if (response) {
            this._router.navigate(['dashboard']);
        } else {
            console.log("error");
        }
    }
}

CanActivate路由上设置的认证保护

import { Injectable } from '@angular/core';
import { CanActivate, Router } from '@angular/router';

import { AuthService } from '../_services/auth.service';

@Injectable()
export class AuthGuard implements CanActivate {
    constructor(private _router: Router, private _authService: AuthService) {

    }

    canActivate() {
        console.log("auth: " + this._authService.isLoggedIn);
        if (this._authService.isLoggedIn == true) {
            // logged in so return true
            return true;
        } else {
            // not logged in so redirect to login page
            this._router.navigate(['login']);
            return false;
        }
    }
}

最后是我的身份验证服务真正负责登录,这反过来又设置了一个变量,用于我的canActivate 身份验证保护。

import { Injectable } from '@angular/core';
import { Http, Headers, RequestOptions, Response } from '@angular/http';
import { Observable } from 'rxjs/Observable';
import 'rxjs/add/operator/map'

@Injectable()
export class AuthService {
    isLoggedIn = false;

    constructor(private http: Http) { }

    login(username, password) {
        this.isLoggedIn = true;
        console.log("set: " + this.isLoggedIn);
        return true;
    }

    logout() {
        this.isLoggedIn = false;
    }
}

现在,当我运行登录功能时,isLoggedIn 变量成功设置为 true,但是当导航到仪表板时运行警卫时,变量 isLoggedIn 设置为 false。现在在我看来,我希望它是真的,因为我在登录功能运行时设置了它。

多谢。罗斯

【问题讨论】:

    标签: angular angular2-routing angular2-services


    【解决方案1】:

    线

    providers: [AuthService]
    

    在你的组件中告诉 Angular 为组件的每个实例创建并注入一个 AuthService 实例。因此,您在组件中获得的 AuthService 实例与您在其他服务中获得的实例不同,可能来自 NgModule 提供者。

    只需删除该行,并在根 NgModule 中声明一个且唯一一个 AuthService 提供程序,因此应用程序中的每个组件和服务都将共享该提供程序。

    【讨论】:

    • 太棒了!谢谢,这么简单的错误。附带说明一下,这是否是登录身份验证的合适解决方案?我看到他们设置 localStorage 的其他教程,但据我所知,localStorage 可以由客户端操作。使用这个布尔变量集似乎要简单得多,或者在用户登录并访问此类信息时设置其他字段,而不是将所有内容存储在 localStorage 中。
    • 如果你只将loggedIn标志存储在内存中,例如,如果用户刷新页面或在新选项卡中打开链接,则用户将不再登录。这就是使用 localStorage 或 cookie 的原因。大多数实际的安全检查应该由后端完成,而不是由前端完成,所以如果用户试图篡改标志,这应该不是问题。请注意,仅通过使用调试器将标志设置为 rue 在内存中也很容易。
    • 再次感谢您。我使用了 localStorage,但是当应用程序运行时,我收到内部服务器错误localStorage is not defined 如果我移动到 /login 并登录,那么一切正常,并且保护成功通过。但如果我直接返回根目录,则不会出现相同的内部服务器错误。有什么不错的教程可以推荐吗?
    • 没有。但内部 服务器 错误不应由客户端上运行的 Angular 代码引起。
    猜你喜欢
    • 2013-12-10
    • 1970-01-01
    • 2010-09-29
    • 1970-01-01
    • 1970-01-01
    • 2023-04-04
    • 2015-08-02
    • 1970-01-01
    • 2010-11-04
    相关资源
    最近更新 更多