<!DOCTYPE html>
<html ng-app="app">
<head>
<script data-require="angular.js@1.5.6" data-semver="1.5.6" src="https://code.angularjs.org/1.5.6/angular.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/angular-ui-router/1.0.0-alpha0/angular-ui-router.min.js"></script>
<script data-require="angular-ui-bootstrap@*" data-semver="1.3.3" src="https://cdnjs.cloudflare.com/ajax/libs/angular-ui-bootstrap/1.3.3/ui-bootstrap-tpls.js"></script>
<script data-require="jquery@2.1.1" data-semver="2.1.1" src="//cdnjs.cloudflare.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script data-require="bootstrap.js@3.3.6" data-semver="3.3.6" src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/angular-messages/1.5.6/angular-messages.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/ngStorage/0.3.10/ngStorage.min.js"></script>
<link data-require="bootstrap-css@3.3.6" data-semver="3.3.6" rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.css" />
<script src="app.js"></script>
<script src="base.controller.js"></script>
<script src="home.controller.js"></script>
<script src="login.controller.js"></script>
<script src="about.controller.js"></script>
</head>
<body ng-cloak="">
<div ng-controller="navController">
<nav class="navbar navbar-inverse" role="navigation" >
<div class="navbar-header">
<a class="navbar-brand" href="#/" >Angular Learning</a>
</div>
<ul class="nav navbar-nav">
<li><a ui-sref="home">Home</a></li>
<li><a ui-sref="about">About</a></li>
</ul>
<ul class="nav navbar-nav pull-right">
<li ng-if="!isAuthorized()"><a ui-sref="login">Login</a></li>
<li ng-if="isAuthorized()" ><a href="" ng-click="logout()">Logout</a></li>
</ul>
</nav>
<h3 ng-if="isAuthorized()"> Welcome {{user.username}}</h3>
</div>
<div ui-view=""></div>
</body>
</html>
/* Styles go here */
USER authentication module
related to :
http://stackoverflow.com/questions/38137489/user-authentication-issue-unable-to-access-data-attribute-by-transitions-onent
(function () {
'use strict';
var app = angular.module('app', ['ui.router','ngMessages','ngStorage','login']);
app
.constant('AUTH_EVENTS', {
loginSuccess: 'auth-login-success',
loginFailed: 'auth-login-failed',
logoutSuccess: 'auth-logout-success',
sessionTimeout: 'auth-session-timeout',
notAuthenticated: 'auth-not-authenticated',
notAuthorized: 'auth-not-authorized'
});
app
.constant('USER_ROLES', {
all: '*',
admin: 'admin',
editor: 'editor',
guest: 'guest'
});
app.config(['$stateProvider',
'$urlRouterProvider',
'$httpProvider',
'$transitionsProvider',
'$localStorageProvider',
'USER_ROLES', 'AUTH_EVENTS',
function($stateProvider,
$urlRouterProvider,
$httpProvider,
$transitionsProvider,
$localStorageProvider,
USER_ROLES, AUTH_EVENTS) {
$stateProvider
.state("base", {
url : "/",
templateUrl: "base.html",
controller: 'BaseController',
data : {},
})
.state("home", {
url: '/home',
templateUrl: 'home.html',
controller: 'HomeController',
data : { pageTitle : 'Home', requiresAuth: true, authorizedRoles: [USER_ROLES.admin, USER_ROLES.editor] }
})
.state("about", {
url: '/about',
templateUrl: 'about.html',
controller: 'aboutController',
data : { pageTitle : 'About' }
})
.state("login", {
url: '/login',
templateUrl: 'login.html',
controller: 'LoginController',
controllerAs : 'vm',
params : {'returnTo' : null },
data : { pageTitle : 'Login' }
// resolve : { returnTo : returnTo }
});
$urlRouterProvider.otherwise("/");
$localStorageProvider.setKeyPrefix('');
}]);
function returnTo ($transition$) {
var redirectedFrom = $transition$.previous();
// The user was redirected to the login state (via the requiresAuth hook)
if (redirectedFrom !== null) {
// Follow the current transition's redirect chain all the way back to the original attempted transition
while (redirectedFrom.previous()) {
redirectedFrom = redirectedFrom.previous();
}
// return to the original attempted "to state"
return { state: redirectedFrom.to(), params: redirectedFrom.params("to") };
}
var fromState = $transition$.from();
var fromParams = $transition$.params("from");
if (fromState.name !== '') {
return {state: fromState, params: fromParams};
}
// If the fromState's name is empty, then this was the initial transition. Just return them to the home state
return { state: 'base' };
}
app.run(['$rootScope', '$state', '$timeout', '$transitions', 'AUTH_EVENTS',
function ($rootScope, $state, $timeout, $transitions, AUTH_EVENTS, AuthService) {
$rootScope.state = $state; // for page title
$rootScope.$on(AUTH_EVENTS.loginSuccess, function(event) {
console.log('successfull loggen in');
$timeout(function() { $state.go($rootScope.returnTo); });
});
$rootScope.$on(AUTH_EVENTS.logoutSuccess, function(event) {
return $state.go('base', {}, { reload: true });
});
var requiresAuthCriteria = {
to: function (state) {
return state.data && state.data.requiresAuth;
}
};
var redirectToLogin = function($transition$, $injector) {
var AuthService = $injector.get('AuthService');
if (!AuthService.isAuthenticated()) {
return $state.target('login', { returnTo : $transition$.to().name });
} else {
var roles = $transition$.to().data.authorizedRoles;
if(AuthService.isAuthorized(roles)) {
console.log('Authorized');
} else {
return $state.target('about', undefined, { location: false });
}
}
};
$transitions.onBefore(requiresAuthCriteria, redirectToLogin, {priority: 10} );
}]);
app.controller('navController', ['$scope','$rootScope', 'AuthService', 'AUTH_EVENTS',
function ($scope, $rootScope, AuthService, AUTH_EVENTS) {
$scope.user = '';
$scope.isAuthorized = function(){
return AuthService.isAuthenticated();
};
$scope.user = AuthService.getCurrentUser();
$scope.logout = function() {
AuthService.logout();
$rootScope.$broadcast(AUTH_EVENTS.logoutSuccess);
};
}]);
}());
<div class="container">
<div class="jumbotron text-center">
<h1> The {{ title }} </h1>
Today's date: {{ timeNow | date:'dd-MM-yyyy' }}
</div>
</div>
(function() {
var app = angular.module('app');
var BaseController = function ($scope) {
$scope.title = "BASE";
$scope.timeNow = new Date().getTime();
};
app.controller('BaseController', BaseController );
}());
<div class="jumbotron text-center">
<h1> The {{ title }} </h1>
</div>
<div class="col-lg-6" >
<em> write 'guest' in `username` and `password` </em>
<form name="vm.loginForm" ng-submit="vm.login(credentials)" novalidate >
<div class="form-froup" >
<label for="username">Username:</label>
<input type="text" name="username" ng-model="credentials.username" ng-minlength="3" class="form-control" required placeholder="username" >
<div ng-if="vm.loginForm.username.$touched" ng-messages="vm.loginForm.username.$error" >
<p ng-message="minlength">username is too short.</p>
<p ng-message="required">username is required.</p>
</div>
</div>
<div class="form-group">
<label for="password">Password:</label>
<input name="password" type="password" ng-model="credentials.password" class="form-control" required placeholder="password">
<div ng-if="vm.loginForm.password.$touched" ng-messages="vm.loginForm.password.$error">
<p ng-message="required">password is required.</p>
</div>
</div>
<div class="form-group">
<button type="submit" ng-disabled="!vm.loginForm.$valid" class="btn btn-inverse btn-primary" >Login</button>
<button type="reset" class="btn btn-warn" ng-click="vm.reset()">Reset</button>
</div>
</form>
</div>
(function() {
'use strict';
var login = angular.module('login',[]);
login
.controller('LoginController', function($rootScope, $stateParams, AUTH_EVENTS, AuthService){
var self = this;
self.login = function(credentials){
AuthService.login(credentials).then(function(user){
$rootScope.returnTo = $stateParams.returnTo;
$rootScope.$broadcast(AUTH_EVENTS.loginSuccess);
AuthService.setCurrentUser(user);
}, function (){
$rootScope.$broadcast(AUTH_EVENTS.loginFailed);
});
};
self.reset = function () {
self.credentials = { };
self.loginForm.$setPristine();
self.loginForm.$setValidity();
self.loginForm.$setUntouched();
};
});
login
.factory('AuthService', function($http, $q, $localStorage){
var authService = {};
var currentUser;
authService.login = function (credentials) {
var deferred = $q.defer();
$http
.get('user.json', credentials)
.then( function (res) {
deferred.resolve(res.data);
}, function(error) {
// console.log(error);
deferred.reject(error);
});
return deferred.promise;
};
authService.logout = function () {
var deferred = $q.defer();
$http({
method: "GET",
url: 'logout.json'
}).then(function(result) {
// Session.destroy();
delete $localStorage.currentUser;
deferred.resolve(result);
}, function(error) {
console.log('Error');
deferred.reject(error);
});
return deferred.promise;
};
authService.setCurrentUser = function(user) {
$localStorage.currentUser = user;
};
authService.getCurrentUser = function () {
return $localStorage.currentUser;
};
authService.isAuthenticated = function () {
if($localStorage.currentUser) {
return true;
} else {
return false;
}
};
authService.isAuthorized = function (authorizedRoles) {
if(!angular.isArray(authorizedRoles)) {
authorizedRoles = [authorizedRoles];
}
return (authService.isAuthenticated && authorizedRoles.indexOf($localStorage.currentUser.role) !== -1 );
};
return authService;
});
}());
(function() {
'use strict';
angular
.module('app')
.controller('HomeController', function($scope,$timeout) {
$scope.title = "Home Page";
});
}());
{
"id":1,
"role":"admin",
"username":"Alpha"
}
<div class="jumbotron text-center">
<h1>The About Page</h1>
<p>This page demonstrates <span class="text-danger">multiple</span> and <span class="text-danger">named</span> views.</p>
{{ message }}
</div>
<div class="row">
<!-- COLUMN ONE NAMED VIEW -->
<div class="col-sm-6">
<div ui-view="columnOne"></div>
</div>
<!-- COLUMN TWO NAMED VIEW -->
<div class="col-sm-6">
<div ui-view="columnTwo"></div>
</div>
</div>
(function() {
"use strict";
angular
.module("app")
.controller('aboutController', function($scope) {
$scope.message = 'About us';
});
}());
{"status": true }