首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >角JS认证维护

角JS认证维护
EN

Stack Overflow用户
提问于 2016-12-01 01:10:47
回答 2查看 39关注 0票数 3

我在寻找最好的架构解决方案。

我有以下html:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<body ng-controller="individualFootprintController as $ctrl">
<div ng-hide="$ctrl.authenticated">
            <h1>Login</h1>
            With Corporate Account: <a href="/login/corporate">click here</a>
</div>

主计长:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function individualFootprintController($http) {
        var self = this;
        $http.get("/is_auth").success(function () {
            self.authenticated = true;
        })
            .error(function() {
                self.authenticated = false;
            }
        );
}

问题:

1)控制器是否适合具有这种逻辑?

2)我想要有实际的"is_authenticated“值。如果我只想发出一次请求,如何才能做到这一点?

EN

回答 2

Stack Overflow用户

发布于 2016-12-01 01:22:11

据推测,使用后端进行身份验证需要某种实际的令牌。也就是说,您不只是在某个地方设置true/false标志并将其称为身份验证,而是为了能够与后端通信,您需要在请求中包含一个用户名/密码/cookie/令牌,否则请求将被拒绝。

控制器不是存放这种东西的好地方,因为控制器不是永久的。或者至少你不应该让它们尽可能永久。另外,将令牌存储在控制器中不允许任何其他访问。

  1. 是否登录应根据是否有有效的身份验证令牌。
  2. 此令牌必须存储在规范位置,最适合于服务。
  3. 其他服务从那里获取令牌,并根据令牌是否可用来决定应用程序当前是否“登录”。

关于应如何构建该结构的粗略说明:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
app.service('AuthService', function () {
    this.token = null;
});

app.service('FooService', function (AuthService, $http) {
    $http.get(..., AuthService.token, ...)
});

app.controller('LoginStatusController', function (AuthService) {
    Object.defineProperty(this, 'isLoggedIn', {
        get: function () { return AuthService.token != null; }
    });
});
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<div ng-controller="LoginStatusController as ctrl">
    <div ng-hide="ctrl.isLoggedIn">

当您实际登录并获得令牌时,您将设置AuthService.token,它将对所有其他服务和控制器可用。如果令牌无效或未设置,则所有服务和控制器都将失去其经过身份验证的状态。

票数 0
EN

Stack Overflow用户

发布于 2016-12-01 01:51:24

我通常做的是:

使用https://github.com/angular-ui/ui-router

  • 利用resolve钩子(它解析一些arg并将它们注入控制器),并将我的路由定义为主路由的子路由,该子路由检查每个路由的变化。 scripts/services/user.js angular.module('yourmodule') .service('userSrv',函数($http,$q) { var srv = {};srv.getAuthenticatedUser = function() {$http $http.get("/authenticated_user");};返回srv;}); scripts/routes.js 角.module(‘any模块’).config(函数( $stateProvider ) {$stateProvider.state(‘身份验证’,{抽象:真,模板:'',控制器:'AuthenticatedCtrl‘),解析:{ signedInUser: function(userSrv,$q) {返回userSrv.getAuthenticatedUser() .then(函数(null,函数()){/捕捉任何auth错误,可能403 //并将其转换为空"signedInUser“//这是处理错误(日志、显示闪存)的地方,返回$q.resolve( null );} }) .state('authenticated.myspace',{ url:'/myspace',templateUrl:‘view/myspace.html’});};
  • 利用视图中的$scope继承 scripts/controllers/authenticated.js angular.module('yourmodule') .controller('AuthenticatedCtrl',function (signedInUser,$scope,$state) {//在这里您将当前用户设置为作用域$scope.signedInUser= signedInUser;$scope.logout = function() {//这是您放置注销代码的地方。//$state.go(‘登录’;};}); views/myspace.html

1)我想要有实际的"is_authenticated“值。如果我只想在每次更改路由时请求通过身份验证的用户,那么如何才能触发请求。这似乎很奇怪,但这实际上是可行和快速的。查询不应该是>30‘s-这是一个非常小的选择。但是,询问“我是身份验证的”和“获取经过身份验证的用户”是完全相同的,除了一个返回布尔值,另一个返回用户。我建议,就像我刚才向您展示的那样,通过请求经过身份验证的用户来处理“我是经过身份验证的”问题,然后用"if( user )“(空值处理)来取消它。

( 2)控制器是否适合具有这种逻辑?是也不是。正如您所看到的,控制器正是“将用户设置为作用域”的地方,但是范围继承允许您不对每个路由重复它。但是,应该将http逻辑移植到服务中,路由事件(“获取此页面的经过身份验证的用户,请”是路由事件IMHO)应该设置在一个单独的文件中。

注:如果你需要完整的路线“保护”(比如在未经认证的情况下重定向,问另一个问题,我很乐意回答)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40906532

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文