禁止使用AngularJs和Node.js/Express直接访问文件

禁止使用AngularJs和Node.js/Express直接访问文件,node.js,angularjs,express,routing,Node.js,Angularjs,Express,Routing,使用Angular和Node.js/Express,是否有办法防止直接访问我的partial.html文件,同时仍然允许以下路由处理: 我的角度路线如下所示: $stateProvider.state('albums', { url: '/albums', templateUrl: '/public/albums', controller: 'AlbumsCtrl' }); 然后,我的express应用程序执行以下操作: app.get('/public/albums', func

使用Angular和Node.js/Express,是否有办法防止直接访问我的partial.html文件,同时仍然允许以下路由处理:

我的角度路线如下所示:

$stateProvider.state('albums', {
  url: '/albums',
  templateUrl: '/public/albums',
  controller: 'AlbumsCtrl'
});
然后,我的express应用程序执行以下操作:

app.get('/public/albums', function(req, res){
  res.sendfile('views/partials/albums.html');
});
这一切正常,但键入“mysite.com/public/albums”允许访问partial.html文件。
由于内容是单独加载的,用户需要登录才能查看,但我仍然希望以某种方式阻止对该文件的访问。

使用AngularJS请求路径
/foo/bar
与输入URL
domain.com/foo/bar
相同

你不能阻止一个而允许另一个,因为最终它们是对服务器的请求

但是,您可以使用中间件防止未经授权的请求。 例如,仅当用户是管理员或仅当用户已登录时

因此,您可以在服务器中编写如下代码:

function ensureAuthenticated (request, response, next) {
    //Custom code - If request is authenticated
    return next();
    //if Not
    res.send(403, "Forbidden");
};

app.get('/public/albums', ensureAuthenticated, function (req, res) {
    //res.sendfile(filepath);
});

您可能自己找到了一个答案或不同的方法,但如果您想做类似的事情,实际上有一个解决方法:

想法 您可以使用httpRequestInterceptor在来自angular的所有请求上添加自定义头。 在服务器端,您只需检查请求是否包含该头。如果没有,则可以重定向或发送错误消息

代码 客户端(Angularjs): 创建拦截器:

myApp.factory('httpRequestInterceptor', function () {
    return {
        request: function (config) {
            config.headers['x-custom-header-name'] = 'something'
            return config
        }
    }
});
将拦截器添加到$httpProvider拦截器:

myApp.config( function ($httpProvider) {
    $httpProvider.interceptors.push('httpRequestInterceptor')
});
服务器端(node.js) 当您想要开始避免直接访问时,只需输入以下代码:

app.use(function (req, res, next) {
    if (!req.headers['x-custom-header-name']) {
        res.redirect('/'); //Or just do what you want to
    }
    next();
});
或者,如果您想避免仅在一条或某些路由上进行访问,则可以修改代码更改

app.use(function (req, res, next) ...

拦截器的代码来自此stackoverflow问题:


希望这能帮助到别人!再见

只是一点说明;拦截器代码仅适用于angular 1.1及以上版本
app.use( 'route/no-direct-access', function (req, res, next) ...