У меня есть приложение AngularJS, созданное с использованием yeoman, grunt и bower.
У меня есть страница входа в систему с контроллером, который проверяет аутентификацию. Если учетные данные верны, я перенаправляюсь на домашнюю страницу.
app.js
'use strict';
//Define Routing for app
angular.module('myApp', []).config(['$routeProvider', '$locationProvider',
function($routeProvider,$locationProvider) {
$routeProvider
.when('/login', {
templateUrl: 'login.html',
controller: 'LoginController'
})
.when('/register', {
templateUrl: 'register.html',
controller: 'RegisterController'
})
.when('/forgotPassword', {
templateUrl: 'forgotpassword.html',
controller: 'forgotController'
})
.when('/home', {
templateUrl: 'views/home.html',
controller: 'homeController'
})
.otherwise({
redirectTo: '/login'
});
// $locationProvider.html5Mode(true); //Remove the '#' from URL.
}]);
angular.module('myApp').factory("page", function($rootScope){
var page={};
var user={};
page.setPage=function(title,bodyClass){
$rootScope.pageTitle = title;
$rootScope.bodylayout=bodyClass;
};
page.setUser=function(user){
$rootScope.user=user;
}
return page;
});
LoginControler.js
'use strict';
angular.module('myApp').controller('LoginController', function($scope, $location, $window,page) {
page.setPage("Login","login-layout");
$scope.user = {};
$scope.loginUser=function()
{
var username=$scope.user.name;
var password=$scope.user.password;
if(username=="admin" && password=="admin123")
{
page.setUser($scope.user);
$location.path( "/home" );
}
else
{
$scope.message="Error";
$scope.messagecolor="alert alert-danger";
}
}
});
На домашней странице у меня есть
<span class="user-info">
<small>Welcome,</small>
{{user.name}}
</span>
<span class="logout"><a href="" ng-click="logoutUser()">Logout</a></span>
В loginController
, я проверяю информацию для входа в систему и, если она успешна, я устанавливаю объект пользователя в фабрике служб. Не знаю, правильно это или нет.
Мне нужно, когда пользователь вошел в систему, он устанавливает некоторое значение в объекте пользователя, чтобы все другие страницы могли получить это значение.
Всякий раз, когда происходят какие-либо изменения маршрута, контроллер должен проверить, вошел ли пользователь в систему или нет. Если нет, он должен перенаправиться на страницу входа. Кроме того, если пользователь уже вошел в систему и вернулся на страницу, он должен перейти на домашнюю страницу. Контроллер также должен проверить учетные данные на всех маршрутах.
Я слышал о ng-cookies, но не знаю, как их использовать.
Многие из примеров, которые я видел, были не очень ясными, и в них использовались какие-то роли доступа или что-то в этом роде. Я не хочу этого Мне нужен только фильтр входа в систему. Кто-нибудь может дать мне несколько идей?
routeChangeStart
if ( $location.path() === "/login" ) return;
Вот еще одно возможное решение, использующее
resolve
атрибут$stateProvider
или$routeProvider
. Пример с$stateProvider
:Access
разрешает или отклоняет обещание в зависимости от текущих прав пользователя:UserProfile
копирует текущие пользовательские свойства, а также реализовать$hasRole
,$hasAnyRole
,$isAnonymous
и$isAuthenticated
методы , логика (плюс$refresh
метод, объяснено позже):Auth
отвечает за запрос к серверу, чтобы узнать профиль пользователя (например, связанный с токеном доступа, прикрепленным к запросу):Ожидается, что сервер вернет такой объект JSON при запросе
GET api/auth
:Наконец, когда
Access
отвергает обещание, если используетсяui.router
, то$stateChangeError
событие будет уволено:При использовании
ngRoute
, то$routeChangeError
событие будет уволен:К профилю пользователя также можно получить доступ в контроллерах:
UserProfile
затем содержит свойства, возвращаемые сервером при запросеGET api/auth
:UserProfile
необходимо обновлять, когда пользователь входит или выходит из системы, чтобы онAccess
мог обрабатывать маршруты с новым профилем пользователя. Вы можете либо перезагрузить страницу целиком, либо позвонитьUserProfile.$refresh()
. Пример при входе в систему:источник
Самый простой способ определения пользовательского поведения для отдельных маршрутов был бы довольно простым:
1)
routes.js
: создайте новое свойство (напримерrequireAuth
) для любого желаемого маршрута2) В контроллере верхнего уровня, который не привязан к элементу внутри
ng-view
(чтобы избежать конфликта с angular$routeProvider
), проверьте, есть ли уnewUrl
негоrequireAuth
свойство, и действуйте соответственноисточник
routes.js
.Несколько месяцев назад я написал сообщение о том, как настроить функцию регистрации и входа в систему с помощью Angular, вы можете проверить это на http://jasonwatmore.com/post/2015/03/10/AngularJS-User-Registration- и -login-Example.aspx
Я проверяю, вошел ли пользователь в
$locationChangeStart
событие, вот мой основной app.js, показывающий это:источник
Мне кажется, это самый простой способ, но, возможно, это просто личные предпочтения.
Когда вы указываете свой маршрут входа (и любые другие анонимные маршруты; например: / register, / logout, / refreshToken и т. Д.), Добавьте:
Итак, как то так:
Вам никогда не нужно указывать «allowAnonymous: false», если нет, в проверке предполагается ложь. В приложении, где большинство URL-адресов принудительно аутентифицируются, это требует меньше усилий. И безопаснее; если вы забудете добавить его к новому URL-адресу, худшее, что может случиться, - это защита анонимного URL-адреса. Если вы сделаете это по-другому, указав "requireAuthentication: true", и забудете добавить его к URL-адресу, вы сделаете конфиденциальную страницу публичной.
Затем запустите это там, где вы считаете, что дизайн вашего кода лучше всего подходит.
источник
app.js
loginServices.js
sessionServices.js
loginCtrl.js
источник
Вы можете использовать
resolve
:И функция разрешения:
Firebase также имеет метод, который поможет вам установить наблюдателя, я советую установить его внутри
.run
:источник
Например, в приложении есть два пользователя: ap и auc. Я передаю дополнительное свойство каждому маршруту и обрабатываю маршрутизацию на основе данных, которые я получаю в $ routeChangeStart.
Попробуй это:
app.js:
источник
Все предложили большое решение, почему вы беспокоитесь о сеансе на стороне клиента. Я имею в виду, что при изменении состояния / URL-адреса, я полагаю, вы выполняете вызов ajax для загрузки данных для tempelate.
Теперь данные ajax возвращаются сервером с использованием любого API. Теперь дело в том, что возвращать стандартные типы возвращаемых данных с использованием сервера в соответствии со статусом авторизованного пользователя. Проверьте эти коды возврата и обработайте свой запрос в контроллере. Примечание: - Для контроллера, который изначально не требует вызова ajax, вы можете вызвать пустой запрос на сервер, как это,
server.location/api/checkSession.php
и это checkSession.phpНа стороне клиента внутри контроллера или через любую службу, как показано в других ответах
Примечание: - Я обновлю больше завтра или в будущем
источник
Вам следует проверить аутентификацию пользователя на двух основных сайтах.
'$routeChangeStart'
обратного вызоваисточник