我使用Sails和AngularJS制作单页应用程序。现在我正在尝试进行身份验证。
我在客户端有这个角度代码:
app.config(['$routeProvider', function($routeProvider) {
$routeProvider.
when('/', {
templateUrl:'pages/postList.html',
controller:'PostListController'
}).
when('/createPost', {
templateUrl:'pages/postCreation.html',
controller:'PostCreationController'
})
}])
此处所有 .html 文件都存储在 assets / 文件夹中,该文件夹是公开的。但我不希望公开访问 postCreation.html ,我想允许某些使用政策的用户访问此文件。
我想我可以将所有 .html 文件放在views文件夹中,为每个文件创建一个控制器方法,而不是使用策略。但我不确定这是一个很好的解决方案。
那么,如何在Sails + Angular SPA中使用策略?
答案 0 :(得分:2)
您无法使用sails政策。相反,您可以使用resolve
中的$routeProvider
参数。
应该注入控制器的可选依赖关系图。如果这些依赖项中的任何一个是promise,路由器将等待它们全部被解析或者在实例化控制器之前被拒绝。如果成功解决了所有promise,则会注入已解析的promise的值并触发$ routeChangeSuccess事件。如果任何promise被拒绝,则触发$ routeChangeError事件。
我在我的应用程序中配置了以下内容,其效果很好(使用$stateProvider
,但该概念应该适用于$routeProvider
):
.state('stateOnlyCertainUsersCanSee', {
url: "/stateOnlyCertainUsersCanSee",
templateUrl: "myTemplate.html",
controller: 'myController',
resolve: {
validate: function($q, $sails, $state) {
var defer = $q.defer();
$sails.get("/me") // gets user info
.then(
function(response) {
if (response.user.canAccessThisPage) { // Condition on which to pass or fail an user
defer.resolve();
}
else {
defer.reject("No access to page");
$state.go("home"); // Redirect wherever you want
}
}
);
return defer.promise;
}
}
})