登录后不使用函数作为第二个参数的keystonejs重定向

时间:2017-09-27 18:36:20

标签: node.js express authentication redirect keystonejs

用例

我有一些前端的自定义表单,需要一个已登录的用户。 因此我使用keystone.js自己的“requireUser”中间件。 用户登录后,要访问该站点,默认行为是在“/ keystone”显示管理UI - 但是我想重定向回到上一个前端页面,因此用户可以开始填写表单。 / p>

什么有用

在keystone.js中,在名称完全相同的文件中,您可以设置

keystone.set('signin redirect', '/');

在登录后重定向到主页。

我需要什么

但是,我需要的是将url设置为动态重定向,但是当我这样做时,永远不会调用该函数:

keystone.set('signin redirect', function(req, res){
    var url = req.session.returnTo || '/';
    res.redirect(url);
});

req.session.returnTo参数在前面提到的“middleware.js”文件中设置,方法是从前端页面获取req.path属性:

exports.requireUser = function (req, res, next) {
if (!req.user) {
    req.flash('error', 'Please sign in to access this page.');
    req.session.returnTo = req.path;
    res.redirect('/keystone/signin');
} else {
    next();
}
};

我的临时解决方法

在keystone / admin / server / routes / signin.js中我扩展了locals对象的redirect属性

redirect: keystone.get('signin redirect'),

redirect: (typeof keystone.get('signin redirect') === 'string') ? 
keystone.get('signin redirect') : keystone.get('signin redirect')(req, res),

我知道这不是一个理想的解决方案,但由于我还在学习keystone.js,你知道更好的处理方法吗?

注意:设置“注销重定向”键(同时将字符串或函数作为第二个参数)时,相同的重定向策略也可以工作,所以我想这必须是忘记实现的东西吗?

由于

2 个答案:

答案 0 :(得分:1)

@hajn 关于Keystone项目的#1489问题,目前还没有理想的解决方案。文档没有正确地提供函数参数(我认为这是一个问题)。所以,我在3天前重新开启了这个问题。

答案 1 :(得分:0)

更改route / middleware.js替换方法exports.requireUser,如下所示:

/**
Prevents people from accessing protected pages when they're not signed in
*/
exports.requireUser = function (req, res, next) {

    if (!req.user) {

        req.flash('error', 'Please sign in to access this page.');

        if(req.url) {

            res.redirect('/keystone/signin?from='+req.url);

        } else {

            res.redirect('/keystone/signin');
        }

    } else {

        next();
    }
};

从指向/ keystone / signin的任何URL,在查询字符串中包含from参数,如下所示:

<a href="/keystone/signin?from=/">Log in</a>

<a href="/keystone/signin?from=/my/page/that/requires/login">Log in</a>