diff --git a/http/routing.hpp b/http/routing.hpp
index e86c774..5bf6c90 100644
--- a/http/routing.hpp
+++ b/http/routing.hpp
@@ -1335,7 +1335,7 @@
     }
 
     template <typename CallbackFn>
-    void afterGetUserInfo(Request& req,
+    void afterGetUserInfo(Request&& req,
                           const std::shared_ptr<bmcweb::AsyncResp>& asyncResp,
                           BaseRule& rule, CallbackFn&& callback,
                           const boost::system::error_code& ec,
@@ -1356,26 +1356,30 @@
             asyncResp->res.result(boost::beast::http::status::forbidden);
             return;
         }
-        callback();
+        callback(std::move(req));
     }
 
     template <typename CallbackFn>
-    void validatePrivilege(Request& req,
+    void validatePrivilege(Request&& req,
                            const std::shared_ptr<bmcweb::AsyncResp>& asyncResp,
                            BaseRule& rule, CallbackFn&& callback)
     {
+        if (req.session == nullptr)
+        {
+            return;
+        }
+        std::string username = req.session->username;
         crow::connections::systemBus->async_method_call(
-            [this, &req, asyncResp, &rule,
+            [this, req{std::move(req)}, asyncResp, &rule,
              callback(std::forward<CallbackFn>(callback))](
                 const boost::system::error_code& ec,
                 const dbus::utility::DBusPropertiesMap& userInfoMap) mutable {
-            afterGetUserInfo(req, asyncResp, rule,
+            afterGetUserInfo(std::move(req), asyncResp, rule,
                              std::forward<CallbackFn>(callback), ec,
                              userInfoMap);
             },
             "xyz.openbmc_project.User.Manager", "/xyz/openbmc_project/user",
-            "xyz.openbmc_project.User.Manager", "GetUserInfo",
-            req.session->username);
+            "xyz.openbmc_project.User.Manager", "GetUserInfo", username);
     }
 
     template <typename Adaptor>
@@ -1426,11 +1430,12 @@
 
         // TODO(ed) This should be able to use std::bind_front, but it doesn't
         // appear to work with the std::move on adaptor.
-        validatePrivilege(req, asyncResp, rule,
-                          [&rule, &req, asyncResp,
-                           adaptor(std::forward<Adaptor>(adaptor))]() mutable {
-            rule.handleUpgrade(req, asyncResp, std::move(adaptor));
-        });
+        validatePrivilege(
+            std::move(req), asyncResp, rule,
+            [&rule, asyncResp, adaptor(std::forward<Adaptor>(adaptor))](
+                Request&& thisReq) mutable {
+            rule.handleUpgrade(thisReq, asyncResp, std::move(adaptor));
+            });
     }
 
     void handle(Request& req,
@@ -1498,11 +1503,11 @@
             rule.handle(req, asyncResp, params);
             return;
         }
-
-        validatePrivilege(req, asyncResp, rule,
-                          std::bind_front(&BaseRule::handle, std::ref(rule),
-                                          std::ref(req), asyncResp,
-                                          std::ref(params)));
+        validatePrivilege(
+            std::move(req), asyncResp, rule,
+            [&rule, asyncResp, params](Request&& thisReq) mutable {
+            rule.handle(thisReq, asyncResp, params);
+            });
     }
 
     void debugPrint()
