在Express和Nodejs中限制路由到静态文件

5

我目前正在尝试限制未登录用户的路由。我的主要问题是,即使我定义了一个使用GET方法的页面:

 app.get('/alpha/information', isLoggedIn,
        function(req, res){
            res.sendFile(path.join(__dirname + '/alpha/pages/Example.html'));
        });

用户可以轻松地编辑URL:http://localhost:3000/alpha/pages/Example.html并访问该页面。我已经在SO上阅读了几个类似的问题,但是我找不到答案。其中一些启发我的问题是:Q1Q2Q3。尽管如此,我仍然无法找到解决我的问题的方法。
我的当前文件结构是: FileStructureLink 我试图限制对Example.html、ExampleTwo.htmlblabla.html的访问。
我使用以下代码来设置请求,但我猜它们可能不正确:
app.use(express.static(path.join(__dirname, 'Alpha')));
app.use(express.static(path.join(__dirname, '/')));
app.use('/', express.static(__dirname + '/login.html'));

这个 app.use('/', express.static(__dirname + '/login.html')); 特别是用来让默认的 localhost:3000/ 载入为 localhost:3000/login

我如何限制访问所有静态html文件而不必为每一个编写路由?

中间件函数:

function isLoggedIn(req, res, next) {
        console.log('here is Authenticated', req.isAuthenticated())
        if (req.isAuthenticated()){
            return next();
        }
        res.redirect('/login');
    }

您可以在任何其他路由(甚至静态文件)之前添加全局身份验证中间件函数,以防止未登录访问。 - Mohit Bhardwaj
你如何确定用户是否已登录?如果你知道,你可以在express.static中间件之前使用中间件。 - Zeeshan Hassan Memon
@ZeeshanHassanMemon 看看文件夹结构,这就是我如何适应登录系统的方式。我只需要通过路由限制访问静态HTML文件。中间件函数已更新。 - coderJoe
@coderJoe,请查看我的答案,其中包括完整的工作和经过测试的node-cheat,如果它对您有用,请标记答案为正确。 - Zeeshan Hassan Memon
Zeeshan Hassan提供的答案并不是针对特定问题量身定制的。 - ZombieChowder
3个回答

11
你可以通过将另一个中间件附加到其中来限制你的 express 静态中间件。
var express = require("express");
var path = require( "path" );
var app = express();

function isLoggedIn( req, res, next ) {
   console.log("trying restricted file");
   next();
}

app.use( '/Alpha', isLoggedIn, express.static( path.join( __dirname, 'Alpha' ) ) );
app.use( express.static( path.join( __dirname, 'anonymous' ) ) );

app.listen( 3000 );
每次调用localhost:3000/restricted/*时,将通过isLoggedIn函数进行验证。
编辑:根据您的文件结构修改代码。

1
这是一个关于如何做到这一点的概念:

var express = require('express'),
    path = require('path');
    app = express();

app.use(function(req, res, next) {
    // Use your req.isAuthenticated logic here, that's all
    console.log('I am called before static middleware.');
    return next();
});
app.use(express.static( path.join(__dirname, 'public')));
app.use(function(req, res, next) {
    console.log('I am called after static middleware.');
    return next();
});

app.get('/', showClientRequest, function(req, res) {
    res.send('Hi! I am direct message from server :)');
});

function showClientRequest(req, res, next) {
    console.log('You can do something here too...');
    return next();
}

app.listen(3000);

完整的存储库:

克隆 node-cheat express_server_restrict_static_files,运行node app,然后运行npm install express

愉快的帮助!


0

您正在将完整的Alpha目录设置为公共目录,因此所有内容都可以访问。这种技术通常用于提供js/css/images。

您可以利用变量路由来获取html文件:

url: localhost:3000/alpha/Example

app.get('/alpha/:name', function(req, res) {
    var page = req.params.name;
    res.sendFile(path.join(__dirname + '/alpha/pages/' + page + '.html'));
})

注意大小写


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接