10

我有一个使用 Express 框架和http-auth模块设计的 node.js 应用程序,如下所示:

var auth = require('http-auth');
var express = require('express');
// ...
var mywebapp = express();
// ...
if (usebasicauth) {
  var basic = auth.basic({realm:"MyRealm", file:"/srv/config/passwd"});
  mywebapp.use(auth.connect(basic));
}

mywebapp.use('/js', express.static(__dirname + '/files/js'));
mywebapp.use('/css', express.static(__dirname + '/files/css'));
// ...

但是,我不想保护/jsand/css目录下可用的资产。这是我尝试做的:

if (usebasicauth) {
  var basic = auth.basic({realm:"MyRealm", file:"/srv/config/passwd"});
  mywebapp.use(function(req, res, next) {
    if (/^\/(css|js)/.test(req.url)) {
      next();
    }
    else {
      auth.connect(basic);
    }
  });
}

尝试访问下的 URL/css并按/js预期工作;但是,其他 URL 永远不会加载。

如何使其他 URL 按预期工作?

4

3 回答 3

12

的顺序mywebapp.use很重要。如果您有第一个mywebapp.use(auth.connect(basic));,那么它将用于每个请求,但如果您更改顺序,它将传递静态数据并仅用于它之后的任何内容。

中间件函数按添加顺序进行处理。

所以下面应该做你想做的事。

// no auth for statics
mywebapp.use('/js', express.static(__dirname + '/files/js'));
mywebapp.use('/css', express.static(__dirname + '/files/css'));
// auth reguired from here 
mywebapp.use(auth.connect(basic));

如果你把它放在mywebapp.use(auth.connect(basic));express.static 上面,它也会为它 reguire auth。

// auth reguired from here 
mywebapp.use(auth.connect(basic));
// auth required for statics as well
mywebapp.use('/js', express.static(__dirname + '/files/js'));
mywebapp.use('/css', express.static(__dirname + '/files/css'));
于 2015-12-26T17:58:22.077 回答
9

你也可以这样做https://gist.github.com/gevorg/7168d5f02c1ca5362b2a#file-specific-path-js

// Express module.
var express = require('express');

// Authentication module.
var auth = require('http-auth');
var basic = auth.basic({
    realm: "Simon Area.",
    file: __dirname + "/../data/users.htpasswd" // gevorg:gpass, Sarah:testpass ...
});

// Application setup.
var app = express();
app.use(function(req, res, next) {
    if ('/specific/path' === req.path) {
        next();
    } else {
        (auth.connect(basic))(req, res, next);
    }
});

// Setup route.
app.get('/', function(req, res){
  res.send("Hello from express - " + req.user + "!");
});

// Setup guest route.
app.get('/specific/path', function(req, res){
  res.send("Hello from express - guest!");
});

// Start server.
app.listen(1337);
于 2016-04-22T11:22:00.893 回答
3

这个问题的公认答案是不可取的,因为路线顺序可能很重要!

更好的方法是将 basic-auth 作为路由定义的第二个参数传递:

app.get('/admin', auth.connect(basic), (req, res) => {
    res.send(`Hello from admin area - ${req.user}!`);
});

或者

app.use('/admin', auth.connect(basic), myCustomRoute);
于 2018-11-08T18:02:19.570 回答