【问题标题】:Restricting access to all routes but one限制对除一条以外的所有路线的访问
【发布时间】:2013-06-10 06:50:51
【问题描述】:

我开始尝试使用 ExpressJS + AngularJS,但我遇到了压力。

我的目标是拥有一个登录页面和一个仪表板页面,并使用 Passport + MongoDB 对用户进行身份验证,如果凭据正确,将他重定向到仪表板页面。

我从 angular-express-seed 开始并对其进行了修改,因此我最终得到了前面提到的视图:

$routeProvider.
    when('/login', {
      templateUrl: 'partials/login',
      controller: 'LoginCtrl'
    }).
    when('/dashboard', {
      templateUrl: 'partials/dashboard',
      controller: 'DashboardCtrl'
    }).
    otherwise({
      redirectTo: '/login'
    });

我为每个部分视图提供服务:

app.get('/partials/:name', routes.partials);


exports.partials = function (req, res) {
  var name = req.params.name;
  res.render('partials/' + name);
};

除了我可以直接访问仪表板的部分(根本不需要登录)之外,登录系统工作正常。

所以我想在授予他访问仪表板(或任何其他区域)的访问权限之前,我需要确定用户是否经过身份验证。

我发现这个可以解决问题:

function ensureAuthenticated(req, res, next) {
  if (req.isAuthenticated()) { return next(); }
  res.redirect('/login');
}

我会在每个GET 上调用它来部分

app.get('/partials/:name', ensureAuthenticated, routes.partials);

这里最大的问题是登录视图也是局部的,我不希望ensureAuthenticated 在请求视图时运行。

当前在每个部分请求上调用 ensureAuthenticated 会使任何浏览器崩溃,没有任何错误。

到目前为止我尝试过的(但没有奏效):

function ensureAuthenticated(req, res, next) {
      if ( req.route.params.name !== 'login' && req.isAuthenticated() ) { return next(); }
      res.redirect('/login');
    }

还尝试使用自己的app.GET 调用登录视图,而不使用ensureAuthenticated,但不知何故,Angular 会关闭,甚至无法加载。

关于如何解决这个问题的任何想法?

提前致谢。

【问题讨论】:

    标签: angularjs node.js authentication express passport.js


    【解决方案1】:

    我不清楚ensureAuthenticated 的第一个(未修改)版本是崩溃您的浏览器,还是最后一个版本(您检查/partials/login),但无论如何,它不应该发生(如果“崩溃”是指“停顿”,这是 Express 没有发回响应的迹象)

    但作为替代方案,试试这个:

    app.get('/partials/login', routes.partials);
    app.get('/partials/:name', ensureAuthenticated, routes.partials);
    

    您的routes.partials 必须明确检查是否为登录路由调用它,因为在这种情况下name 参数将不存在于req.params 中。

    只是为了确保:您是否也有/login 的服务器端处理程序?否则res.redirect('/login') 将不起作用。

    【讨论】:

    • 添加 app.get('/partials/login', routes.partials);并使名称参数检查有效。我仍然有问题,我正在登录并转到我的仪表板,然后我正在清理会话 cookie 并刷新以查看它是否重定向到 /login。它确实显示了登录视图,但 url 仍然显示在 /dashboard 上,知道为什么吗?
    • 好的,它显示了登录视图,因为我已经在我的 /login 处理程序中返回了它。不应该 res.redirect('/login');重定向?而是转到我的 app.get('/login', routes.login);并返回 res.render('partials/login');
    • @mfreitas 重定向是在 AJAX 调用期间发送的,因为 Angular 正在请求部分。所以 AJAX 调用被重定向,而不是你的主页 url。
    • 是的,我只是错过了那部分......我将如何重定向到应用程序根目录“/”?
    • @mfreitas 我认为在加载模板期间没有简单的方法可以做到这一点。您可以在仪表板路由上使用resolve 来调用服务器以检查用户是否在路由被接受之前登录。
    【解决方案2】:

    我不认为在 XHR 请求上重定向服务器端是一个好习惯。如果用户未获得授权,XHR 请求应返回 401,并且客户端(Angular)应采取显示通知消息并将用户重定向到登录部分的操作。查看this project 处理此类请求。有demoblog post

    【讨论】:

      猜你喜欢
      • 2019-04-15
      • 2023-01-19
      • 1970-01-01
      • 1970-01-01
      • 2023-03-21
      • 2011-11-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多