From 9fc88e6e5b5bd05c1e532246356725a3fa16a223 Mon Sep 17 00:00:00 2001 From: Igor Freire Date: Fri, 17 Jul 2015 14:39:32 -0300 Subject: [PATCH] Filter states for which login is required during state change A state parameter was added for the routes that require user authentication. Now, everytime a statechange occurs, the destination state is checked and user is redirected to signin page if necessary. Note the state parameter is added within `data`, so that nested states can inherent its value. --- .../client/config/articles.client.routes.js | 10 ++++++++-- modules/core/client/app/init.js | 14 ++++++++++++++ modules/users/client/config/users.client.routes.js | 5 ++++- .../settings/settings.client.controller.js | 3 --- 4 files changed, 26 insertions(+), 6 deletions(-) diff --git a/modules/articles/client/config/articles.client.routes.js b/modules/articles/client/config/articles.client.routes.js index c6890be3ef..c29de18814 100644 --- a/modules/articles/client/config/articles.client.routes.js +++ b/modules/articles/client/config/articles.client.routes.js @@ -16,7 +16,10 @@ angular.module('articles').config(['$stateProvider', }). state('articles.create', { url: '/create', - templateUrl: 'modules/articles/views/create-article.client.view.html' + templateUrl: 'modules/articles/views/create-article.client.view.html', + data: { + requiresLogin: true + } }). state('articles.view', { url: '/:articleId', @@ -24,7 +27,10 @@ angular.module('articles').config(['$stateProvider', }). state('articles.edit', { url: '/:articleId/edit', - templateUrl: 'modules/articles/views/edit-article.client.view.html' + templateUrl: 'modules/articles/views/edit-article.client.view.html', + data: { + requiresLogin: true + } }); } ]); diff --git a/modules/core/client/app/init.js b/modules/core/client/app/init.js index 5e144afce5..df0f7ffe14 100644 --- a/modules/core/client/app/init.js +++ b/modules/core/client/app/init.js @@ -10,6 +10,20 @@ angular.module(ApplicationConfiguration.applicationModuleName).config(['$locatio } ]); +angular.module(ApplicationConfiguration.applicationModuleName).run(function($rootScope, $state, Authentication) { + // Check authentication before changing state + $rootScope.$on('$stateChangeStart', function(event, toState, toParams, fromState, fromParams) { + if (toState.data && toState.data.requiresLogin && Authentication.user === '') { + event.preventDefault(); + $state.go('authentication.signin', {}, { + notify: false + }).then(function() { + $rootScope.$broadcast('$stateChangeSuccess', 'authentication.signin', {}, toState, toParams); + }); + } + }); +}); + //Then define the init function for starting up the application angular.element(document).ready(function() { //Fixing facebook bug with redirect diff --git a/modules/users/client/config/users.client.routes.js b/modules/users/client/config/users.client.routes.js index 4c00bc0651..69c01b55b7 100644 --- a/modules/users/client/config/users.client.routes.js +++ b/modules/users/client/config/users.client.routes.js @@ -8,7 +8,10 @@ angular.module('users').config(['$stateProvider', state('settings', { abstract: true, url: '/settings', - templateUrl: 'modules/users/views/settings/settings.client.view.html' + templateUrl: 'modules/users/views/settings/settings.client.view.html', + data: { + requiresLogin: true + } }). state('settings.profile', { url: '/profile', diff --git a/modules/users/client/controllers/settings/settings.client.controller.js b/modules/users/client/controllers/settings/settings.client.controller.js index 090abc86c4..7c8d1b6569 100644 --- a/modules/users/client/controllers/settings/settings.client.controller.js +++ b/modules/users/client/controllers/settings/settings.client.controller.js @@ -3,8 +3,5 @@ angular.module('users').controller('SettingsController', ['$scope', '$location', 'Authentication', function($scope, $location, Authentication) { $scope.user = Authentication.user; - - // If user is not signed in then redirect back home - if (!$scope.user) $location.path('/'); } ]);