Tengo una aplicación AngularJS creada usando Yeoman, Grunt y Bower.
Tengo una página de inicio de sesión que tiene un controlador que verifica la autenticación. Si las credenciales son correctas, redirijo a la página de inicio.
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";
}
}
});
En la página de inicio tengo
<span class="user-info">
<small>Welcome,</small>
{{user.name}}
</span>
<span class="logout"><a href="" ng-click="logoutUser()">Logout</a></span>
En el loginController
, verifico la información de inicio de sesión y, si tiene éxito, configuro el objeto de usuario en la fábrica de servicios. No sé si esto es correcto o no.
Lo que necesito es que, cuando el usuario inicia sesión, establece un valor en el objeto de usuario para que todas las demás páginas puedan obtener ese valor.
Siempre que ocurran cambios en la ruta, el controlador debe verificar si el usuario ha iniciado sesión o no. De lo contrario, debe redirigirse a la página de inicio de sesión. Además, si el usuario ya ha iniciado sesión y vuelve a la página, debe ir a la página de inicio. El controlador también debe verificar las credenciales en todas las rutas.
He oído hablar de ng-cookies, pero no sé cómo usarlas.
Muchos de los ejemplos que vi no eran muy claros y usan algún tipo de roles de acceso o algo así. No quiero eso Solo quiero un filtro de inicio de sesión. ¿Alguien me puede dar algunas ideas?
routeChangeStart
devolución de llamada debe verificar si la ubicación es realmente "/ login" y permitir que:if ( $location.path() === "/login" ) return;
Aquí hay otra posible solución, utilizando el
resolve
atributo de$stateProvider
o el$routeProvider
. Ejemplo con$stateProvider
:Access
resuelve o rechaza una promesa en función de los derechos de usuario actuales:UserProfile
Copia las propiedades actuales del usuario, y poner en práctica el$hasRole
,$hasAnyRole
,$isAnonymous
y$isAuthenticated
métodos de la lógica (además de un$refresh
método, explican más adelante):Auth
se encarga de solicitar al servidor, para conocer el perfil de usuario (vinculado a un token de acceso adjunto a la solicitud, por ejemplo):Se espera que el servidor devuelva dicho objeto JSON cuando solicite
GET api/auth
:Finalmente, cuando
Access
rechaza una promesa, si se usaui.router
,$stateChangeError
se disparará el evento:Si se usa
ngRoute
, el$routeChangeError
evento se disparará:También se puede acceder al perfil de usuario en los controladores:
UserProfile
luego contiene las propiedades devueltas por el servidor cuando solicitaGET api/auth
:UserProfile
necesita actualizarse cuando un usuario inicia o cierra sesión, para queAccess
pueda manejar las rutas con el nuevo perfil de usuario. Puede recargar toda la página o llamarUserProfile.$refresh()
. Ejemplo al iniciar sesión:fuente
La manera más simple de definir el comportamiento personalizado para rutas individuales sería bastante fácil:
1)
routes.js
: crea una nueva propiedad (comorequireAuth
) para cualquier ruta deseada2) En un controlador de nivel superior que no esté vinculado a un elemento dentro del
ng-view
(para evitar conflictos con angular$routeProvider
), verifique sinewUrl
tiene larequireAuth
propiedad y actúe en consecuenciafuente
routes.js
.Hace unos meses escribí una publicación sobre cómo configurar el registro de usuarios y la funcionalidad de inicio de sesión con Angular, puede consultarlo en http://jasonwatmore.com/post/2015/03/10/AngularJS-User-Registration-and -Login-Example.aspx
Compruebo si el usuario ha iniciado sesión en el
$locationChangeStart
evento, aquí está mi app.j principal que muestra esto:fuente
Siento que esta manera es más fácil, pero tal vez es solo una preferencia personal.
Cuando especifique su ruta de inicio de sesión (y cualquier otra ruta anónima; por ejemplo: / register, / logout, / refreshToken, etc.), agregue:
Entonces, algo como esto:
No es necesario que especifique "allowAnonymous: false"; si no está presente, se supone que es falso en el cheque. En una aplicación donde la mayoría de las URL se autentican forzosamente, esto es menos trabajo. Y más seguro; Si olvida agregarlo a una nueva URL, lo peor que puede suceder es que una URL anónima esté protegida. Si lo hace de la otra manera, especificando "requireAuthentication: true", y olvida agregarlo a una URL, está filtrando una página sensible al público.
A continuación, ejecute esto donde le parezca más adecuado para el diseño de su código.
fuente
app.js
loginServices.js
sessionServices.js
loginCtrl.js
fuente
Puedes usar
resolve
:Y, la función de la resolución:
Firebase también tiene un método que te ayuda a instalar un observador, te aconsejo que lo instales dentro de
.run
:fuente
Por ejemplo, una aplicación tiene dos usuarios llamados ap y auc. Estoy transfiriendo una propiedad adicional a cada ruta y manejando la ruta en función de los datos que obtengo en $ routeChangeStart.
Prueba esto:
app.js:
fuente
Todos han sugerido una gran solución por qué te preocupa la sesión en el lado del cliente. Quiero decir que cuando el estado / url cambia, supongo que estás haciendo una llamada ajax para cargar los datos de template.
Ahora el servidor devuelve los datos ajax utilizando cualquier api. Ahora que el punto entró en juego, devuelva los tipos de devolución estándar utilizando el servidor de acuerdo con el estado de inicio de sesión del usuario. Verifique esos códigos de retorno y procese su solicitud en el controlador. Nota: - Para el controlador que no requiere una llamada ajax de forma nativa, puede llamar una solicitud en blanco al servidor como este
server.location/api/checkSession.php
y esto es checkSession.phpEn el lado del cliente dentro del controlador o mediante cualquier servicio como se muestra en otras respuestas
Nota: - Actualizaré más mañana o en el futuro
fuente
Debe verificar la autenticación del usuario en dos sitios principales.
'$routeChangeStart'
devolución de llamadafuente