【问题标题】:Angularjs authentication issueAngularjs身份验证问题
【发布时间】:2016-11-01 01:35:09
【问题描述】:

我正在尝试在我的 angularjs 应用程序中实现基于 JWT 的身份验证。但我正在努力解决请求标头问题。问题是我有一个调用服务的控制器,这个控制器返回一个令牌。这一步工作正常。

'use strict';

angular.module("home.controllers", ['home.services', 'ngStorage'])

.controller('HomeController', ['$scope', '$location', '$http', '$localStorage', 'HomeService',
function($scope, $location, $http, $localStorage, HomeService) {


    function login(user, password) {

        HomeService.login(user, password).then(

            function(loginResult) {
                var token = loginResult.token;

                if (loged()) {
                    $localStorage.token = token;
                    $http.defaults.headers.common.Authorization = 'Bearer ' + token;
                    console.log($location.path('secure/index'));
                    $location.path('secure/index');
                }
            },

            function(err) {
                console.error(err);
            }
        );
    }

    function loged() {
        return $scope.token !== null;
    }

    return {

        loged: function() {
            return loged();
        },

        login: function(user, password)) {
        return login(user, password)
    }
};

}]);

但问题是我想在登录后使用请求中的“Authentication”标头将用户重定向到“secure/index”,因为我有一个 Spring 过滤器检查所有“*/secure”路径是否具有该标头.

主要的app.js如下

'use strict';

angular.module("home", ['ui.router', 'home.controllers', 'urlLanguageStorage', 'pascalprecht.translate', 'ui.bootstrap', 'ngStorage'])

.config(['$stateProvider', '$translateProvider', '$urlRouterProvider',
    function($stateProvider, $translateProvider, $urlRouterProvider) {

        $translateProvider.useUrlLoader("home/mensajes");
        $translateProvider.useStorage("UrlLanguageStorage");
        $translateProvider.preferredLanguage("en");
        $translateProvider.fallbackLanguage("en");

        $stateProvider
            .state("home", {
                url: "/",
                templateUrl: "resources/js/home/views/home/home.html",
                controller: "HomeController"
            });

        $stateProvider
            .state("contacto", {
                url: "/contacto",
                templateUrl: "resources/js/home/views/contact/contac.html",
                controller: "HomeController"
            });
    }
])

.run(['$localStorage', '$http', function($localStorage, $http) {

    if ($localStorage.token) {
        $http.defaults.headers.common.Authorization = 'Bearer ' + $localStorage.token;
    }
}]);

问题是它不会重定向页面。我尝试使用 $window.href 而不是 $location ,它成功地重定向了页面,但请求中没有 auth 标头。

对此有什么想法/建议吗?请注意,我是 Angularjs 的初学者,所以可能还有更多错误。

提前致谢

【问题讨论】:

    标签: javascript java angularjs spring


    【解决方案1】:

    看起来一旦你有了你的令牌,你就会用$location.path('secure/index');重定向到secure/index。但是,您的示例代码没有显示映射到secure/index 的状态。

    【讨论】:

    • 请问,你能不能告诉我为什么我需要在 .运行我的模块?
    • 成功登录后,代码将令牌存储在 localStorage:$localStorage.token = token;。本地存储跨多个页面加载持续存在。运行块正在检查是否有任何先前的令牌并使用它。 $http.defaults.headers.common.Authorization = 'Bearer ' + $localStorage.token; 为每个 http 请求设置授权标头。如果没有这一行,您将不得不为发送到服务器的每个请求手动设置授权标头。
    猜你喜欢
    • 2015-08-25
    • 1970-01-01
    • 1970-01-01
    • 2016-11-02
    • 2013-07-23
    • 2010-11-17
    • 2019-06-19
    • 2018-10-08
    相关资源
    最近更新 更多