• <small id='MfQNF'></small><noframes id='MfQNF'>

        <bdo id='MfQNF'></bdo><ul id='MfQNF'></ul>
      1. <legend id='MfQNF'><style id='MfQNF'><dir id='MfQNF'><q id='MfQNF'></q></dir></style></legend>

        <i id='MfQNF'><tr id='MfQNF'><dt id='MfQNF'><q id='MfQNF'><span id='MfQNF'><b id='MfQNF'><form id='MfQNF'><ins id='MfQNF'></ins><ul id='MfQNF'></ul><sub id='MfQNF'></sub></form><legend id='MfQNF'></legend><bdo id='MfQNF'><pre id='MfQNF'><center id='MfQNF'></center></pre></bdo></b><th id='MfQNF'></th></span></q></dt></tr></i><div id='MfQNF'><tfoot id='MfQNF'></tfoot><dl id='MfQNF'><fieldset id='MfQNF'></fieldset></dl></div>
      2. <tfoot id='MfQNF'></tfoot>

        如何使用 AngularJS、Devise 和 UI Router 全局实现身份验证?

        How to globally implement Authentication with AngularJS, Devise and UI Router?(如何使用 AngularJS、Devise 和 UI Router 全局实现身份验证?)
      3. <i id='vCkdG'><tr id='vCkdG'><dt id='vCkdG'><q id='vCkdG'><span id='vCkdG'><b id='vCkdG'><form id='vCkdG'><ins id='vCkdG'></ins><ul id='vCkdG'></ul><sub id='vCkdG'></sub></form><legend id='vCkdG'></legend><bdo id='vCkdG'><pre id='vCkdG'><center id='vCkdG'></center></pre></bdo></b><th id='vCkdG'></th></span></q></dt></tr></i><div id='vCkdG'><tfoot id='vCkdG'></tfoot><dl id='vCkdG'><fieldset id='vCkdG'></fieldset></dl></div>
          <tbody id='vCkdG'></tbody>
      4. <tfoot id='vCkdG'></tfoot>

            • <bdo id='vCkdG'></bdo><ul id='vCkdG'></ul>

                <legend id='vCkdG'><style id='vCkdG'><dir id='vCkdG'><q id='vCkdG'></q></dir></style></legend>

                • <small id='vCkdG'></small><noframes id='vCkdG'>

                  本文介绍了如何使用 AngularJS、Devise 和 UI Router 全局实现身份验证?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着跟版网的小编来一起学习吧!

                  问题描述

                  我对 Angular 很陌生,所以这可能是一个新手问题.

                  I'm quite new to Angular so this might be a newbie question.

                  我正在尝试实现一个简单的任务管理器(只是一个练习),其中 Rails 作为后端,Angular 作为前端.到目前为止,我遵循了一个教程,一切正常.

                  I'm trying to implement a simple task manager (just an exercise) with Rails as backend and Angular as frontend. So far I followed a tutorial and everything worked fine.

                  现在我想全局实现身份验证.这意味着:当用户没有注册和登录时,她应该看到一个启动页面或登录页面.

                  Now I want to globally implement Authentication. That means: When a user is not registered and logged in, she should see a splash page or the login page.

                  我不想在每个 Angular 控制器中都这样做,因为 DRY.所以我认为 UI 路由器可能是一个好地方.而且我有点怀疑 $httpProvider.interceptors 可能有用.

                  I don't want to do that in every single Angular controller, because DRY. So I figured the UI Router might be a good place. And I have a slight suspicion that maybe $httpProvider.interceptors might be useful.

                  这就是我得到的.我可以检查用户是否经过身份验证并阻止页面加载.但仅此而已.我将如何离开这里?有没有我错过的好教程?

                  This is how far I got. I can check if a user is authenticated and prevent the page from loading. But nothing more. How would I go from here? Are there any good tutorials out there I missed?

                  这个问题在 Stackoverflow 上的方向类似,但不能解决我的问题问题,因为他们没有使用 Devise.

                  This question on Stackoverflow goes in a similar direction but doesn't solve my problem since they are not using Devise.

                  谢谢!

                  // app.js
                  var app = angular.module("TaskManager", ['ui.router', 'templates', 'Devise'])
                  .config([
                      '$stateProvider',
                      '$urlRouterProvider',
                      function($stateProvider, $urlRouterProvider){
                          $stateProvider
                              .state('home', {
                                  url: '/home',
                                  templateUrl: 'home/_home.html',
                                  controller: 'MainCtrl', 
                                  resolve: {
                                      projectPromise: ['projects', function(projects) {
                                          console.log($rootScope);
                                          return projects.getAll();
                                      }]
                                  }
                              })
                              .state('projects', {
                                  url: '/projects/{id}',
                                  templateUrl: 'projects/_projects.html',
                                  controller: 'ProjectsCtrl',
                                  resolve: {
                                      project: ['$stateParams', 'projects', function($stateParams, projects) {
                                          return projects.get($stateParams.id);
                                      }]
                                  }
                              })
                              .state('login', {
                                  url: '/login',
                                  templateUrl: 'auth/_login.html',
                                  controller: 'AuthCtrl',
                                  onEnter: ['$state', 'Auth', function($state, Auth) {
                                      Auth.currentUser().then(function() {
                                          $state.go('home');
                                      })
                                  }]
                              })
                              .state('register', {
                                  url: '/register',
                                  templateUrl: 'auth/_register.html',
                                  controller: 'AuthCtrl',
                                  onEnter: ['$state', 'Auth', function($state, Auth) {
                                      Auth.currentUser().then(function() {
                                          $state.go('home');
                                      })
                                  }]
                              });
                  
                          $urlRouterProvider.otherwise('home');
                      }
                  ]);
                  // run blocks
                  app.run(function($rootScope, Auth) {
                    // you can inject any instance here
                    $rootScope.$on('$stateChangeStart', 
                      function(event, toState, toParams, fromState, fromParams){ 
                          if(!Auth.isAuthenticated()) {
                              // So the magic should probably happen here. But how do I implement this?
                              // And how do I allow users to access the /login and /register page?
                              event.preventDefault(); 
                          }
                    })
                  });
                  

                  推荐答案

                  我写了一篇文章,基本上回答了这个问题(至少在高层次上),叫做 如何使用 AngularJS 和 Ruby on Rails 设置身份验证.

                  I wrote an article that basically answers this question (at a high level at least) called How to Set Up Authentication with AngularJS and Ruby on Rails.

                  如果您想检查用户是否在任何特定路由上通过身份验证,您可以(在 Angular 的标准路由器中,虽然我不知道 ui-router)使用 resolve.以下是我的一个旧项目中的几条路线:

                  If you want to check whether the user is authenticated at any particular route, you can (in Angular's standard router, although I don't know about ui-router) use resolve. Here are a couple routes from an older project of mine:

                        .when('/', {
                          templateUrl: 'views/main.html',
                          controller: 'MainCtrl',
                          isPublic: true
                        })
                        .when('/today', {
                          templateUrl: 'views/announcements.html',
                          controller: 'AnnouncementsCtrl',
                          resolve: {
                            auth: ['$auth', function($auth) {
                              return $auth.validateUser();
                            }]
                          }
                        })
                  

                  根路由是公开的,但 /today 需要身份验证.也许这也足以让您继续使用 ui-router.旁注:我真的应该更新我的文章来说明 ui-router(或 Angular 的新路由器),因为我认为没有多少人使用常规的旧 Angular 路由器.

                  The root route is public but /today requires authentication. Maybe that gives you enough to go on for ui-router as well. Side note: I should really update my article to account for ui-router (or Angular's new router) since I don't think many people use the regular old Angular router.

                  编辑:我在另一个项目中记得这件事.这是咖啡脚本.省略不相关的代码.

                  Edit: I remembered this thing from a different project of mine. This is CoffeeScript. Irrelevant code omitted.

                  使用严格"

                  angular.module("fooApp", [
                    "ngAnimate"
                    "ngCookies"
                    "ngResource"
                    "ngRoute"
                    "ngSanitize"
                    "ngTouch"
                    "ui.router"
                    "ng-token-auth"
                  ])
                  .run ($rootScope, $auth, $location) ->
                    $rootScope.$on "auth:login-success", -> $location.path "/"
                    $rootScope.$on "auth:logout-success", -> $location.path "/sign-in"
                    $rootScope.$on "$stateChangeStart", (event, next) ->
                      $auth.validateUser().then (->
                        if $location.path() == "/"
                          $location.path "/file-uploads"
                      ), ->
                        if !next.isPublic
                          $location.path "/sign-in"
                  

                  希望那里发生的事情是不言而喻的.这个项目使用 ui-router,你可以从 $stateChangeStart 看出.

                  Hopefully it's kind of self-evident what's going on there. This project DOES use ui-router, as you can tell from the $stateChangeStart.

                  这篇关于如何使用 AngularJS、Devise 和 UI Router 全局实现身份验证?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!

                  本站部分内容来源互联网,如果有图片或者内容侵犯了您的权益,请联系我们,我们会在确认后第一时间进行删除!

                  相关文档推荐

                  Toggle HTML radio button by clicking its label(通过单击标签来切换 HTML 单选按钮)
                  Javascript how to change radio button label text?(Javascript如何更改单选按钮标签文本?)
                  JavaScript radio button confirmation(JavaScript 单选按钮确认)
                  How can I automatically select specific radio buttons with Greasemonkey?(如何使用 Greasemonkey 自动选择特定的单选按钮?)
                  AngularJs. Is it possible to deselect HTML “radio” input by click?(AngularJs.是否可以通过单击取消选择 HTML“收音机输入?)
                  Checking Value of Radio Button Group via JavaScript?(通过 JavaScript 检查单选按钮组的值?)
                  <legend id='E08t2'><style id='E08t2'><dir id='E08t2'><q id='E08t2'></q></dir></style></legend>

                    <small id='E08t2'></small><noframes id='E08t2'>

                  • <i id='E08t2'><tr id='E08t2'><dt id='E08t2'><q id='E08t2'><span id='E08t2'><b id='E08t2'><form id='E08t2'><ins id='E08t2'></ins><ul id='E08t2'></ul><sub id='E08t2'></sub></form><legend id='E08t2'></legend><bdo id='E08t2'><pre id='E08t2'><center id='E08t2'></center></pre></bdo></b><th id='E08t2'></th></span></q></dt></tr></i><div id='E08t2'><tfoot id='E08t2'></tfoot><dl id='E08t2'><fieldset id='E08t2'></fieldset></dl></div>
                    • <bdo id='E08t2'></bdo><ul id='E08t2'></ul>

                    • <tfoot id='E08t2'></tfoot>

                          <tbody id='E08t2'></tbody>