Angularjs ui-router. 로그인 페이지로 리디렉션하는 방법
대시 보드 , dahboard.main , dashboard.minor , login의 4 가지 상태가 있습니다 . 대시 보드는 추상적이며 .minor 및 .main 상태의 상위 상태입니다. 아래는 내 코드입니다.
.state('dashboard', {
url: "/dashboard",
abstract: true,
templateUrl: "views/dashboard.html",
resolve: {
auth: function ($q, authenticationSvc) {
var userInfo = authenticationSvc.getUserInfo();
if (userInfo) {
return $q.when(userInfo);
} else {
return $q.reject({ authenticated: false });
}
}
},
controller: "DashboardCtrl",
data: { pageTitle: 'Example view' }
})
.state('dashboard.main', {
url: "",
templateUrl: "views/main.html",
controller: "DashboardCtrl",
data: { pageTitle: 'Main view' }
})
대시 보드 상태에서 볼 수 있듯이 해결 옵션이 있습니다. 이로써 권한이없는 사용자를 로그인 페이지로 리디렉션하고 싶습니다. 이러한 이유로 특수 authenticationSvc 서비스를 사용 합니다.
.factory("authenticationSvc", ["$http", "$q", "$window", function ($http, $q, $window) {
var userInfo;
function login(email, password) {
var deferred = $q.defer();
$http.post("/api/login", { email: email, password: password })
.then(function (result) {
if(result.data.error == 0) {
userInfo = {
accessToken: result.data.accessToken
};
$window.sessionStorage["userInfo"] = JSON.stringify(userInfo);
deferred.resolve(userInfo);
}
else {
deferred.reject(error);
}
}, function (error) {
deferred.reject(error);
});
return deferred.promise;
}
function getUserInfo() {
return userInfo;
}
return {
login: login,
logout: logout,
getUserInfo: getUserInfo
};
}]);
구성 에서 인증 값을 확인합니다 .
.run(function($rootScope, $location, $state) {
$rootScope.$state = $state;
$rootScope.$on("routeChangeSuccess", function(userInfo) {
consol.log(userInfo);
});
$rootScope.$on("routeChangeError", function(event, current, previous, eventObj) {
if(eventObj.authenticated === false) {
$state.go('login');
}
});
});
그러나 불행히도 웹 사이트 루트 또는 대시 보드 상태로 이동하면 빈 페이지가 나타납니다. 이 코드에 어떤 문제가 있습니까? 감사!
The point is, do not redirect if not needed === if already redirected to intended state. There is a working plunker with similar solution
.run(function($rootScope, $location, $state, authenticationSvc) {
$rootScope.$on( '$stateChangeStart', function(e, toState , toParams
, fromState, fromParams) {
var isLogin = toState.name === "login";
if(isLogin){
return; // no need to redirect
}
// now, redirect only not authenticated
var userInfo = authenticationSvc.getUserInfo();
if(userInfo.authenticated === false) {
e.preventDefault(); // stop current execution
$state.go('login'); // go to login
}
});
});
Check these for similar explanation:
- Angular ui router - Redirection doesn't work at all
- How can I fix 'Maximum call stack size exceeded' AngularJS
Since you are using UI-Router module, you should be using $stateChangeStart
, $stateChangeSuccess
events.
Check this link for more: https://github.com/angular-ui/ui-router/issues/17
Also there is a typo in consol.log(userInfo)
in console.
Check the console in your chrome-dev-tools. It will give idea if something else is missing.
Beware that actually $stateChangeSuccess
event is deprecated and no longer available in angular-ui-route
package. Now, this behavior is handled by transition hooks
. You could achieve your purpose using $transitions.onStart
as follows:
run.$inject = ['$transitions', 'authenticationSvc'];
function run($transitions, authenticationSvc) {
$transitions.onStart({}, function (trans) {
var userInfo = authenticationSvc.getUserInfo();
var $state = trans.router.stateService;
if(userInfo.authenticated === false) {
$state.go('login'); // go to login
}
});
}
ReferenceURL : https://stackoverflow.com/questions/27212182/angularjs-ui-router-how-to-redirect-to-login-page
'programing tip' 카테고리의 다른 글
Spring Security에서 새로운 PasswordEncoder를 사용하는 방법 (0) | 2021.01.08 |
---|---|
고 루틴은 어떻게 작동합니까? (0) | 2021.01.08 |
메모리를 확보하는 좋은 방법입니까? (0) | 2021.01.08 |
Java 웹 애플리케이션 (WAR)에서 구성 파일을 저장하는 가장 좋은 위치는 무엇입니까? (0) | 2021.01.08 |
Django ModelChoiceField : 쿼리 세트 필터링 및 기본값을 객체로 설정 (0) | 2021.01.07 |