【问题标题】:How to use the middleware to check the authorization before entering each route in express?express 进入每条路由前如何使用中间件检查授权?
【发布时间】:2023-04-04 12:20:01
【问题描述】:

我想在我的网络应用程序用户输入网址时检查他们的授权。但是当我使用单独的中间件来检查授权时,对于已经存在的路由是没有用的,例如:

function authChecker(req, res, next) {
    if (req.session.auth) {
        next();
    } else {
       res.redirect("/auth");
    }
}

app.use(authChecker);
app.get("/", routes.index);
app.get("/foo/bar", routes.foobar);

authChecker 无法检查输入这两个网址的用户的权限。 它仅适用于未指定的网址。

我看到了一种方法,可以将 authChecker 放在路由和路由处理程序之间, 如:

app.get("/", authChecker, routes.index);

但是我怎样才能以一种简单的方式来实现它,而不是把 authChecker 放在每条路线上呢?

【问题讨论】:

    标签: node.js express middleware


    【解决方案1】:

    只要

    app.use(authChecker);
    

    之前
    app.use(app.router);
    

    每个请求都会调用它。但是,您会得到“重定向过多”,因为它被 ALL ROUTES 调用,包括 /auth。所以为了解决这个问题,我建议将函数修改为:

    function authChecker(req, res, next) {
        if (req.session.auth || req.path==='/auth') {
            next();
        } else {
           res.redirect("/auth");
        }
    }
    

    这样您也不会重定向到身份验证网址。

    【讨论】:

    • 它确实有效。非常感谢。我把 authChecker 放在静态中间件和 app.router 之间,所以它不会检查静态文件。
    【解决方案2】:

    有可能解决这个问题的方法,但这里是适合我的方法。

    我喜欢为受保护和不受保护的路由创建一组中间件,然后在必要时使用。

    var protected   = [authChecker, fetchUserObject, ...]
    var unprotected = [...]
    
    app.get("/", unprotected, function(req, res){
      // display landing page
    })
    
    app.get("/dashboard", protected, function(req, res){
      // display private page (if they get this far)
    })
    
    app.get("/auth", unprotected, function(req, res){
      // display login form
    })
    
    app.put("/auth", unprotected, function(req, res){
      // if authentication successful redirect to dashboard
      // otherwise display login form again with validation errors
    })
    

    这使得通过为每种类型的路由编辑数组来轻松扩展每个中间件范围的功能。它也让每条路由的功能更加清晰,因为它告诉我们它是什么类型的路由。

    希望这会有所帮助。

    【讨论】:

    • 路由多的情况下如何处理,在每条路由中都放一个protected/unprotected数组?
    【解决方案3】:

    但是当我使用单独的中间件来检查授权时,它对于已经存在的路由是没有用的

    Express 将按照添加到堆栈的顺序运行中间件。路由器是这些中间件功能之一。只要您在路由器之前将authChecker 放入堆栈,它就会被所有路由使用,一切都会正常工作。

    您很可能在 authChecker 之前拥有路由器,因为您在将 authChecker 放入堆栈之前定义了路由。确保将所有 app.use 调用放在对 app.getapp.post 等的任何调用之前,以避免 express 将路由器隐式注入中间件堆栈。

    【讨论】:

    • 顺序和我写的代码一样,authChecker只对未指定的url起作用,比如“/test”,它会重定向到“/auth” ,但是对于“/foo/bar”,它会直接显示页面...
    • 我试图将检查器放在app.use(app.router) 之前,它适用于每条路线,甚至是指定的路线,所以我无法获取任何页面,但“发生了太多重定向”
    猜你喜欢
    • 2012-07-13
    • 1970-01-01
    • 1970-01-01
    • 2020-12-15
    • 1970-01-01
    • 2017-05-30
    • 2021-02-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多