当前位置: 首页 > 面试题库 >

如果未通过异常身份验证,则angularjs重定向到登录页面

公孙宏畅
2023-03-14
问题内容

编辑:忘记提及我与AngularJs在一起仅一周了,因此,如果您看到某些东西,您认为应该做得更好,并且与问题无关,请随时在评论部分告诉我。

好的,所以我有我的身份验证控制器和提供程序,由于它们与问题范围无关,因此将不显示。然后,我有一个拦截器来检查拨打电话时用户是否已通过身份验证。如果是这样,我将Authentication请求的标头设置为包括用户的Token(如果没有),则将用户重定向到登录页面,甚至不向服务器发出请求(很明显,如果有人绕过此请求,AuthorizeAPI上也会有一个)。

我想要添加一些例外,这意味着即使用户没有身份验证令牌,我也希望允许某些页面。如果是特定路径,我可以执行此操作,但是我想允许访问我的404页面,并且它位于Routing我指定.otherwise要转到404页面的位置,我该如何做以使我的拦截器仅重定向到如果不转到此页面,请登录。

拦截器

.factory('authInterceptorService', ['$q', '$location', 'localStorageService', function ($q, $location, localStorageService) {

    var authInterceptorServiceFactory = {};

    var authData = localStorageService.get('authorizationData');

    var _request = function (config) {

        config.headers = config.headers || {};

        if (authData) {
            config.headers.Authorization = 'Bearer ' + authData.token;
        } else if ($location.path != '/accounts/login' && $location.path != '/accounts/register') {
            $location.path('/accounts/login');
        }

        return config;
    }

    var _responseError = function (rejection) {
        if (rejection.status === 401) {
            $location.path('/accounts/login');
        }
        return $q.reject(rejection);
    }

    authInterceptorServiceFactory.request = _request;
    authInterceptorServiceFactory.responseError = _responseError;

    return authInterceptorServiceFactory;
}])

在我的路由中

 $urlRouterProvider.otherwise('/page-not-found');

 $stateProvider
     (...)//rest of the states

     .state('page-not-found', {
         url: '/page-not-found',
         templateUrl: '/Content/partials/error/404.html',
         data: {
             displayName: false
         }
     })

     (...)//rest of the states

我试图添加'/page-not-found'到我的文件中,if但是它不能按预期工作,因为到第一次检查位置时,它仍然没有被重定向。

编辑 charlietfl感到很困惑,我现在正在尝试使用resolve,但它甚至没有传递我的函数

我从拦截器中删除了以下代码:

else if ($location.path != '/accounts/login' && $location.path != '/accounts/register') {
    $location.path('/accounts/login');
}

并将新的添加service到身份验证模块:

.service('authCheckService', ['$http', '$q', 'localStorageService', function ($http, $q, localStorageService) {
    var self = {
        'onlyLoggedIn': function ($state, $q) {
            var deferred = $q.defer();
            var authData = localStorageService.get('authorizationData');
            console.log(authData);
            if (authData) {
                deferred.resolve();
            } else {
                deferred.reject();
                $state.go('login');
            }
            return deferred.promise;
        }
    }

    return self;
}]);

我试图称其为:

.state('smo-dashboard', {
        url: '/dashboard',
        templateUrl: '/Content/partials/dashboard.html',
        resolve: authCheckServiceProvider.onlyLoggedIn
})

请注意,我正在尝试登录authData var来检查其是否正常运行,但是没有,并且控制台上也没有错误。


问题答案:

最终弄清楚了如何使用“解决”来解决它。

首先,我完全删除了以前使用的拦截器。然后我在“路由”中创建了一个函数.config,用于每个人resolve的身份验证。终于处理了resolve我正在使用$stateChangeError的重定向到登录名state

路由配置

.config(function ($stateProvider, $urlRouterProvider) {

    // function to check the authentication //
    var Auth = ["$q", "authService", function ($q, authService) {
        authService.fillAuthData;
        if (authService.authentication.isAuth) {
            return $q.when(authService.authentication);
        } else {
            return $q.reject({ authenticated: false });
        }
    }];

    /* if the state does not exist */
    $urlRouterProvider
        .otherwise('/page-not-found');

    $stateProvider

        // state that allows non authenticated users //
        .state('home', {
            url: '/',
            templateUrl: '/Content/partials/home.html',
        })

        // state that needs authentication //
        .state('smo-dashboard', {
            url: '/dashboard',
            templateUrl: '/Content/partials/dashboard.html',
            resolve: {
                auth: Auth
            }
        })

        // errors //
         .state('page-not-found', {
             url: '/page-not-found',
             templateUrl: '/Content/partials/error/404.html'
         })

        // accounts //
        .state('login', {
            url: '/accounts/login',
            templateUrl: '/Content/partials/account/login.html'
        })

        // OTHER STATES //
    }
);

在MainController中

$scope.$on("$stateChangeError", function (event, toState, toParams, fromState, fromParams, error) {
    $state.go("login");
});


 类似资料:
  • 问题内容: 如果有人在未通过身份验证的情况下尝试打其他路线,如何重定向到登录页面?在AngularJS中是否有“最佳”方法来做到这一点? 似乎是一个常见问题,但我似乎找不到解决方法。预先感谢您的帮助。 问题答案: 最好的方法是设置一个“ $ routeChangeStart”侦听器,该侦听器检查“ authProvider”服务功能以验证是否有用户登录。在我们的“ app.js”或单独的文件中:

  • 在不生成Laravel默认身份验证控制器的情况下,我创建了自己的登录和注册控制器。 我的路线是这样的 用于登录 登记 一切都很好。现在我需要一件事。每当我放置中间件时,一个未经身份验证的用户将被重定向到我的自定义登录页面路由到。 如何做到这一点?

  • 我在auth中间件方面遇到了一些问题。我将中间件放在一个路由组中,并回滚了users表。我希望应用程序将我重定向到我的登录/搜索页面,但它没有这样做,它只是给了我“尝试获取非对象的属性”,它指的是我的仪表板视图中的函数(我不应该访问该函数)。 这是我的路线代码: 以下是我的观点: 另外,我不确定从数据库中删除用户是否意味着Laravel将自动删除用户会话。 谢谢你的帮助!

  • 试图阻止来宾用户的路由。当有人点击时,它将检查用户是否以管理员身份登录。如果admin然后它工作正常,如果代理然后它重定向到登录页面,但如果我作为访客用户点击链接,它不会将我重定向到登录页面,而是显示一些错误: 路由中的错误异常。php第53行:尝试获取非对象的属性。 这是我的路线。php文件:

  • 我正在使用ApacheShiro开发JSF应用程序。我用Shiro引诱用户,并将其重定向到主页。这没有问题。验证后,当我尝试访问登录页面时,它不会将我重定向到主页。即使已经有loggedin用户,我也可以再次登录。正如巴卢斯克在他的博客文章中提到的,我正在进行程序登录。 这个滤镜是根据博文写的。 } 问题是什么?如果用户已经通过身份验证,我该如何重定向用户? 编辑:现在,如果用户已经通过身份验证,

  • 我使用Laravel 5.2。我想问一个问题。如何更改重定向登录表单在laravel当我们已经做登录?我使用的是来自Php artisan make: auth的auth。 我已经登录并重定向到localhost:8000/admin 然后我再次打开localhost:8000/登录。它将重定向到“/”或localhost:8000/ 我的问题是如何将“/”更改为“/”管理员“?因此,即使我已经登