node.js - 我可以或者应该在 Angularjs 中使用全局变量来存储登录用户吗?

标签 node.js angularjs

我是 Angular 新手,正在开发我的第一个“真正”应用程序。我正在尝试构建一个日历/日程安排应用程序(源代码都可以在 github 上看到),并且我希望能够在有用户登录时更改内容(即显示与他们相关的详细信息),但这里有一个问题:

  1. 我不希望应用程序依赖于登录用户(需要可以配置为公开、私密或两者兼而有之)

  2. 如果可以避免的话,我不想在此应用程序中实现用户/登录(我希望最终将我的应用程序包含在另一个应用程序中,该应用程序可能会实现此功能,但不一定使用任何特定的安全框架或仅限于任何框架来实现)

我有一个想法,创建一些全局变量user,它可以在我的应用程序中引用,或者如果我必须实现一个系统来在这个应用程序中完成这一切,我可以以某种抽象的方式这样做,以便可以注入(inject)不同的选项。

我的一些想法或对我应该做什么的理解可能是完全错误的并且不了解基本原理,但我真的不知道我应该采取什么方法来做到这一点。

如果相关的话,我目前没有任何后端,但最终希望使用 MongoDB 进行存储,使用 Nodejs 进行服务,但我也想尝试保持开放性,以允许其他人使用不同的存储/后端,例如 sql 和 php

是否有一个全局用户变量/服务,我可以从另一个(父级?)应用程序注入(inject)/填充?

如果是这样,最好的方法是什么? 如果不是,为什么以及我应该采取什么方法以及为什么?

更新

我相信从网上的评论和向我提出的一些建议来看,服务将是最好的选择但是我将如何从父应用程序注入(inject)到此应用程序服务中?

最佳答案

如果您的(单个)页面由服务器动态呈现,并且服务器知道您是否登录,那么您可以执行以下操作:

动态渲染脚本标签,生成:

<script>
     window.user = { id: 1234, name: 'User A', isLoggedIn: true };
</script>

对于未登录的用户:

<script>
     window.user = { isLoggedIn: false };
</script>

为了方便起见,将 user 复制到 Angular 的 IOC 内的值:

angular.module('myApp').value('user', window.user);

然后就可以在DI中使用了:

angular.module('myApp').factory('myService', function(user) {
    return {
        doSomething: function() {
            if (user.isLoggedIn) {
                ...
            } else {
                ...
            }
        }
    };
});

一些棘手的事情(在做[查看评论]之前你应该做两次)是扩展 $范围:

angular.module('myApp').config(function($provide) {
    $provide.decorator('$controller', function($delegate, user) {
        return function(constructor, locals) {
            locals.$scope._user = user;
            return $delegate(constructor, locals);
        };
    });
});

这段代码装饰了 $controller 服务(负责构造 Controller ),基本上表示 $scope 对象在传递给 Controller ​​之前,将通过 _user 属性进行增强。

自动设置 $scoped 意味着您可以在任何地方的任何 View 中直接使用它:

<div ng-if="_user.isLoggedIn">Content only for logged-in users</div>

这是有风险的,因为您最终可能会遇到与原始 $scope API 或您在 Controller 中添加的属性的命名冲突。

不用说,这些东西仅在客户端中运行,并且很容易被篡改。您的服务器端代码应始终检查用户并返回正确的数据子集或接受正确的操作。

关于node.js - 我可以或者应该在 Angularjs 中使用全局变量来存储登录用户吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19794371/

相关文章:

javascript - 使用 angularjs 登录?

node.js - 使用客户端和服务器模仿node-webkit的功能

node.js - Redis/我可以删除所有哈希表吗?

sql-server - Node Feathers Sequelize API 无效的列名

javascript - 范围名称未在 Controller 中隔离?

javascript - 仅当要显示的值不为空时才显示 ng-repeat 项目

javascript - 在同构 Redux 应用程序中在哪里设置 cookie?

javascript - 如何使用 node.js 将注册数据存储到 redis

javascript - JADE 和 ng 类

angularjs - 如何在Linux终端中运行多个命令