我在寻找最好的架构解决方案。
我有以下html:
<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>
主计长:
function individualFootprintController($http) {
var self = this;
$http.get("/is_auth").success(function () {
self.authenticated = true;
})
.error(function() {
self.authenticated = false;
}
);
}
问题:
1)控制器是否适合具有这种逻辑?
2)我想要有实际的"is_authenticated“值。如果我只想发出一次请求,如何才能做到这一点?
发布于 2016-12-01 01:22:11
据推测,使用后端进行身份验证需要某种实际的令牌。也就是说,您不只是在某个地方设置true
/false
标志并将其称为身份验证,而是为了能够与后端通信,您需要在请求中包含一个用户名/密码/cookie/令牌,否则请求将被拒绝。
控制器不是存放这种东西的好地方,因为控制器不是永久的。或者至少你不应该让它们尽可能永久。另外,将令牌存储在控制器中不允许任何其他访问。
关于应如何构建该结构的粗略说明:
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; }
});
});
<div ng-controller="LoginStatusController as ctrl">
<div ng-hide="ctrl.isLoggedIn">
当您实际登录并获得令牌时,您将设置AuthService.token
,它将对所有其他服务和控制器可用。如果令牌无效或未设置,则所有服务和控制器都将失去其经过身份验证的状态。
发布于 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’});};1)我想要有实际的"is_authenticated“值。如果我只想在每次更改路由时请求通过身份验证的用户,那么如何才能触发请求。这似乎很奇怪,但这实际上是可行和快速的。查询不应该是>30‘s-这是一个非常小的选择。但是,询问“我是身份验证的”和“获取经过身份验证的用户”是完全相同的,除了一个返回布尔值,另一个返回用户。我建议,就像我刚才向您展示的那样,通过请求经过身份验证的用户来处理“我是经过身份验证的”问题,然后用"if( user )“(空值处理)来取消它。
( 2)控制器是否适合具有这种逻辑?是也不是。正如您所看到的,控制器正是“将用户设置为作用域”的地方,但是范围继承允许您不对每个路由重复它。但是,应该将http逻辑移植到服务中,路由事件(“获取此页面的经过身份验证的用户,请”是路由事件IMHO)应该设置在一个单独的文件中。
注:如果你需要完整的路线“保护”(比如在未经认证的情况下重定向,问另一个问题,我很乐意回答)。
https://stackoverflow.com/questions/40906532
复制相似问题