開発中のAngularJS
アプリの使用を開始したばかりで、すべてが順調に進んでいますが、ログインしていない場合にユーザーがそのルートにアクセスできないようにルートを保護する方法が必要です。 。サービス側でも保護することの重要性を理解しており、これを担当します。
私はクライアントを保護するいくつかの方法を見つけました、1つは以下を使用するようです
$scope.$watch(
function() {
return $location.path();
},
function(newValue, oldValue) {
if ($scope.loggedIn == false && newValue != '/login') {
$location.path('/login');
}
}
);
これを.run
のapp.js
のどこに置く必要がありますか?
そして、私が見つけたもう1つの方法は、ディレクティブを使用し、on --routechagestartを使用することです。
情報はここにあります http://blog.brunoscopelliti.com/deal-with-users-authentication-in-an-angularjs-web-app
私は、推奨される方法に関する誰かの助けとフィードバックに本当に興味があります。
解決を使用すると、ここで役立つはずです:(コードはテストされていません)
angular.module('app' []).config(function($routeProvider){
$routeProvider
.when('/needsauthorisation', {
//config for controller and template
resolve : {
//This function is injected with the AuthService where you'll put your authentication logic
'auth' : function(AuthService){
return AuthService.authenticate();
}
}
});
}).run(function($rootScope, $location){
//If the route change failed due to authentication error, redirect them out
$rootScope.$on('$routeChangeError', function(event, current, previous, rejection){
if(rejection === 'Not Authenticated'){
$location.path('/');
}
})
}).factory('AuthService', function($q){
return {
authenticate : function(){
//Authentication logic here
if(isAuthenticated){
//If authenticated, return anything you want, probably a user object
return true;
} else {
//Else send a rejection
return $q.reject('Not Authenticated');
}
}
}
});
$routeProvider
のresolve
属性を使用する別の方法:
angular.config(["$routeProvider",
function($routeProvider) {
"use strict";
$routeProvider
.when("/forbidden", {
/* ... */
})
.when("/signin", {
/* ... */
resolve: {
access: ["Access", function(Access) { return Access.isAnonymous(); }],
}
})
.when("/home", {
/* ... */
resolve: {
access: ["Access", function(Access) { return Access.isAuthenticated(); }],
}
})
.when("/admin", {
/* ... */
resolve: {
access: ["Access", function(Access) { return Access.hasRole("ADMIN"); }],
}
})
.otherwise({
redirectTo: "/home"
});
}]);
このように、Access
が約束を解決しない場合、$routeChangeError
イベントが発生します。
angular.run(["$rootScope", "Access", "$location",
function($rootScope, Access, $location) {
"use strict";
$rootScope.$on("$routeChangeError", function(event, current, previous, rejection) {
if (rejection == Access.UNAUTHORIZED) {
$location.path("/login");
} else if (rejection == Access.FORBIDDEN) {
$location.path("/forbidden");
}
});
}]);
この回答 の完全なコードを参照してください。