如何使用护照ldapauth登录时显示flash消息

时间:2016-08-02 13:14:20

标签: node.js passport.js locomotivejs

所以,我的应用程序通过ldap服务器使用登录。一旦通过身份验证,我就会在我的数据库上登录或创建用户,然后继续我的应用程序。

但是,当用户无法使用ldap(无效凭据或其他任何内容)登录时,我尝试显示Flash消息,但我无法按照文档所述的方式进行操作。

我使用机车js作为框架,所以我想继续使用这个路由:

routes.js

this.match('/', 'pages#homepage',{ via: 'GET' });   

this.match('login', passport.authenticate('ldapauth', {
  successRedirect : '/dashboard', 
  failureRedirect : '/', 
  failureFlash : true 
})  ,{ via: 'POST' });

pagesController.js

pagesController.homepage = function() {
  this.title = 'title';
  this.render('',{messageRedirect: this.req.flash('messageRedirect')});
};

.ejs

<% if (messageRedirect.length>0) { %>
    <div class="alert alert-danger"><%= messageRedirect %></div>
<% } %> 

passport.js

passport.use(new LdapStrategy( {

server: {
    url: config.ldap.url,
    bindDn:  config.ldap.bindDn,
    bindCredentials: config.ldap.bindCredentials,
    searchBase: config.ldap.searchBase,
    searchFilter: config.ldap.searchFilter,
    searchAttributes: config.ldap.searchAttributes,
    tlsOptions: {
        ca: [
            fs.readFileSync(config.ssl.cert)
        ],
        rejectUnauthorized: false
    }
}

}, function(ldapUser, done){

var queryUser = {...};

    user.getByUsername(queryUser, function(err,res){

        if (err) {
          return(err,null);
        }

        // if we don't find the user, it's his first attempt to login and we have to add him in the base
        if(res.length==0){

            user.create( queryUser, function(err,res){
                if (err){
                    return (err,null);
                }
            });

            var returnUser = {...};
            return done(null,returnUser,{
            message: 'Created and logged in Successfully'
            });

        }

        else{

            var returnUser = {...};
          return done(null, returnUser, {
            message: 'Logged In Successfully'
          });
        }
    });
   }
));

我遇到的问题是,如果ldap登录失败,则不会调用验证回调,因此我无法通过它显示登录失败。 闪存否则可以工作,因为它适用于其他几个页面。它甚至可以在此页面上运行(例如,当用户尝试访问未连接的页面时),但不是因为登录失败。 我尝试了很多其他的东西,但这是我唯一确定的部分。

我可以再次介绍&#39; /#39;显示错误的路线,但我想要ldap一个,这应该更准确。

1 个答案:

答案 0 :(得分:3)

passport-ldapauth在LDAP身份验证失败时设置消息,如果未定义类型,则Passport.js then puts the message to req.flash使用error作为密钥(passport-ldapauth就是这种情况)。< / p>

致电passport.authenticate时,您可customize the messages。如果使用Microsoft AD,您可以customize some additional messages

中提到的readme

因此,要获取失败消息,这应该有效:

this.render('', {
  messageRedirect : this.req.flash('messageRedirect'),
  messageLdapError : this.req.flash('error')
});