L'accès de la portée ou de service dans l'interface utilisateur du routeur onEnter à la vérification d'accès (auth)
Ok, j'ai donc un état à l'url "/securepage" qu'ai-je besoin de vérifier à chaque fois qu'un utilisateur tente d'accéder. J'ai donc lu il y a un onEnter fonction que je peux utiliser. Mais je n'arrive pas à mettre la main sur la portée ou un service à partir de là. Ce que je fais mal?
.state('securepage', {
url: "/securepage",
template: securepage.html,
onEnter: function(){
//if (!$scope.main.isAuthenticated) $state.go("/login");
//if (!myLoginService.currentUser()) $state.go("/login");
Les options actuelles comme je le vois à l'utilisation de résoudre et/ou vérifier l'authentification dans le contrôleur. Mais wouldnt un auth vérifier d'être mieux placé dans onEnter?
Vous devez vous connecter pour publier un commentaire.
J'ai rencontré un problème similaire aujourd'hui. Passé une journée entière et enfin est venu avec une solution viable autres que celles déjà proposées.
Mon principal objectif est de trouver de manière simple et efficace de manière sélective sécurisation de certaines des pages web spécifiques. La vérification de la sécurité doit être effectué avant le HTML ou à l'un des contrôleurs concernés sont chargés ou appelé. Si la vérification échoue, la page peut être transmis à une autre sans aucun des effets secondaires des autres contrôleurs.
J'ai essayé les autres approches suggérées. Chacun a son propre ensemble de problèmes:
À L'Aide De OnEnter:
À l'aide de $rootScope.$sur('$stateChangeStart'):
Ma solution est d'utiliser une résolution de fonction pour définir une promesse qui sera la cause de la vue des contrôleurs à attendre pour le report de la remplir avant qu'ils sont appelés. Cela fonctionne parfaitement pour le blocage de la manette à partir de départ de façon asynchrone.
Voici une ébauche de code que j'ai utilisé:
J'espère que cela aidera certains d'entre vous.
$state.go()
immédiatement, il échoue parfois à changer d'état (par exemple, si vous accédez directement à l'URL). Forcer la vérification de l'arriver de manière asynchrone permet d'éviter tout problème. (par exemple,$timeout(function(){if (...) $state.go(...);});
resolve: { loginRequired : ['$q', '$rootScope', '$state', accessRestrictionHandler] }
Une autre approche serait d'avoir un service/contrôleur écouter le "$stateChangeStart" de l'événement. Là, vous pouvez vérifier si l'etat a besoin d'une authentification et de rediriger la demande. Voici un extrait:
isAuthenticated
pourrait tenir l'appel à vos services, cocheznextState.data
pour l'authentification liées à des propriétés, etc.Découvrez ce question et cette exemple à partir de leur page github. Il devrait vous donner quelques indices.
Une réponse tardive mais je préfère l'écrire de toute façon. Je préfère ne pas toucher à l' $rootScope dans la mesure du possible. Voici le code que je suis en train de travailler sur ce qui résume une autre solution pour votre question:
Je suis en utilisant JWTs pour stocker les jetons sur le localstorage en utilisant ngStorage qui donne un $localStorage service que j'ai injecter dans le Auth usine j'ai injecté dans onEnter
probablement vous dire
Je suis en utilisant angularjs 1.3 avec l'interface utilisateur.routeur 0.2.10
Je suis sûr que beaucoup de choses ont changé depuis que cette question a été posée, mais comme j'ai eu à le comprendre moi-même et ma recherche m'a conduit ici...
Aussi loin que la vérification de l'authentification de vous pourrait-il faire comme ce
Vous pouvez mettre assez bien fournisseur/service/de l'usine dans le onEnter fonction pour accéder à celle-ci, et cela fonctionne à partir de l'intérieur .config de l'application.
Cela dit, ils (ui-router décideurs) suggère d'utiliser des règle personnalisée fonction de la poignée à l'intérieur .$sur('$stateChangeStart', function(e, de) https://github.com/angular-ui/ui-router/wiki/Frequently-Asked-Questions#how-to-create-rules-to-prevent-access-to-a-state
Je ne sais pas pourquoi ils le font au lieu de onEnter, peut-être quelqu'un pourrait étendre sur ce point.