如果未经身份验证,请将用户重定向到登录页

Redirect users to login page if unauthenticated

本文关键字:重定向 用户 登录 身份验证 如果      更新时间:2023-09-26

我使用node.js restify作为后端,angularjs作为前端。

我有一个有3个网页的网站。这就是我想要的。每当任何用户访问这些网页时,如果他们没有经过身份验证,就会被重定向到登录页面。

我的做法是在每个网页上强制进行身份验证。角度控制器看起来是这样的;

.controller('LoginAuthentication', ['$scope', '$http', 'configuration', 'dialogs',
                function($scope, $http, $configuration, dialogs) 
{
    //alert("testing LoginAuthentication controller");        
    var url_check_user_logged_in = '127.0.0.1/users/check_loggedin';
    $http.get(url_check_user_logged_in).success(function(data, status, headers, config)
    {            
        if (data.LoggedInStatus === 'NotLoggedIn')
        {
        console.log('NotLogged');
        window.location.href=$configuration.webroot + "/app/login.html";
    }
    else if (data.LoggedInStatus === 'LoggedIn')
    {

           console.log('Logged');                
        }                
    });
}])//.controller('MyCtrl1', [function() 

angularjs有没有更有效的方法?这种方法违反了DRY(不要重复自己)原则,因为我必须在每个网页中重复相同的代码。

在loginCtrl.js 中放入以下代码

$scope.login = function(){
            if($scope.email === 'test@test.com' && $scope.password === "1234"){
                $cookies.isLogin = true;
                $cookies.put('isLogin', true);                    
                $state.go('home');
            }
            else
                $scope.error = "wrong credential";
        };

当登录成功时,它将存储cookie"isLogin"。

当$stateChangeStart函数的状态在app.js中更改时:

$rootScope.$on("$stateChangeStart", function (event, toState, toParams, fromState, fromParams) {
            if (toState && toState.secure) {
                if($cookies.get('isLogin')){
                    //do nothing
                }else{
                    $state.go("login");
                    event.preventDefault();
                }
            }
            if(toState.url == '/login' && $cookies.get('isLogin')) {
                $state.go("home");
                event.preventDefault();
            }
        });

所以在这里检查cookie。

我希望这能奏效。!

您可以使用Angular服务。或类似cookie/会话之前所述。

以下是Angular服务的链接sl:https://docs.angularjs.org/guide/services

首先添加工厂:

angular.module("myApp").factory('LoginService',function($location){
    var service={};
    service.loggedIn=function(){....}
    service.redirectIfNotLoggedIn=function(){
        if(! service.loggedIn())$location.path("/login");
    }
    return service;
})

然后对您拥有的每个页面调用LoginService.redirectIfNotLoggedIn()。另外,不要忘记完成service.loggedIn()方法,并将LoginService注入相应的Controllers

我上面给出的答案适用于简单、简单的系统。然而,我注意到你每次都在呼叫服务器(我说得对吗?)。如果您想要异步方法,可以将以下内容添加到LoginService:

service.loggedIn=false;
service.asyncAuthorize=function(cb,error){
    $http.get(url_check_user_logged_in).success(function(data){            
        if (data.LoggedInStatus === 'NotLoggedIn'){
            service.loggedIn=false;
            cb(false);
        }else if (data.LoggedInStatus === 'LoggedIn'){
           service.loggedIn=true;
            cb(true);
        }                
    }).error(function(data){
        if(! error) return;
        error(data);
    });
}

然后,您可以简单地调用LoginService.asyncAuthorize(cb)LoginService.asyncAuthorize(cb,fun),如果请求失败,它将接收回调。

cb参数是作为请求而执行的函数。如果用户已登录,则cb返回true,否则返回false。如果对服务器的请求失败,则调用error

控制器中的最终代码:

LoginService.asyncAuthorize(function(state){
    console.log(state , "is the login state");
   },function(e){
        console.log("could not contact server");
});